Lisp-1とLisp-2の違いは何ですか?


94

Lisp-1とLisp-2の違いと、これがClojureにどのように関連するかを理解しようとしましたが、それでも正しく理解できません。誰かが私を啓発できますか?

回答:


68

ウィキペディアによると:

関数のための別個の名前空間が利点であるかどうかは、Lispコミュニティにおける競合の原因です。これは通常、Lisp-1対Lisp-2の議論と呼ばれています。Lisp-1はSchemeのモデルを指し、Lisp-2はCommon Lispのモデルを指します。

基本的には、変数と関数が衝突することなく同じ名前を持つことができるかどうかについてです。 ClojureはLisp-1であり、関数と変数に同じ名前を同時に使用することはできません。


11
Lisp-2は、同じ名前の関数と変数を持つことで、より混乱しませんか?
appshare.co、2011年

39
その理由の1つは、Lisp-2方言を使用するプログラマーが同じ名前の関数と変数を持つことに邪魔にならないことです。list関数パラメータとして使用されることが多く(list ...)、標準的な関数であるため混乱を招くOMGです。list変数として持つ多くの関数は、list関数を使用しないか、その変数の近くで使用しません。それが起こったとしても、それほど悪くはありません(list foo list)。これは、「fight the good fight」のように同じ単語が名詞と動詞として表示される文よりも紛らわしくありません。
Kaz

5
@Zubair Javaにはさらに多くの名前空間があります。クラス、メソッド、変数を同じ名前で定義できます。
2017

19
ニーモニックとして、Lisp 1は1つの名前空間を持ち、Lisp 2は2つの名前空間(1つは関数用、もう1つは変数用)を持っていると考えています。
Nick McCurdy 2017年

4
@NickMcCurdyニーモニックとして、私は自転車が2つの車輪を持ち、三輪車が3つの車輪を持っていると考えます。
Kaz

71

リチャード・ガブリエルのこの論文を読んでみたいと思います。これは、LispコミュニティがLisp1とLisp2で議論していた問題の要約です。最初の数セクションは少し密度が高く、動きが遅いですが、セクション5を通過するまでに読みやすくなります。

基本的に、Lisp1はシンボルを値にマップする単一の環境を持ち、それらの値は「通常」または関数のいずれかです。Lisp2には(少なくとも)2つの名前空間があります(シンボルには、関数値用のスロットと通常値用のスロットがあります)。したがって、Lisp2では、fooという名前の関数とfooという名前の値を使用できますが、Lisp1では、名前fooは単一の値(関数またはその他)しか参照できません。

2つの間にいくつかのトレードオフと味の違いがありますが、詳細についてはペーパーを読んでください。クリスチャン・ケネネックの著書「Lisp in Small Pieces」にも、テキストを通して織り成された違いについての議論があります。


7
ガブリエル紙の謎めいたセクションの1つは、マルチプロセッシングのセクション11です。そのセクションでは、彼はLisp1が関数型のプログラミングを促進し、したがってマルチプロセッシングを促進することを示唆しています。明らかに、これはClojureに関係しています。しかし、なぜ Lisp1がFPに対してより優れているのか、私にはよくわかりません。誰かこれについて洞察がありますか?
Peter McLain、2011年

40
おそらくFPの主な目的は関数をファーストクラスの値として扱うことであるため、他のすべての値と同じように処理する方がはるかに便利で概念的にクリーンです
mikera

10
@PeterMcLain Lisp-1方言のユーザーがLisp-1が関数型プログラミングに対してより伝導的であると言うとき、彼らが意味することは、コードでいっぱいの演算子funcallfunction演算子を用意する必要がないということです。これらはLisp-1で消えます。
Kaz


2
Lisp-2について「少なくとも」という語句を使用しました。2つのケースの単純な違いは、シンボルがS式の先頭位置にあるかどうか(そうである場合は、関数の名前空間で検索し、それ以外は変数の名前空間で検索する)です。これら2つのケース以外の例を挙げていただけますか?
Daniel Dinnyes 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.