"设置"功能

dav*_*ugh 0 common-lisp dynamic-binding lexical-scope

我很难理解一些具有更多经验的人可能理解的代码的工作原理:

(let ((x 0))
  (loop for var in '(x)
    do (set var 3))
  x)
Run Code Online (Sandbox Code Playgroud)

我的期望是表达式应该返回3,x的新值,但它实际上返回0.为什么x没有被重置?是否有另一种方法来迭代变量列表并为它们赋值?

Rai*_*wig 7

不支持使用符号访问词法变量.

Common Lisp不允许您通过符号访问词法变量.默认情况下,变量是词法绑定的.

特殊变量使用动态绑定.

它适用于使用动态绑定的特殊变量:

CL-USER 14 > (let ((x 0))
                (declare (special x))
                (loop for var in '(x) do (set var 3))
                x)
3
Run Code Online (Sandbox Code Playgroud)

或者,您可以声明一个全局特殊变量,特殊声明扩展到let绑定.这也是为什么用命名约定在视觉上标记它们的原因.我们写但*foo*不是foo.

CL-USER 15 > (defvar *x123* 0)
*X123*

CL-USER 16 > (let ((*x123* 1))
               (loop for var in '(*x123*) do (set var 3))
               *x123*)
3
Run Code Online (Sandbox Code Playgroud)