2012-03-15 75 views
1


有什么办法,使在共口齿不清改变全局变量defun定义的全局变量?在下面的例子中,有没有什么办法可以让foo在函数内部具有值3?更改使用defuns

的示例是从SBCL


  • (defparameter FOO “foo” 的)

FOO

  • FOO

“foo” 的

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

BAR

  • (巴富)

“foo” 的

“FOO”

回答

5

是。您可以使用setfdocumented here)来设置所有的变量,包括全球的人的价值。例如:

(defparameter foo "foo") ; => FOO 
(defun bar() (setf foo 3)) ; => BAR 
foo ; => "foo" 
(bar) ; => 3 
foo ; => 3 

的功能并没有改变的foo值的原因是因为你setf形式设置的y而非foo值。

编辑:

啊,我想我明白你想在这里做什么。您可以使用set函数来执行此操作; (大致)相当于(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 
+0

那么,有没有办法通过一个全球性的变量的函数,然后让该函数改变该特定的全局参数? – 2012-03-15 16:39:43

+0

更新的答案,有帮助吗? – Hugh 2012-03-16 01:30:44

+0

这确实有帮助。谢谢你帮助我。 – 2012-03-16 18:23:11