我正在编写一个 Lisp(GitHub 上的代码),我想实现本地绑定。目前我有两种语法:
(let <var> <val> <expr>)
用于绑定单个变量或函数,以及
(with (<var1> <val1> ... <varN> <valN>) <expr>)
一次绑定多个值。
目前,绑定是按顺序评估的,每个新的函数绑定都保留了它定义的环境的副本,因此<var2>
可以引用<var1>
但反之不行。
我想修改代码,以便在一次绑定多个值时有效地同时绑定。例如,我希望能够编写(这是一个简单的例子,但它应该说明这个想法):
(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 中实现同时绑定?