lisp - 实现同时绑定(bind)

标签 lisp scheme

我正在编写一个 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/

相关文章:

Clojure 字符串返回值

python - python->scheme转换的问题

recursion - 嵌套平方根递归

scheme - 数据定义 DrRacket?

error-handling - 如何在方案中实现try-catch block ?

c - 新手同时学习 C 和 Scheme 会被认为是不好的做法吗?

namespaces - 为什么有多个命名空间?

lisp - 在 Lisp 中一次定义 n 个函数

lisp - 如何让 defun 接受一个列表作为它的参数

netbeans - 如何在 NetBeans IDE 中调试 Clojure?