理解LISP中的绑定和自由变量

时间:2015-07-25 20:23:22

标签: scope lisp sicp

我正在阅读 SICP ,并且出现了绑定和自由变量的主题。但是,我很困惑。术语“绑定变量”是否仅适用于作为形式参数的变量?此外,文本说过程定义“绑定”其形式参数。这让我感到困惑的是,有些人说我们将一个值“绑定”到一个变量。显然,当我们谈论不同类型的变量时,这个术语似乎意味着不同的东西。有人可以清除绑定变量是什么以及绑定意味着什么?最后,与绑定变量相比,什么是自由变量?所有这些与范围有什么关系?

1 个答案:

答案 0 :(得分:4)

只有两种类型的变量。全球性和词汇。实际上,您可以将全局视为词法范围的可变根,并且在这种情况下,只有一种类型的变量。

绑定变量是当前过程的形式参数,其他一切都是全局的或者是从以前的嵌套调用绑定的,都是自由变量。

示例:

(lambda (x)
  (let ((y (+ x x))) ; + is free x is bound
    (+ x y)))        ; + and x is free, y is bound

记住let是句法糖,所以它真的与此相同:

(lambda (x)
  ((lambda (y)
     (+ x y)) ; + and x is free, y is bound
   (+ x x)))  ; + is free x is bound

在内部lambda中y作为绑定变量+x是免费的。在外部lambda x被绑定,+是免费的。 +可能是全球性的。