我知道Common Lisp对函数和变量有不同的绑定环境,但我相信它还有另一个用于标签体标签的绑定环境。是否有比这更具约束力的环境?如果是这样,那么将Common Lisp归类为Lisp-2是否公平?
这些问题并不意味着迂腐或自行车脱落,我只想更好地了解Common Lisp,并希望能够深入了解哪里可以深入挖掘其规格。
答案 0 :(得分:9)
我知道Common Lisp具有不同的绑定环境 函数和变量,
根据HyperSpec:
,这将是名称空间命名空间1.表示限于a的绑定 特别的。
The bindings of names to tags is the tag namespace.'' 2. any mapping whose domain is a set of names.
甲 package定义了一个名称空间。''
(第1点)
但我相信它还有另一个tagbody的绑定环境 标签。是否有比这更具约束力的环境?
是的,有更多名称空间。我甚至记得有一些小片暴露了他们中的大部分,但不幸的是,我再也找不到了¹。它至少暴露了变量,功能,标记和块名称空间,但也可能 types < / em>和声明包括在内。还有another SO answer列出了这些名称空间。
如果是这样,那么将Common Lisp归类为Lisp-2是否公平?
在对上述相关答案的评论中,Rainer Joswig同意“一般辩论是关于Lisp-1反对Lisp-n”。
“2”可能是由于值和函数槽之间的区别的相对重要性,或者因为其他命名空间的对象不是第一类对象。例如,在另一个答案中引用的Gabriel/Pitman paper中:
实际上有更多的命名空间而不仅仅是两个 在这里讨论。正如我们前面提到的,其他名称空间包括at 至少那些块和标签;类型名称和声明名称是 通常被认为是名称空间因此,名称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))))))
答案 1 :(得分:3)
在PAIP中,Peter Norvig说“Common Lisp至少有七个名字空间”(第836页)。
他列出的七个是:
Peter Seibel在他的comp.lang.lisp帖子中提到了关于“编译器”与“库”命名空间的重要观点。我认为Norvig的七个命名空间都是“编译器”命名空间。
答案 2 :(得分:2)
例如,请参阅comp.lang.lisp中的旧讨论帖:
http://coding.derkeiler.com/Archive/Lisp/comp.lang.lisp/2004-04/0737.html
答案 3 :(得分:1)
是 - http://www.lispworks.com/documentation/lw51/CLHS/Body/t_symbol.htm#symbol指定一个单独的值单元格和函数单元格,与lisp-2一致。
还有一个属性列表,但由于没有符号&#34;自然&#34;指的是它的属性列表,通常不会将CL描述为lisp-3(实际上,我不知道通常如此指定的任何语言)。