有没有办法在common-lisp中修改全局变量?在下面的例子中,有没有办法让foo从函数内部获得值3?
示例来自sbcl
FOO
“foo” 的
(defun bar (y)
(declare (special y))
(print y)
(setf y 3)
(print y))
BAR
“foo”
3
3
“foo” 的
答案 0 :(得分:5)
是。您可以使用setf
(documented here)来设置所有变量的值,包括全局变量。例如:
(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 ; => 1