![](/img/trans.png)
[英]Using parameters as operators in LISP lambda function (The Roots of Lisp)
[英]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頁)。
他列出的七個是:
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.