我知道 Common Lisp 对函数和变量有不同的绑定环境,但我相信它还有另一个用于标签体标签的绑定环境。还有比这更多的绑定环境吗?如果是这样,那么将 Common Lisp 归类为 Lisp-2 是否公平?
这些问题并不意味着迂腐或自行车脱落,我只是想更好地了解 Common Lisp 并希望能获得一些指示,了解在哪里更深入地研究它的规范。
我知道 Common Lisp 对函数和变量有不同的绑定环境,但我相信它还有另一个用于标签体标签的绑定环境。还有比这更多的绑定环境吗?如果是这样,那么将 Common Lisp 归类为 Lisp-2 是否公平?
这些问题并不意味着迂腐或自行车脱落,我只是想更好地了解 Common Lisp 并希望能获得一些指示,了解在哪里更深入地研究它的规范。
我知道 Common Lisp 对函数和变量有不同的绑定环境,
根据HyperSpec ,这将是namespaces:
命名空间 n. 1. 外延仅限于特定种类的绑定。
The bindings of names to tags is the tag namespace.'' 2. any mapping whose domain is a set of names.
一个包定义了一个命名空间。''
(第 1 点。)
但我相信它还有另一个标签体标签的绑定环境。还有比这更多的绑定环境吗?
是的,还有更多的命名空间。我什至记得有一个小片段暴露了它们中的大部分,但不幸的是,我再也找不到它了¹。它至少公开了variable、function、tag和block命名空间,但也可能包括了类型和声明。还有另一个列出这些名称空间的SO 答案。
如果是这样,那么将 Common Lisp 归类为 Lisp-2 是否公平?
在对上述链接答案的评论中,Rainer Joswig 同意“一般性辩论是关于 Lisp-1 与 Lisp-n 的”。
“2”可能是由于值槽和函数槽之间区别的相对重要性,或者因为其他命名空间的对象不是一流的对象。例如在另一个答案中引用的Gabriel/Pitman 论文中:
除了这里讨论的两个,实际上还有更多的命名空间。正如我们前面提到的,其他命名空间至少包括块和标签的命名空间。类型名称和声明名称通常被视为命名空间。因此,我们一直使用的名称 Lisp1 和 Lisp2 具有误导性。Lisp5 和 Lisp6 的名称可能更合适。
和:
在本文中,有两个命名空间值得关注,我们将其称为“值命名空间”和“函数命名空间”。其他命名空间包括标记名称(由 TAGBODY 和 GO 使用)和块名称(由 BLOCK 和 RETURN-FROM 使用),但其绑定的位置部分中的对象不是一流的 Lisp 对象。
¹) PAIP , p. 837:
(defun f (f)
(block f
(tagbody
f (catch 'f
(if (typep f 'f)
(throw 'f (go f)))
(funcall #'f (get (symbol-value 'f) 'f))))))
在 PAIP 中,Peter Norvig 说“Common Lisp 至少有七个名称空间”(第 836 页)。
他列出的七个是:
Peter Seibel 在他关于“编译器”与“库”名称空间的 comp.lang.lisp 帖子中提出了一个很好的观点。我认为所有 Norvig 的七个命名空间都是“编译器”命名空间。
例如,参见 comp.lang.lisp 的这个旧讨论帖子:
http://coding.derkeiler.com/Archive/Lisp/comp.lang.lisp/2004-04/0737.html
是的 - http://www.lispworks.com/documentation/lw51/CLHS/Body/t_symbol.htm#symbol指定了一个单独的值单元格和函数单元格,与 lisp-2 一致。
还有一个属性列表,但由于没有符号“自然”引用其属性列表的上下文,因此通常不将 CL 描述为 lisp-3(实际上,我通常不知道任何语言如此指定)。