2016-12-06 10 views
2

I次のマクロがあります:私はこれを期待 マクロは匿名関数を返すことはできませんか? Clojureの

(defmacro anon-mac [value] 
    #(+ value 1)) 

のような振る舞いをする:私は何をすべき

IllegalArgumentException No matching ctor found for class user$anon_mac$fn__10767 clojure.lang.Reflector.invokeConstructor (Reflector.java:163) 

((anon-mac 1) 1) ;=> 2 

は、しかし、私はこのエラーを取得しますこのマクロが私が期待するように機能する無名関数を返すことができるようにするには?

答えはマクロでなければなりません。私の質問は、なぜ答えはマクロでなければならない、無名関数

を返すためにマクロの能力に関係するようを見て?私の場合は、この変換がコンパイル時に何度も呼び出されるのを避けるためです。この変換をforループで200回呼び出した場合、関数を使用すると変換は200回実行されます。しかし、コード自体を編集するマクロを見ると、forループのために一度だけ実行されます。

答えて

3

そうのような内部変数を評価しながら、私は単に機能を脱出するために必要な:あなたはそれを使用している

(defmacro anon-mac [value] `#(+ % ~value)) 
3

わからない、しかし、あなたが機能して行きたいと思った場合、あなたはpartialは役に立ち見つけるかもしれませんそれはあなたが後にしている行動を提供するからです。

(defn anon-partial [val] (partial + val)) 
((anon-partial 1) 1) ;;=> 2 

clojuredocs.orgpartialのいくつかの有用な例もあります。

+0

これは当てはまります。私の特別なケースは、私が提供した例より複雑であり、コンパイル時に解釈が必要です。ありがとう! –

+0

@JasonBasanese、あなたが解決しようとしている実際の問題を明確かつ簡単な言葉で述べてください。単に「私の特別なケースはもっと複雑です」と言っても、誰にも良いことはありません。それがもっと複​​雑なら、あなたの質問はより複雑になるはずです。あなたは最終目標が何であるかを推測する必要がないので、より良い答えが得られます。 –

+0

私は混乱のために謝罪します。私はマクロを使用しないことは選択肢ではないことを含めるために私の質問を明確にします。 –

関連する問題