有没有办法将名为 let 的宏实现为使其与 Petrofsky let 一起工作

问题描述 投票:0回答:1

我有用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中是否可以做到这一点。

scheme
1个回答
0
投票

我想出了这个实现:

(let ((#:args (list (- 1))))
  (letrec ((- (lambda (n) n)))
    (apply - #:args)))

其中

#:args
是不能出现在用户代码中的唯一值。就我而言,它是一个 gensym。

© www.soinside.com 2019 - 2024. All rights reserved.