6

ClojureとF#がDSLを作成するためにどのような機能を備えているかを判断しようとしています。DSLを作成および操作するために、それぞれがどのような機能を提供しますか?

F#は静的に型指定されているので、これによりこの特定のタスクがより困難になりますか?Clojureの部分では、私は実際の経験はありませんが、すべてのLISPはメタプログラミング/DSLに最適であることが知られています。

私の質問は、両方の言語間で戦争などを行うことを意図したものではありません。私が最近両方について質問しているのは、両方が素晴らしいと思い、2つの詳細についてもっと知りたいからです。

インテンショナルプログラミングについて何日か読んだ後、DSLやその他すべてへの興味をよみがえらせました。

私はF#についてある程度の知識を持っていますが、引用符などを使用してまだ何も開発していないのは事実です。面白そうな識別された共用体に基づくDSLの例を見てきました。

4

2 に答える 2

5

最終的にはどの言語でも DSL を作成できます。

Clojure やその他の Lisp が特にユニークで、メタプログラミングに適している理由は、それらがホモイコニックであることです。つまり、言語自体が同じ言語のデータ構造で自然に表現されます。Lisp では、効果的にASTとして直接コードを記述しています。

これは驚くほど強力です。つまり、コード生成は、比較的単純なデータ構造を作成することと事実上同等であることを意味します。また、この言語は、マクロを介してコンパイル時に任意のコードを生成する機能を提供します。これにより、必要な特定の DSL をサポートするために「言語を拡張」することが効果的に可能になります。

例として、私は最近for、Clojure で命令型ループが必要であることに気付きました (関数型プログラミングの純粋主義者には申し訳ありませんが、必要になる場合もあります....)。これを言語に追加すると、次のようになります。

(defmacro for-loop [[sym init check change :as params] & steps]
  `(loop [~sym ~init value# nil]
     (if ~check
       (let [new-value# (do ~@steps)] (recur ~change new-value#))
       value#)))

だから今私はできる:

(for-loop [i 0 (< i 10) (inc i)]
   (println i))
=> < prints numbers from 0..9 >

これは明らかに単純な例ですが、必要なコードに正確に展開される一連の短いマクロを作成することによって新しい言語構造を生成する機能により、DSL の構築が特に簡単になることは明らかです。

あなたが面白いと思うかもしれないいくつかの読書/リンク:

于 2012-06-01T10:19:33.740 に答える