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来运行此代码?谢谢
您需要使用define
或lambda
绑定变量。例如:
(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。
所有这些都在奎尼内克的书中得到了解释。继续阅读!