簡體   English   中英

Common Lisp a Lisp -n?

[英]Common Lisp a Lisp-n?

我知道Common Lisp對函數和變量有不同的綁定環境,但我相信它還有另一個綁定環境用於標簽體標簽。 是否有比這更具約束力的環境? 如果是這樣,那么將Common Lisp歸類為Lisp-2是否公平?

這些問題並不意味着迂腐或自行車脫落,我只想更好地了解Common Lisp,並希望能夠深入了解哪里可以深入挖掘其規格。

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

但我相信它還有標簽體標簽的另一個綁定環境。 是否有比這更具約束力的環境?

是的,有更多的命名空間。 我甚至記得有一些小片暴露了他們中的大部分,但不幸的是,我再也找不到了¹。 它至少暴露了變量函數標記命名空間,但也可能包含類型聲明 還有另一個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))))))

在PAIP中,Peter Norvig說“Common Lisp至少有七個名字空間”(第836頁)。

他列出的七個是:

  1. 功能和宏
  2. 變量
  3. 特殊變量
  4. 數據類型
  5. 標簽中go語句的標簽
  6. 塊中返回語句的塊名稱
  7. 引用表達式中的符號

Peter Seibel在他關於“編譯器”與“庫”命名空間的comp.lang.lisp帖子中提出了一個很好的觀點。 我認為Norvig的七個命名空間都是“編譯器”命名空間。

例如,請參閱comp.lang.lisp中的舊討論帖:

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

是 - http://www.lispworks.com/documentation/lw51/CLHS/Body/t_symbol.htm#symbol指定一個單獨的值單元格和函數單元格,與lisp-2一致。

還有一個屬性列表,但由於沒有符號“自然”引用其屬性列表的上下文,因此通常不將CL描述為lisp-3(事實上,我通常不知道任何語言如此指定)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM