Hei*_*ang 2 lisp scope common-lisp
我正在使用动态变量,让我们调用其中*x*一个值为10.
我想通过将变量的名称作为参数传递来通过函数调用来更改其值:
(defun change-value (varname)
(setf varname 20))
Run Code Online (Sandbox Code Playgroud)
然后打电话(change-value *x*).如果我理解正确,varname采取局部范围,因此setf外面没有影响change-value.所以,*x*之后仍然是10.
我的问题是,有没有办法*x*通过类似于上面的函数调用等于20?我尝试添加(proclaim '(special varname)),(declare (special varname))他们似乎什么也没做.
哦,定义一个宏会或多或少地做我想要的,但我怀疑这是好的做法:
(defmacro change-value-macro (varname)
`(setf ,varname 20))
(change-value-macro *x*)
Run Code Online (Sandbox Code Playgroud)
定义
(defparameter *x* 10)
(defun change-value (varname) ; the argument name is misleading!
(setf varname 20))
Run Code Online (Sandbox Code Playgroud)
并且调用(change-value *x*)不会给你买任何东西,因为它change-value是一个函数而你只是将它10作为参数传递给它; 它不知道*x*是否涉及.因此,该函数所做的是修改变量的局部绑定varname,将其更改10为20并返回后者.
您需要传递symbol(变量名称)本身:
(defun change-value (varname)
(setf (symbol-value varname) 20))
Run Code Online (Sandbox Code Playgroud)
并将其称为(change-value '*x*)(注意'之前的引号*x*).