昨天我问了一个类似的问题,但似乎我不得不改变方法,所以我做了,但现在我又被卡住了。
无论如何,我想做的事情就是
(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.
也许还有另一种方法,而不是#
匿名函数阅读器宏。
我正在为uni进行遗传编程项目,所以我需要做的是有一个表达式,我可以改变并制作成一个函数。
答案 0 :(得分: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
答案 1 :(得分:1)
如果要在运行时评估引用的表达式(而不是编译时,单个宏),可以使用eval
:
(eval '(* 10 12))
;=> 120
(def arg 12)
(def bar '(* 10 arg))
(eval bar)
;=> 120
通常情况下,一个人避开eval
(一方面宏会表现得更好),但它可能是您想要使用遗传算法的。