2

昨日も同じような質問をしましたが、アプローチを変えなければならなかったようで、そうしましたが、今はまた行き詰まっています。

とにかく、私がやりたいのは

(def bar '(* 2 %))
(#(bar) 2) ;this line doesn't work.
(#(* 2 %) 2) ;this is what I want the line that doesn't work to do.

つまり、式をvarに格納して、次のようなことができるようにしたいのです。

(def bar2 (list (first bar) 3 (nth bar 2)))
(#(bar2) 2) ;this line obviously doesn't work either.

#たぶん、無名関数リーダーマクロ以外のアプローチがあります。

私は大学の遺伝的プログラミングのプロジェクトをやっているので、私がしなければならないのは、私が変更して関数にすることができる式を持っていることです。

4

2 に答える 2

2
(def bar '(* 2 %))

((eval (read-string (str "#" bar))) 3)
=> 6

式で名前付きパラメーターを使用した場合、見た目はすっきりします。

(def bar '(* 2 p))

(def f-expr (concat '(fn [p]) [bar]))

((eval f-expr) 3)
=> 6
于 2013-03-26T01:10:36.170 に答える
1

実行時に(コンパイル時のマクロではなく)引用符で囲まれた式を評価する場合は、次を使用できevalます。

(eval '(* 10 12))
;=> 120

(def arg 12)
(def bar '(* 10 arg))
(eval bar)
;=> 120

通常、1つは回避しevalます(マクロのパフォーマンスが向上します)が、遺伝的アルゴリズムで遊ぶために必要な場合もあります。

于 2013-03-25T18:24:01.853 に答える