Prog 不能 运行 在 <<Lisp in small pieces>> 第 113 页

Prog can't run on page 113 of <<Lisp in small pieces>>

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。

这些都在Queinnec 的书中有解释。继续阅读!