35

Common Lisp アプリケーションを Clojure に移植することは、どの程度実用的ですか? より具体的に言うと、Common Lisp に存在し、Clojure には存在せず、書き直さなければならない機能は何ですか?

4

4 に答える 4

32

clojure.orgには、Clojureと他のLispの違いのリストがあります。Clojureを使用して気付いた他のいくつかのこと:

  • 慣用的なClojureは、不変のデータ構造に大きく傾いています。CLで表示SETFされる場所はすべて、Clojureで最大限に活用するために変更する必要がある場合があります。(Clojureでは常に可変のJavaデータ構造を使用するオプションがありますが、ほとんどの人は使用しません。)

  • ClojureのマルチメソッドはCLのマルチメソッドに似ていますが(タイプ以外のものにディスパッチできるため、おそらくより強力です)、本格的なCLOSはClojureでは使用できません。Clojureはstruct代わりに使用しますが、これは単なる派手なハッシュマップです。もちろん、JavaのOOPシステムも利用できます。CLOSをClojureに移植する作業をしている人もいますが、現時点でそれらの取り組みがどこまで進んでいるかはわかりません。

  • Clojureマクロは、シンボル/名前空間の解決に関して、CLマクロとは少し異なる動作をします。違いを解明するのに十分理解しているかどうかはわかりません。Clojureではgensymをそれほどいじる必要はありませんが、それは素晴らしいことです。

  • ClojureにはCLのような条件システムがありません。例外処理にはJavaのtry//しかありません。catchfinally

  • Clojureはユーザー定義のリーダーマクロを許可しません。

  • Clojureには複数の戻り値はありません。Clojureでの破棄は非常に優れており(リスト、ベクター、ハッシュマップ、セットなどをサポート)、デフォルトではCLよりも多くの場所に組み込まれているため、これは問題ではありません。

アプリとその記述方法によっては、CLからClojureに移植するのが実用的で簡単な場合もあれば、Clojureスタイルに合うように、より機能的でスレッドセーフな方法でゼロから書き直す方が実用的な場合もあります。 。

于 2009-02-27T20:45:57.710 に答える
8

具体的な答えはありませんが、次のリソースをお勧めします。

于 2009-02-27T16:54:00.373 に答える
6

CL から Clojure に移行したアカウントが多数あります (ブログ別のブログHN のスレッド)。

多くの Common Lispers が Clojure を最初にチェックアウトしたときに直面する最大の問題は、JVM では不可能なTail Call Optimizationがないことです。

于 2009-02-27T17:05:54.010 に答える
3

慣用的な CL コードの場合、これは書き直しです。

  • CL は必須であり、Clojure はより純粋に「機能的」です。
  • CL はオブジェクト指向 (CLOS) ですが、Clojure はそうではありません (Java オブジェクトを使用し、いくつかの OO メカニズムを備えています)。
  • 識別子と構文はほとんど異なります。
  • データ構造が異なります。
  • CL はほとんど厳密 (非遅延) であり、Clojure は遅延計算を使用します。

必要なインフラストラクチャ (CLOS、エラー処理、ストリーム) を Clojure に移植してもほとんど意味がありません。Clojure は実際にはプログラミング スタイルが異なる別の言語だからです。

コードを書き直したくない場合は、たとえば、JVM の Common Lisp であるABCLがあります。

于 2010-11-27T13:49:57.230 に答える