【问题标题】:Common Lisp a Lisp-n?Common Lisp 一个 Lisp-n?
【发布时间】:2012-08-06 06:56:04
【问题描述】:
我知道 Common Lisp 对函数和变量有不同的绑定环境,但我相信它还有另一个用于标签体标签的绑定环境。还有比这更多的绑定环境吗?如果是这样,那么将 Common Lisp 归类为 Lisp-2 是否公平?
这些问题并不意味着迂腐或骑自行车,我只是想更好地了解 Common Lisp,并希望能获得一些指针,了解在哪里更深入地研究它的规范。
【问题讨论】:
标签:
namespaces
lisp
common-lisp
lisp-2
【解决方案1】:
在 PAIP 中,Peter Norvig 说“Common Lisp 至少有七个名称空间”(第 836 页)。
他列出的七个是:
- 函数和宏
- 变量
- 特殊变量
- 数据类型
- 标签正文中的 go 语句标签
- 块内返回语句的块名
- 引用表达式中的符号
Peter Seibel 在他关于“编译器”与“库”命名空间的 comp.lang.lisp 帖子中提出了一个很好的观点。我认为 Norvig 的所有七个命名空间都是“编译器”命名空间。
【解决方案2】:
我知道 Common Lisp 有不同的绑定环境
函数和变量,
根据HyperSpec,这将是命名空间:
命名空间 n. 1. 外延仅限于 a 的绑定
特别的种类。 The bindings of names to tags is the tag
namespace.'' 2. any mapping whose domain is a set of names.A
包定义了一个命名空间。''
(第 1 点。)
但我相信它还有另一个用于 tagbody 的绑定环境
标签。还有比这更多的绑定环境吗?
是的,还有更多的命名空间。我什至记得有一点 sn-p 暴露了它们中的大多数,但不幸的是,我再也找不到它了¹。它至少暴露了 variable、function、tag 和 block 命名空间,但也可能暴露了 types 和 声明 被包括在内。还有another SO answer 列出了这些命名空间。
如果是这样,那么将 Common Lisp 归类为 Lisp-2 是否公平?
在上述链接答案的 cmets 中,Rainer Joswig 同意“关于 Lisp-1 与 Lisp-n 的一般性辩论”。
“2”可能是由于值槽和函数槽之间区别的相对重要性,或者因为其他命名空间的对象不是一流的对象。例如在另一个答案中引用的Gabriel/Pitman paper:
实际上有更多的命名空间,而不仅仅是两个
在这里讨论。如前所述,其他命名空间包括
至少是块和标签的那些;类型名称和声明名称是
通常被认为是命名空间。因此,名称 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))))))