Common Lisp には関数と変数のバインディング環境が異なることは承知していますが、
HyperSpecによると、それはnamespacesになります。
名前空間 n. 1. その意味が特定の種類に制限されているバインディング。The bindings of names to tags is the tag
namespace.'' 2. any mapping whose domain is a set of names.
パッケージは名前空間を定義します。」
(ポイント1.)
しかし、tagbody ラベル用の別のバインド環境もあると思います。これよりも多くのバインド環境がありますか?
はい、さらに名前空間があります。それらのほとんどを公開している小さなスニペットさえ覚えていますが、残念ながら、もう見つけることができません¹。少なくともvariable、function、tag、およびblock名前空間を公開しましたが、型と宣言も含まれていた可能性があります。これらの名前空間をリストする別の SO 回答もあります。
もしそうなら、Common Lisp を Lisp-2 として分類するのは公平でしょうか?
上記のリンクされた回答へのコメントで、Rainer Joswig は「一般的な議論は Lisp-n に対する Lisp-1 に関するものである」ことに同意します。
"2" は、値スロットと関数スロットの違いが相対的に重要であること、または他の名前空間のオブジェクトがファースト クラス オブジェクトではないことが原因である可能性があります。たとえば、他の回答で参照されているガブリエル/ピットマンの論文では:
ここで説明した 2 つだけでなく、実際には多数の名前空間があります。前述したように、他の名前空間には少なくともブロックとタグの名前空間が含まれます。型名と宣言名は、多くの場合、名前空間と見なされます。したがって、私たちが使用してきた Lisp1 と Lisp2 という名前は誤解を招くものです。Lisp5 と Lisp6 という名前の方が適切かもしれません。
と:
このホワイト ペーパーでは、"値の名前空間" と "関数の名前空間" と呼ぶ 2 つの名前空間について説明します。他の名前空間には、タグ名 (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))))))