web-dev-qa-db-ja.com

Clojureと他のLisp

私の質問の目的は、notではなく、炎の戦争を開始することですが、どのような状況で各言語が「仕事に最適なツール」であるかを判断することです。

私はClojureに関するいくつかの本を読みました( Programming ClojurePractical ClojureThe Joy of Clojure 、and the Manning Early Access edition of Clojure in Action )、それは素晴らしい言語だと思います。私は現在 Let Over Lambda を読んでいます。これは主に一般的なLISPマクロを扱い、それも非常に興味深い言語です。

私はnotLISPの専門家(初心者)ですが、この言語ファミリは、関数型プログラミングと同様、私を魅了します。

Clojureの利点(および「その他」の欠点):

  • JVMで実行されます。

    • JVMは、非常に安定した高性能の言語環境であり、「一度書くだけで(ほとんど)どこでも実行できる」というSunの夢を十分に満たします。 Macbook Proでコードを記述し、実行可能なJARファイルにコンパイルして、追加のテストをほとんど行わずにLinuxおよびMicrosoft Windowsで実行できます。

    • (ホットスポットなどの)JVMは、高品質のガベージコレクションと非常にパフォーマンスの高いジャストインタイムのコンパイルと最適化をサポートしています。ほんの数年前、私はCで高速に実行しなければならなかったものをすべて書きましたが、今はJavaで実行することをためらいません。

    • 標準のシンプルなマルチスレッドモデル。 Common LISPには標準のマルチスレッドパッケージがありますか?

    • []{}、および#{}を使用してこれらすべての括弧の単調さを解消しますが、一般的なLISPの専門家はおそらく読者マクロを使用してCLに追加できることを教えてくれます。

Clojureの欠点

  • JVMで実行されます。
    • 末尾再帰または継続はありません。 Common LISPは継続をサポートしていますか? Schemeでは両方のサポートが必要だと思う。

その他の利点(特にLISP共通)(およびClojureの欠点):

  • ユーザー定義可能なリーダーマクロ。

  • その他の利点は?

考え?その他の違いは?

87
Ralph

他のLispよりもClojureを好む理由の私の個人的なリスト(p.s.すべてのLispはまだ素晴らしいと思います!):

  • JVM上で実行-したがって、JVM自体の高度なエンジニアリング(高度なガベージコレクションアルゴリズム、HotSpot JIT最適化など)に自動的にアクセスできます。

  • 非常に良いJava相互運用性-Java/JVM言語エコシステムの膨大な範囲のライブラリとの互換性を提供します。ClojureをさまざまなJava効果の高いライブラリ。多くのJavaコードも開発しているので、ClojureがJavaツール( Clojureの開発には、Maven、EclipseをCounterclockwiseプラグインとともに使用します)

  • ベクトルの素敵な構文[1 2 3]、マップ{:bob 10, :jane 15}およびセット#{"a" "b" "c"}-現代のプログラミングに不可欠なこれらのツールを検討します(もちろんリストに加えて!)

  • 個人的には、フォームのバインドに角括弧を使用するのが好きです。 (defn foo [a b] (+ a b))-コードを読むと少しわかりやすくなると思います。

  • 永続的で不変のデータ構造を備えた遅延機能プログラミングに重点を置いています-特にすべてのコアClojureライブラリはデフォルトでこれをサポートするように設計されています

  • マルチコア同時実行性のための優れたSTM実装。 Clojureは、現時点でどの言語でも最高の並行性のストーリーを持っていると思います(これを参照してください Rich Hickey自身によるより詳細なビデオ

  • 私が個人的に好むLISP-1(Schemeのような)です(関数型言語では、関数とデータを同じ名前空間に保持するのが理にかなっています)

47
mikera

ClojureとCommon LISPの重要な違いは、Clojureが関数型プログラミングについてより規範的であることです。 Clojureの哲学、イディオム、そしてある程度の言語/ライブラリーは、機能的な方法でプログラムすることを強く推奨し、時には主張します(副作用や可変状態はありません)。

Common LISPは間違いなく関数型プログラミングをサポートしていますが、可変状態と命令型プログラミングも可能です。

もちろん、並行性などの分野において、関数型プログラミングには多くの利点があります。しかし、他のすべてが平等である場合、各状況に使用するアプローチを選択できることも良いことです。 Clojureは命令型プログラミングを完全に禁止しているわけではありませんが、Common LISPほどそのスタイルに対応していません。

24
Charlie Flowers

Clojureは言語であり、実装であることに注意してください(通常はJVM上)。 Common LISPは、10以上の異なる実装を持つ言語です。そのため、ここにカテゴリの不一致があります。たとえば、ClojureとSBCLを比較できます。

一般的に:

  • common LISPのバージョンがJVMで実行される:ABCL

  • 他のほとんどのCommon LISPの実装は

  • ほとんどのCL実装にはマルチタスク機能があり、ライブラリは共通のインターフェースを提供します

  • Common LISPには配列の構文があります。他のデータ型の構文はユーザーが作成でき、さまざまなライブラリによって提供されます。

  • Common LISPは、テールコールの最適化も継続もサポートしていません。実装はTCOを提供し、ライブラリは何らかの形式の継続を提供します。

22
Rainer Joswig

Scheme(ラケットがほとんど)とClojureの比較 の良いビデオです。

公平を期すために、Racketにはデータ型(#hash、#、角括弧など)の構文シュガー(追加のリーダースタッフ)もあります。

さらに、Clojureが適切な末尾呼び出しを行う唯一の方法は、recurを使用することです。これは、JVMにコンパイルすることのマイナス面です。

recurは、Clojureで唯一のスタックを消費しないループ構造です。末尾呼び出しの最適化はなく、未知の境界のループに自己呼び出しを使用することは推奨されません。 recurは機能的であり、末尾位置での使用はコンパイラによって検証されます。 ( 特別な形式 )。

10
Daniil