首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用defuns更改全局变量

使用defuns更改全局变量
EN

Stack Overflow用户
提问于 2012-03-15 00:00:05
回答 1查看 1.4K关注 0票数 1

有什么方法可以使一个共同的lisp改变全局变量吗?在下面的示例中,是否有任何方法使foo从函数内部具有值3?

这个例子来自sbcl。

  • (非参数foo "foo")

FOO

  • foo

“福”

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

条形

  • (foo酒吧)

“福”

3.

3.

  • foo

“福”

EN

回答 1

Stack Overflow用户

发布于 2012-03-15 02:13:26

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

代码语言:javascript
运行
复制
(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,就会得到:

代码语言:javascript
运行
复制
(defparameter foo "foo")
(defun bar (sym) (set sym 3))
foo ; => "foo"
(bar 'foo)
foo ; => 3

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

代码语言:javascript
运行
复制
(defparameter baz 1)
(let ((baz 2))
  baz ; => 2
  (bar 'baz)
  baz) ; => 3
baz ; => 1
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9712149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档