gpt4 book ai didi

scope - 如何通过函数调用有效地对动态变量使用 setf?

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:55 27 4
gpt4 key购买 nike

我正在使用动态变量,让我们调用其中一个值为 10 的 *x*

我想通过将变量名作为参数传递给函数调用来更改它的值:

(defun change-value (varname)
(setf varname 20))

然后调用 (change-value *x*)。如果我理解正确的话,varname 是本地作用域,因此 setfchange-value 之外没有影响。因此,*x* 之后仍为 10。

我的问题是,有没有办法通过类似于上面的函数调用让*x*等于20?我尝试添加 (proclaim '(special varname))(declare (special varname)) 但它们似乎什么也没做。

哦,定义一个宏或多或少做了我想要的,但我怀疑这是不是一个好习惯:

(defmacro change-value-macro (varname)
`(setf ,varname 20))

(change-value-macro *x*)

最佳答案

定义

(defparameter *x* 10)
(defun change-value (varname) ; the argument name is misleading!
(setf varname 20))

调用 (change-value *x*) 不会给你带来任何好处,因为 change-value 是一个函数,而你只是传递了它 10 作为参数;它不知道涉及 *x*。因此,该函数所做的是修改变量 varname 的本地绑定(bind),将其从 10 更改为 20 并返回后者。

您需要传递符号(变量名)本身:

(defun change-value (varname)
(setf (symbol-value varname) 20))

并将其命名为 (change-value '*x*)(注意 *x* 之前的引号 ')。

关于scope - 如何通过函数调用有效地对动态变量使用 setf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17328288/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com