2012-08-09 131 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的七個命名空間都是「編譯器」命名空間。