Common Lisp a Lisp -n?

时间:2012-08-09 04:27:49

标签: namespaces lisp common-lisp lisp-2

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

这些问题并不意味着迂腐或自行车脱落,我只想更好地了解Common Lisp,并希望能够深入了解哪里可以深入挖掘其规格。

4 个答案:

答案 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页)。

他列出的七个是:

  1. 功能和宏
  2. 变量
  3. 特殊变量
  4. 数据类型
  5. 标签内go语句的标签
  6. 块内返回语句的块名称
  7. 引用表达式中的符号
  8. 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(实际上,我不知道通常如此指定的任何语言)。