在TSPL 3.2中我们发现:
(letrec ((even?
(lambda (x)
(or (= x 0)
(odd? (- x 1)))))
(odd?
(lambda (x)
(and (not (= x 0))
(even? (- x 1))))))
;; (list (even? 20) (odd? 20))) => (#t #f)
但是同一个程序,如果用
let
代替letrec
,仍然可以在ChezScheme中运行:
(let ((even?
(lambda (x)
(or (= x 0)
(odd? (- x 1)))))
(odd?
(lambda (x)
(and (not (= x 0))
(even? (- x 1))))))
这是 Chez 的错误吗? TSPL不会错的。谢谢!
内置的方案功能
even?
和odd?
在let
版本中被调用。使用不同的名称,你会得到一个错误:
(let ([my-even?
(lambda (x)
(or (= x 0)
(my-odd? (- x 1))))]
[my-odd?
(lambda (x)
(and (not (= x 0))
(my-even? (- x 1))))])
(list (my-even? 20) (my-odd? 20)))
会失败。将其更改为
letrec
它会起作用,因为您的函数将在其定义的主体范围内。