了解 LISP 中的绑定变量和自由变量
Understanding bound and free variables in LISP
我正在阅读 SICP,关于绑定变量和自由变量的主题已经出现。但是,我对此感到困惑。术语 "bound variables" 是否仅适用于作为形式参数的变量?另外,文中说一个程序定义"binds"它的形式参数。这让我感到困惑,因为有些人说我们 "bind" 一个变量的值。显然,当我们谈论不同类型的变量时,这个术语似乎意味着不同的东西。有人可以弄清楚绑定变量是什么以及绑定意味着什么吗?最后,与绑定变量相比,什么是自由变量?所有这些与范围有什么关系?
只有两种类型的变量。全球和词汇。您实际上可以将 global 视为词法范围的可变根,在这种情况下,只有一种类型的变量。
绑定变量是当前过程的形式参数,其他所有内容,无论是全局的还是从以前的嵌套调用绑定的,都是自由变量。
示例:
(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
在以 y
作为绑定变量的内部 lambda 中,+
和 x
是自由的。在外层 lambda 中,x
是绑定的,+
是自由的。 +
可能是全局的。
我正在阅读 SICP,关于绑定变量和自由变量的主题已经出现。但是,我对此感到困惑。术语 "bound variables" 是否仅适用于作为形式参数的变量?另外,文中说一个程序定义"binds"它的形式参数。这让我感到困惑,因为有些人说我们 "bind" 一个变量的值。显然,当我们谈论不同类型的变量时,这个术语似乎意味着不同的东西。有人可以弄清楚绑定变量是什么以及绑定意味着什么吗?最后,与绑定变量相比,什么是自由变量?所有这些与范围有什么关系?
只有两种类型的变量。全球和词汇。您实际上可以将 global 视为词法范围的可变根,在这种情况下,只有一种类型的变量。
绑定变量是当前过程的形式参数,其他所有内容,无论是全局的还是从以前的嵌套调用绑定的,都是自由变量。
示例:
(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
在以 y
作为绑定变量的内部 lambda 中,+
和 x
是自由的。在外层 lambda 中,x
是绑定的,+
是自由的。 +
可能是全局的。