我正在编写一个 Lisp(代码位于 GitHub)并且我想实现本地绑定(bind)。目前我有两种语法:
(let <var> <val> <expr>)
用于绑定(bind)单个变量或函数,以及
(with (<var1> <val1> ... <varN> <valN>) <expr>)
一次绑定(bind)多个值。
目前,绑定(bind)是按顺序计算的,每个新的函数绑定(bind)都保留了它定义的环境的副本,所以<var2>
可以引用<var1>
但反之则不然。
我想修改代码,以便在一次绑定(bind)多个值时有效地同时绑定(bind)。例如,我希望能够写(这是一个简单的例子,但它应该说明这个想法):
(define (h y)
(with ((f x) (if (eq? x 0) #t (g (- x 1)))
(g x) (if (eq? x 0) #f (f (- x 1))))
(f y))
目前此代码未运行 - g
关闭f
,但反之则不然。
在 Lisp 中是否有一种规范的方式来实现同时绑定(bind)?
最佳答案
在SICP有一个关于 internal definitions 的部分其中涵盖了这个主题。特别是,练习 4.16、4.18、4.19 告诉您如何实现不同的策略来实现同步定义。
语法有点不同,但书中的思想归结为转换这段代码:
(lambda <vars>
(define u <e1>)
(define v <e2>)
<e3>)
进入这段代码:
(lambda <vars>
(let ((u '*unassigned*)
(v '*unassigned*))
(set! u <e1>)
(set! v <e2>)
<e3>))
同样的想法适用于您的 with
特殊形式。查看链接的书以了解更多实现细节。
关于lisp - 实现同时绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10272001/