2012-08-09 133 views
5

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

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

回答

9

我知道,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)))))) 
3

在PAIP,彼得·诺维格表示, “Common Lisp中至少有7名空间”(第836)。

七名他列表是:

  1. 函数和宏
  2. 变量
  3. 特殊变量
  4. 数据类型
  5. 标签的tagbody
  6. 一个块名称中去声明返回从一个块内的陈述
  7. 符号我除了引用的表达式

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