使用defuns更改全局变量

时间:2012-03-15 00:00:06

标签: common-lisp


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

示例来自sbcl


  • (defparameter foo“foo”)

FOO

  • FOO

“foo” 的

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

BAR

  • (bar foo)

“foo”
3
3

  • FOO

“foo” 的

1 个答案:

答案 0 :(得分:5)

是。您可以使用setfdocumented 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