我知道Common Lisp对函数和变量有不同的绑定环境,但我相信它还有另一个用于tagbody标签的绑定环境。还有更多的绑定环境吗?如果是这样,那么将Common Lisp分类为Lisp-2是否公平?Common Lisp a Lisp-n?
这些问题不意味着迂腐或骑自行车脱落,我只是想更好地了解Common Lisp的,并希望得到一些指引到哪里更深入地研究它的规范。
我知道Common Lisp对函数和变量有不同的绑定环境,但我相信它还有另一个用于tagbody标签的绑定环境。还有更多的绑定环境吗?如果是这样,那么将Common Lisp分类为Lisp-2是否公平?Common Lisp a Lisp-n?
这些问题不意味着迂腐或骑自行车脱落,我只是想更好地了解Common Lisp的,并希望得到一些指引到哪里更深入地研究它的规范。
我知道,Common Lisp的有 函数和变量的不同的结合环境,
这将是命名空间,根据HyperSpec:
命名空间ñ。 1.特定类型的绑定,其表示仅限于 。
The bindings of names to tags is the tag namespace.'' 2. any mapping whose domain is a set of names.
一个 包定义命名空间。 ''
(1点)
但我相信,它也有tagbody 标签另一绑定环境。还有更多的绑定环境吗?
是的,还有更多的命名空间。我甚至记得有一小段片断揭露了他们中的大部分,但不幸的是,我再也找不到它了¹。它至少暴露可变,功能,标签,和块命名空间,但也许还类型和声明都包括在内。还有another SO answer列出了这些命名空间。
如果是这样,那么将Common Lisp分类为Lisp-2是否公平?
在对上述链接答案的评论中,Rainer Joswig同意“关于Lisp-1反对Lisp-n的一般性辩论”。
“2”可能是由于值和函数槽之间的区别的相对重要性,或因为其他的名称空间的对象不是第一类对象。例如,在对方的回答中引用的Gabriel/Pitman paper:
实在是命名空间不仅仅是两个是 这里讨论的一个更大的数字。正如我们前面提到的,其他名称空间至少包含 块和标签;类型名称和声明名称是 通常被视为命名空间。因此,我们 一直在使用的名称Lisp1和Lisp2具有误导性。 Lisp5和Lisp6的名字可能是 更合适。
和:
在本文中,有关心的两个命名空间,这是我们 应称之为“价值命名空间”和“函数命名空间。”其他 名称空间包括标记名称(由TAGBODY和GO使用)和块名称 (由BLOCK和RETURN-FROM使用),但其绑定的位置部分 中的对象不是一级Lisp对象。
¹)PAIP,第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))))))
是 - http://www.lispworks.com/documentation/lw51/CLHS/Body/t_symbol.htm#symbol指定了单独的值单元格和函数单元格,与lisp-2一致。
还有一个属性列表,但由于没有上下文中“自然”符号是指其属性列表,因此通常不会将CL描述为lisp-3(实际上,我不知道通常如此指定的任何语言)。
见例如从comp.lang.lisp这个老论坛帖子:
http://coding.derkeiler.com/Archive/Lisp/comp.lang.lisp/2004-04/0737.html
在PAIP,彼得·诺维格表示, “Common Lisp中至少有7名空间”(第836)。
七名他列表是:
Peter Seibel在他的comp.lang.lisp文章中提到了关于“编译器”与“库”命名空间的很好的一点。我认为所有Norvig的七个命名空间都是“编译器”命名空间。