我知道Common Lisp對函數和變量有不同的綁定環境,但我相信它還有另一個用於tagbody標籤的綁定環境。還有更多的綁定環境嗎?如果是這樣,那麼將Common Lisp分類爲Lisp-2是否公平?Common Lisp a Lisp-n?
這些問題不意味着迂腐或騎自行車脫落,我只是想更好地瞭解Common Lisp的,並希望得到一些指引到哪裏更深入地研究它的規範。
我知道Common Lisp對函數和變量有不同的綁定環境,但我相信它還有另一個用於tagbody標籤的綁定環境。還有更多的綁定環境嗎?如果是這樣,那麼將Common Lisp分類爲Lisp-2是否公平?Common Lisp a Lisp-n?
這些問題不意味着迂腐或騎自行車脫落,我只是想更好地瞭解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點)
但我相信,它也有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))))))
是 - http://www.lispworks.com/documentation/lw51/CLHS/Body/t_symbol.htm#symbol指定了單獨的值單元格和函數單元格,與lisp-2一致。
還有一個屬性列表,但由於沒有上下文中「自然」符號是指其屬性列表,因此通常不會將CL描述爲lisp-3(實際上,我不知道通常如此指定的任何語言)。
見例如從comp.lang.lisp這個老論壇帖子:
http://coding.derkeiler.com/Archive/Lisp/comp.lang.lisp/2004-04/0737.html
在PAIP,彼得·諾維格表示, 「Common Lisp中至少有7名空間」(第836)。
七名他列表是:
Peter Seibel在他的comp.lang.lisp文章中提到了關於「編譯器」與「庫」命名空間的很好的一點。我認爲所有Norvig的七個命名空間都是「編譯器」命名空間。