11

私は Clojure プロジェクトに取り組んでおり、DSL 用の Clojure マクロを書いていることがよくありますが、会社が実際の仕事で Clojure をどのように使用しているかを示す Clojure ビデオを見ていました。 DSL では、マクロを使用して構文糖衣を少し追加するだけです。これは、標準関数を使用して DSL を記述し、最後にいくつかのマクロを追加する必要があるということですか?

更新: この質問に対するさまざまな (そして面白い) 回答を読んだ後、多くの理由から、答えが最初に考えたほど明確ではないことに気付きました。

  1. アプリケーションにはさまざまな種類の API があります (内部、外部)

  2. API のユーザーにはさまざまなタイプがあります (何かをすばやく実行したいだけのビジネス ユーザー、Clojure エキスパート)。

  3. 定型コードを隠すマクロはありますか?

私は離れて質問についてもっと深く考えますが、あなたの答えは私に多くの考えを与えてくれたのでありがとう. また、Paul Graham が Christophe のビデオとは反対のことを考えており、マクロはコードベースの大部分 (25%) であるべきだと考えていることにも気付きました。

http://www.paulgraham.com/avg.html

4

4 に答える 4

12

これは、DSL の使用/目的にある程度依存すると思います。

Clojure コードで使用するライブラリのような DSL を作成していて、それを機能的な方法で使用したい場合は、マクロよりも関数を使用することをお勧めします。関数は高次関数などに動的に構成できるため、Clojure ユーザーにとって「便利」です。たとえば、Ringのような関数型 Web フレームワークを作成しているとします。

他の Clojure コードとはかなり独立して使用される命令型 DSL を作成していて、高階関数は絶対に必要ないと判断した場合、使用方法はほぼ同じであり、最も理にかなったものを選択できます。たとえば、ある種のビジネス ルール エンジンを作成する場合があります。

パフォーマンスの高いコードを生成する必要がある特殊な DSL を作成している場合、ほとんどの場合、マクロを使用することをお勧めします。これは、効率を最大限に高めるためにコンパイル時にマクロが展開されるためです。たとえば、正確に正しい順序の OpenGL 呼び出しに展開する必要があるグラフィックス コードを作成しているとします。

于 2011-03-28T12:57:50.133 に答える
7

はい!

可能な限り関数を記述します。関数で十分な場合は、決してマクロを記述しないでください。多くのマクロを記述すると、拡張がはるかに難しいものになってしまいます。たとえば、マクロを適用したり、渡したりすることはできません。

Christophe Grand: (not= DSL マクロ)

http://clojure.blip.tv/file/4522250/

于 2011-03-28T10:09:49.457 に答える
3

いいえ!

マクロを広範囲に使用することを恐れないでください。疑わしい場合は、常にマクロを記述してください。関数はDSLの実装には劣ります。マクロはコンパイル時に多くの重い計算を実行できるのに対し、関数はランタイムに負担をかけます。たとえば、埋め込まれたPrologをインタプリタ関数として実装することと、Prologを何らかの形式のWAMにコンパイルするマクロとして実装することの違いを考えてみてください。

そして、「マクロを適用したり、回したりすることはできない」と言う人の言うことを聞かないでください。この議論は完全にストローマンです。それらの人々はコンパイラよりもインタプリタを提唱していますが、それは単にばかげています。

マクロを使用してDSLを実装する方法に関するいくつかのヒント:

  • 段階的に行います。DSLから基盤となるClojureまでの言語の長いチェーンを定義します。各変換を可能な限り単純に保ちます。これにより、DSLコンパイラを簡単に保守およびデバッグできるようになります。
  • DSLを実装するときに再利用するDSLコンポーネントのツールボックスを準備します。異なるセマンティクスのターゲット言語を含める必要があります(たとえば、型なしの熱心な機能-それはClojure自体、型なしの怠惰な機能、一階述語論理、型付きの命令型、Hindley-Millner型の熱心な機能、データフローなど)。マクロを使用すると、対象となるすべてのセマンティクスのプロパティをシームレスに組み合わせるのは簡単です。
  • コンパイラ構築ツールのセットを保守します。パーサジェネレータ(DSLが完全にS式である場合でも便利)、用語書き換えエンジン、パターンマッチングエンジン、グラフ上のいくつかの一般的なアルゴリズムの実装(グラフ彩色など)などを含める必要があります。
于 2011-03-28T10:37:11.393 に答える
2

Here's an example of a DSL in Haskell that uses functions rather than macros:

http://contracts.scheming.org/

Here is a video of Simon Peyton Jones giving a talk about this implementation:

http://ulf.wiger.net/weblog/2008/02/29/simon-peyton-jones-composing-contracts-an-adventure-in-financial-engineering/

Leverage the characteristics of Clojure and FP before going down the path of implementing your own language. I think SK-logic's tips give you a good indication of what is needed to implement a full blown language. There are times when it's worth the effort, but those are rare.

于 2011-03-28T12:19:33.760 に答える