(これは CS 理論タイプの質問です。受け入れられることを願っています。)
「Lisp-1 対 Lisp-2」の議論は、関数の名前空間が他のすべての変数の名前空間と区別されるべきかどうかに関するものであり、プログラマが関数を値として渡すことを可能にする動的型付け言語に関連しています。f
Lisp-1 言語 (Scheme など) には名前空間が 1 つあるため、名前付きの関数と名前付きの整数の両方を持つことはできませんf
(名前付きの 2 つの整数のように、一方が他方を隠しますf
)。Lisp-2 言語 (Common Lisp など) には 2 つの名前空間があるため、両方のf
変数を使用できますが、どちらを意味するかを特別な構文 (#'f
は関数で、f
は整数) で指定する必要があります。
主な技術的問題である整数から関数を明確にする必要性は、言語も静的に型付けされている場合 (ほとんどの Lisp とは異なり) 問題ではないように思えます。たとえば、sort
関数が明示的な署名としてリストと未満関数を必要とする場合、
def sort[X](list: List[X], lessThan: Function[X, Boolean]) // Scala syntax; had to pick something
関数と他のすべてが同じ名前空間にあるかどうかは関係ありません。 sort(mylist, myless)
が関数の場合にのみ型チェックに合格しmyless
ます。特別な構文は必要ありません。2 つの名前空間よりも 1 つの名前空間の方が美しいと主張する人もいますが、私は技術的な問題に焦点を当てたいと思います。
問題の言語が静的に型付けされていると仮定すると、2 つの名前空間によって (または逆に 1 つの名前空間に対して) より困難になったり、エラーが発生しやすくなったりするものはありますか?
(私が取り組んでいるドメイン固有言語のコンテキストでこれについて考えています。将来的に問題が発生しないようにしたいと考えています。2 つの名前空間で実装する方が簡単です ( Lisp-2) であり、静的に型付けされているため、 に相当するものは必要ありません#'f
。一般的な質問をしたのは、一般的なポイントを聞きたいからであり、おそらく、まだ質問することを知らない質問に気づきたいからです。)