【发布时间】:2015-04-05 18:31:01
【问题描述】:
据我了解,Common Lisp 没有全局词法范围,所以如果你想创建一个全局变量,你必须使用defvar 而不是setq。我正在尝试创建一个自动执行此操作的宏,即我想写
(= x 1)
无论我在哪里,都让它“正常工作”。我想宏看起来像
(defmacro = (name value)
`(,(if (is-global) 'defvar 'setf) ,name ,value))
我怎么写is-global?
【问题讨论】:
-
SETF 不创建变量,甚至不创建局部变量。
-
“作为一名程序员,我对必须记住这一点感到非常愤慨。”这是关于变量声明的。这类似于说您根本不想编写变量声明/绑定,并且只接受一个值数组作为函数的参数(例如,
(defun frob-the-bar (&rest args) ...))。我宁愿(defun frob-the-bar (frobber bar &key frobulator) ...)和 know 论点。在 Common Lisp 中,全局变量几乎总是被“耳罩”(即周围的星号,例如 *standard-output*)包围,因此您确实通常知道哪种类型您拥有的变量。 -
(= x 1)确实“正常工作”。它返回x是否为 1。
标签: macros scope lisp common-lisp