Prog 不能在 <<Lisp 的第 113 页上以小块的形式运行>>



Lisp in small pieces第113页的代码似乎无法在球拍的r5rs环境中运行:

(let ((name "Hemo"))
(set! winner (lambda () name))
(set! set-winner! (lambda (new-name) (set! name new-name) name ))
(set-winner! "Me")
(winner) )

和:

(let ((name "Nemo"))
(set! winner (lambda () name))
(winner) )

两者都出现错误:

cannot set variable before its definition
variable: winner

这本书的代码错了吗?或者我不应该使用scheme?我必须使用本书定义的lisp来运行此代码?谢谢

您需要使用definelambda绑定变量。例如:

(let ((name "Hemo"))
(define winner #t)
(define set-winner! #t)
(set! winner (lambda () name))
(set! set-winner! (lambda (new-name) (set! name new-name) name ))
(set-winner! "Me")
(winner) )

set!被转换为一个scode,其语义是改变内存的一个位置,而不是绑定新的位置。像let这样的形式是两种操作(绑定+突变(组合的语法糖,因为它们非常常见,Queinnec为这种组合插入了一个scode fixlet。

所有这些都在奎尼内克的书中得到了解释。继续阅读!

最新更新