4

Common LISPでは、次のことができます

(macro lambda (x) (list (quote car) (list (quote cdr) x)))

Clojureではこれは不可能(匿名マクロ)のようです。

  1. これは本当ですか?
  2. なぜこれが省略されたのですか?
4

2 に答える 2

4

にはいくつかmacrolet(または他のもの)がありclojure.contrib.macro-utilsます。しかし、それは私にとってハックのようなにおいがします。の包含clojure.coreはTODOレーダーにありますが、現時点では優先度は高くありません。

編集:ここhttp://dev.clojure.org/display/design/letmacroも参照してください。

于 2010-11-02T07:03:27.880 に答える
1

Clojureが現在(バージョン1.2以降)defmacroで定義された名前付きマクロのみをサポートしていることは(ドキュメントソースを読んで)私の理解です。

ただし、匿名変数でJava関数Var.setMacro()を直接呼び出すことにより、Clojureの内部を悪用して、ある種の匿名マクロを取得することができます。これは、defmacroが内部でマクロを構築するために使用するものです。

たとえば、次のことができます。

(def macro-var (var (fn [...] ...)))

(.setMacro macro-var)

その後、Clojureリーダーはmacro-varに含まれるvarをマクロとして解釈します。ただし、すべてを正しく定義する方法を理解する必要があり、Clojureの将来のバージョンではすべてが機能しなくなる可能性があります。

Clojure 1.3(現在はアルファ版ですが、完全に機能します)は、シンボルマクロなど、他のさまざまな拡張機能を提供するため、一見の価値があります。

于 2010-11-02T12:39:19.980 に答える