1. ホーム
  2. clojure

[解決済み] Clojureと他のLispsの比較 [終了しました]。

2023-01-07 17:19:58

質問

私の質問の意図は ではなく であり、むしろそれぞれの言語がどのような状況で "仕事のための最高のツールであるかを決定することです。

Clojureの本を何冊か読みました( プログラミング Clojure , 実践的なClojure , Clojureの楽しみ およびManningアーリーアクセス版の Clojureイン・アクション を参照)、素晴らしい言語だと思います。現在、私が読んでいるのは ラムダを超える を読んでいますが、これも非常に面白い言語です。

私は ではない Lispの専門家ではありませんが(というより初心者です)、この言語のファミリーは、一般に関数型プログラミングと同様に、私を魅了します。

Clojureの長所 (そして"その他"の欠点)。

  • JVM上で実行されます。

    • JVM は、非常に安定した高性能な言語環境であり、Sun の夢である "一度書いたら [ほとんど] どこでも実行できる" にかなり近いものです。私の Macbook Pro でコードを書き、それを実行可能な JAR ファイルにコンパイルし、Linux や Microsoft Windows でわずかな追加テストだけで実行することができます。

    • (Hotspot やその他の) JVM は、高品質のガベージコレクションと、非常にパフォーマンスの高いジャストインタイム コンパイルおよび最適化をサポートしています。ほんの数年前までは、高速に動作しなければならないものはすべてCで書いていましたが、今では迷わずJavaで書いています。

    • 標準的でシンプルなマルチスレッドモデル。Common Lispには標準的なマルチスレッドパッケージがあるのでしょうか?

    • ですべての括弧の単調さを打破します。 [] , {} そして #{} を追加することができます。Common Lispの専門家は、リーダーマクロを使えば、CLにこれらを追加することができると教えてくれるかもしれません。

Clojureのデメリット :

  • JVM上で動作します。
    • 末尾再帰や連続はありません。Common Lispは継続をサポートしているのでしょうか。Schemeは確か両方のサポートが必要だったはず。

その他の利点 (特に Common Lisp) (とClojureのデメリット)。

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

  • その他の利点は?

感想は?その他の違いは?

どのように解決するのですか?

他のLispよりもClojureを好む私の個人的な理由のリストです(追伸:私は今でもすべてのLispが素晴らしいと思っています!)。

  • JVM上で実行されます - それ故、JVM自体の素晴らしいエンジニアリング(高度なガベージコレクション・アルゴリズム、HotSpot JIT最適化など)に自動的にアクセスできます。

  • 非常に優れたJavaの相互運用性 - Java/JVM言語エコシステム内の膨大な範囲のライブラリとの互換性を提供します。私はClojureを、異なるJavaライブラリを効果的に接続するための "glue" "言語として使用してきました。私はまた多くのJavaコードを開発するので、ClojureがJavaツールとうまく統合することは私にとって有用です(例えば、私は私のClojure開発のためにMaven、Eclipse with Counterclockwise pluginを使用します)。

  • ベクトル用の素晴らしい構文 [1 2 3] マップ {:bob 10, :jane 15} とセット #{"a" "b" "c"} - 私は、これらは現代のプログラミングにかなり不可欠なツールだと考えています (もちろんリストに加えて!)。

  • 私は個人的に角括弧を使った結合形式が好きです:例えば (defn foo [a b] (+ a b)) - これで少しはコードが読みやすくなったのではないでしょうか。

  • 永続的で不変のデータ構造を持つ、遅延した関数型プログラミングを重視 - 特に、すべてのコアClojureライブラリは、デフォルトでこれをサポートするように設計されています。

  • マルチコアの同時実行のための優れたSTM実装です。私はClojureが現時点でどの言語よりも優れた並行処理の物語を持っていると信じています(この のビデオでRich Hickey氏自身による詳細な説明をご覧ください。 )

  • これはLisp-1(Schemeのようなもの)で、個人的には好きです(関数型言語では関数とデータを同じ名前空間に保つことが理にかなっていると思います)。