使用defuns更改全局变量

Rav*_*sai 1 common-lisp


有没有办法在common-lisp中修改全局变量?在下面的例子中,有没有办法让foo从函数内部获得值3?

这个例子来自sbcl


  • (defparameter foo"foo")

FOO

  • FOO

"富"

  • (defun bar (y) (declare (special y)) (print y) (setf y 3) (print y))

酒吧

  • (酒吧foo)

"foo"
3
3

  • FOO

"富"

Hug*_*ugh 6

是.您可以使用setf(此处记录)来设置所有变量的值,包括全局变量.例如:

(defparameter foo "foo") ; => FOO
(defun bar () (setf foo 3)) ; => BAR
foo ; => "foo"
(bar) ; => 3
foo ; => 3
Run Code Online (Sandbox Code Playgroud)

你的函数没有改变值的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
Run Code Online (Sandbox Code Playgroud)

请注意,这不一定是设置全局变量:

(defparameter baz 1)
(let ((baz 2))
  baz ; => 2
  (bar 'baz)
  baz) ; => 3
baz ; => 1
Run Code Online (Sandbox Code Playgroud)