Common LISPでは、次のことができます
(macro lambda (x) (list (quote car) (list (quote cdr) x)))
Clojureではこれは不可能(匿名マクロ)のようです。
- これは本当ですか?
- なぜこれが省略されたのですか?
Common LISPでは、次のことができます
(macro lambda (x) (list (quote car) (list (quote cdr) x)))
Clojureではこれは不可能(匿名マクロ)のようです。
にはいくつかmacrolet
(または他のもの)がありclojure.contrib.macro-utils
ます。しかし、それは私にとってハックのようなにおいがします。の包含clojure.core
はTODOレーダーにありますが、現時点では優先度は高くありません。
編集:ここhttp://dev.clojure.org/display/design/letmacroも参照してください。
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(現在はアルファ版ですが、完全に機能します)は、シンボルマクロなど、他のさまざまな拡張機能を提供するため、一見の価値があります。