Lisp-1とLisp-2の違いと、これがClojureにどのように関連するかを理解しようとしましたが、それでも正しく理解できません。誰かが私を啓発できますか?
Lisp-1とLisp-2の違いと、これがClojureにどのように関連するかを理解しようとしましたが、それでも正しく理解できません。誰かが私を啓発できますか?
回答:
ウィキペディアによると:
関数のための別個の名前空間が利点であるかどうかは、Lispコミュニティにおける競合の原因です。これは通常、Lisp-1対Lisp-2の議論と呼ばれています。Lisp-1はSchemeのモデルを指し、Lisp-2はCommon Lispのモデルを指します。
基本的には、変数と関数が衝突することなく同じ名前を持つことができるかどうかについてです。 ClojureはLisp-1であり、関数と変数に同じ名前を同時に使用することはできません。
list
関数パラメータとして使用されることが多く(list ...)
、標準的な関数であるため混乱を招くOMGです。list
変数として持つ多くの関数は、list
関数を使用しないか、その変数の近くで使用しません。それが起こったとしても、それほど悪くはありません(list foo list)
。これは、「fight the good fight」のように同じ単語が名詞と動詞として表示される文よりも紛らわしくありません。
リチャード・ガブリエルのこの論文を読んでみたいと思います。これは、LispコミュニティがLisp1とLisp2で議論していた問題の要約です。最初の数セクションは少し密度が高く、動きが遅いですが、セクション5を通過するまでに読みやすくなります。
基本的に、Lisp1はシンボルを値にマップする単一の環境を持ち、それらの値は「通常」または関数のいずれかです。Lisp2には(少なくとも)2つの名前空間があります(シンボルには、関数値用のスロットと通常値用のスロットがあります)。したがって、Lisp2では、fooという名前の関数とfooという名前の値を使用できますが、Lisp1では、名前fooは単一の値(関数またはその他)しか参照できません。
2つの間にいくつかのトレードオフと味の違いがありますが、詳細についてはペーパーを読んでください。クリスチャン・ケネネックの著書「Lisp in Small Pieces」にも、テキストを通して織り成された違いについての議論があります。
funcall
やfunction
演算子を用意する必要がないということです。これらはLisp-1で消えます。