Lisq范围问题与setq?

-2 lisp scope

我是lisp的菜鸟,只用了两个星期左右......

我用setq声明了一些全局变量: (setq myvar '(WHATEVER))

和一个应该修改我告诉它的变量的函数:

(defun MYFUN (varname)
  (setq varname '(POOP))
)
Run Code Online (Sandbox Code Playgroud)

但是当我拨打电话时:(MYFUN 'myvar) 并检查myvar现在的值,它仍然是(WHATEVER)如何进行MYFUN持久性更改?

Vat*_*ine 5

没有"用setq声明一个全局变量",只有"用setq设置一个变量的值",如果你在顶级词汇环境中这样做,结果是有趣的定义不足.

如果你看一下变量varname包含的内容,它可能就是列表(poop).

此外,结尾处的"q" setq实际上意味着"引用"(即,setq特殊形式不会评估第一个(以及第三个和第五个......)参数,但会对第二个(和第四个)进行评估.和第六...).

从历史上看,这是一种方便,(set (quote var) value)而不是方便(setq var value).但是,(set var value)具有完全相同的效果(setf (symbol-value var) value),您应该使用它.