Common Lisp アプリケーションを Clojure に移植することは、どの程度実用的ですか? より具体的に言うと、Common Lisp に存在し、Clojure には存在せず、書き直さなければならない機能は何ですか?
4 に答える
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
//しかありません。catch
finally
Clojureはユーザー定義のリーダーマクロを許可しません。
Clojureには複数の戻り値はありません。Clojureでの破棄は非常に優れており(リスト、ベクター、ハッシュマップ、セットなどをサポート)、デフォルトではCLよりも多くの場所に組み込まれているため、これは問題ではありません。
アプリとその記述方法によっては、CLからClojureに移植するのが実用的で簡単な場合もあれば、Clojureスタイルに合うように、より機能的でスレッドセーフな方法でゼロから書き直す方が実用的な場合もあります。 。
具体的な答えはありませんが、次のリソースをお勧めします。
- Rich Hickey の2 部構成のトーク Lisp プログラマーのための Clojure
- Peter Seibel のPractical Common Lispから Clojure への例の翻訳に関するStuart Halloway の作業。
慣用的な CL コードの場合、これは書き直しです。
- CL は必須であり、Clojure はより純粋に「機能的」です。
- CL はオブジェクト指向 (CLOS) ですが、Clojure はそうではありません (Java オブジェクトを使用し、いくつかの OO メカニズムを備えています)。
- 識別子と構文はほとんど異なります。
- データ構造が異なります。
- CL はほとんど厳密 (非遅延) であり、Clojure は遅延計算を使用します。
必要なインフラストラクチャ (CLOS、エラー処理、ストリーム) を Clojure に移植してもほとんど意味がありません。Clojure は実際にはプログラミング スタイルが異なる別の言語だからです。
コードを書き直したくない場合は、たとえば、JVM の Common Lisp であるABCLがあります。