5

我知道 Common Lisp 对函数和变量有不同的绑定环境,但我相信它还有另一个用于标签体标签的绑定环境。还有比这更多的绑定环境吗?如果是这样,那么将 Common Lisp 归类为 Lisp-2 是否公平?

这些问题并不意味着迂腐或自行车脱落,我只是想更好地了解 Common Lisp 并希望能获得一些指示,了解在哪里更深入地研究它的规范。

4

4 回答 4

9

我知道 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 点。)

但我相信它还有另一个标签体标签的绑定环境。还有比这更多的绑定环境吗?

是的,还有更多的命名空间。我什至记得有一个小片段暴露了它们中的大部分,但不幸的是,我再也找不到它了¹。它至少公开了variablefunctiontagblock命名空间,但也可能包括了类型声明。还有另一个列出这些名称空间的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))))))
于 2012-08-09T06:05:21.473 回答
3

在 PAIP 中,Peter Norvig 说“Common Lisp 至少有七个名称空间”(第 836 页)。

他列出的七个是:

  1. 函数和宏
  2. 变量
  3. 特殊变量
  4. 数据类型
  5. tagbody 中 go 语句的标签
  6. 块内 return-from 语句的块名
  7. 带引号的表达式中的符号

Peter Seibel 在他关于“编译器”与“库”名称空间的 comp.lang.lisp 帖子中提出了一个很好的观点。我认为所有 Norvig 的七个命名空间都是“编译器”命名空间。

于 2012-10-04T17:35:23.903 回答
2

例如,参见 comp.lang.lisp 的这个旧讨论帖子:

http://coding.derkeiler.com/Archive/Lisp/comp.lang.lisp/2004-04/0737.html

于 2012-08-09T11:09:56.690 回答
1

是的 - http://www.lispworks.com/documentation/lw51/CLHS/Body/t_symbol.htm#symbol指定了一个单独的值单元格和函数单元格,与 lisp-2 一致。

还有一个属性列表,但由于没有符号“自然”引用其属性列表的上下文,因此通常不将 CL 描述为 lisp-3(实际上,我通常不知道任何语言如此指定)。

于 2012-08-09T04:50:14.950 回答