我有用JavaScript编写的Scheme解释器。并命名为 let 宏,用 lambda 表达式扩展为
letrec
。但问题是彼得罗夫斯基让
(test.failing "std: Petrofsky let"
(lambda (t)
(t.is (let - ((n (- 1))) n) -1)))
它扩展为:
(letrec ((- (lambda (n) n))) (- (- 1)))
有没有一种方法可以实现命名let作为方案代码,适用于Petrofsky let和return
-1
?或者我需要实现命名 let 作为 JavaScript 中的基本构造吗?
我可能会用 JavaScript 实现它,因为命名的 let 是一种不假思索地快速添加的。但我还是想知道在Scheme中是否可以做到这一点。
我想出了这个实现:
(let ((#:args (list (- 1))))
(letrec ((- (lambda (n) n)))
(apply - #:args)))
其中
#:args
是不能出现在用户代码中的唯一值。就我而言,它是一个 gensym。