有什么方法可以使一个共同的lisp改变全局变量吗?在下面的示例中,是否有任何方法使foo从函数内部具有值3?
这个例子来自sbcl。
FOO
“福”
(defun bar (y) (declare (special y)) (print y) (setf y 3) (print y))条形
“福”
3.
3.
“福”
发布于 2012-03-15 02:13:26
是。您可以使用setf (记录在这里)来设置所有变量的值,包括全局变量。例如:
(defparameter foo "foo") ; => FOO
(defun bar () (setf foo 3)) ; => BAR
foo ; => "foo"
(bar) ; => 3
foo ; => 3您的函数之所以没有更改foo的值,是因为您的setf表单设置的是y而不是foo的值。
编辑:
啊,我想我知道你想做什么了。您可以使用set函数来完成这一任务;(setq alpha "beta") (大致)相当于(set 'alpha "beta")。因此,如果我们将函数更改为使用set,就会得到:
(defparameter foo "foo")
(defun bar (sym) (set sym 3))
foo ; => "foo"
(bar 'foo)
foo ; => 3不过,请注意,这并不一定是设置全局变量:
(defparameter baz 1)
(let ((baz 2))
baz ; => 2
(bar 'baz)
baz) ; => 3
baz ; => 1https://stackoverflow.com/questions/9712149
复制相似问题