我知道Common Lisp对函数和变量有不同的绑定环境,但我相信它也有另一个用于标记体标签的绑定环境。还有比这更多的绑定环境吗?如果是这样,那么将Common Lisp归类为Lisp-2是否公平?
这些问题并不是学究或自行车脱落的意思,我只是想更好地理解Common Lisp,并希望能得到一些关于深入研究它的规范的指针。
发布于 2012-08-09 14:05:21
我知道Common Lisp对函数和变量有不同的绑定环境,
根据HyperSpec,这将是名称空间
名称空间n.1.其表示被限制为特定类型的绑定。
The bindings of names to tags is the tag namespace.'' 2. any mapping whose domain is a set of names.包定义了一个命名空间。‘’
(第1点)
,但我相信它还有另一个标记体标签的绑定环境。还有比这更多的绑定环境吗?
是的,还有更多的命名空间。我甚至记得有一个小片段暴露了大部分内容,但不幸的是,我再也找不到它了。它至少公开了变量、函数、标记和块命名空间,但也可能包括类型和声明。还有列出这些名称空间的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))))))发布于 2012-10-05 01:35:24
在PAIP中,Peter Norvig说"Common Lisp至少有七个名称空间“(第836页)。
他列出的七个是:
Peter Seibel在他关于“编译器”与“库”命名空间的comp.lang.lisp帖子中提出了一个很好的观点。我认为Norvig的所有七个命名空间都是“编译器”命名空间。
发布于 2012-08-09 19:09:57
例如,请参阅来自comp.lang.lisp的这篇旧讨论帖子:
http://coding.derkeiler.com/Archive/Lisp/comp.lang.lisp/2004-04/0737.html
https://stackoverflow.com/questions/11876815
复制相似问题