Common lisp 使用defuns更改全局变量

Common lisp 使用defuns更改全局变量,common-lisp,Common Lisp,有没有办法在公共lisp change全局变量中进行定义?在下面的示例中,是否有任何方法可以使foo在函数内部具有值3 这个例子来自sbcl (def参数foo“foo”) 福 福 “福” (除油杆(y) (宣布(特别y)) (打印y) (setf y 3) (打印y)) 酒吧 (巴富) “foo” 3 3 福 “foo”是的。您可以使用setf()设置所有变量的值,包括全局变量。例如: (defparameter foo "foo") ; => FOO (defun


有没有办法在公共lisp change全局变量中进行定义?在下面的示例中,是否有任何方法可以使foo在函数内部具有值3

这个例子来自sbcl


  • (def参数foo“foo”)

“福”

  • (除油杆(y)
    (宣布(特别y))
    (打印y)
    (setf y 3)
    (打印y))
酒吧

  • (巴富)
“foo”
3
3


“foo”是的。您可以使用
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 ; => 1

对。您可以使用
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 ; => 1

那么有没有办法把一个全局变量传递给一个函数,然后让这个函数改变这个特定的全局参数呢?更新答案,有帮助吗?有帮助。谢谢你帮助我。如何通过价值传递和引用传递是一个常见的问题。此答案显示(设置sym值),当sym作为符号传递到函数中时,处理通过引用传递的问题,并允许函数修改传递的变量。(这里的评论帮助谷歌找到这个答案)。那么有没有办法把一个全局变量传递给一个函数,然后让这个函数改变那个特定的全局参数呢?更新答案,有帮助吗?有帮助吗。谢谢你帮助我。如何通过价值传递和引用传递是一个常见的问题。此答案显示(设置sym值),当sym作为符号传递到函数中时,处理通过引用传递的问题,并允许函数修改传递的变量。(这里的评论有助于谷歌找到这一回应)。