从存储在var中的表达式定义函数

时间:2013-03-25 17:55:57

标签: clojure

昨天我问了一个类似的问题,但似乎我不得不改变方法,所以我做了,但现在我又被卡住了。

无论如何,我想做的事情就是

(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进行遗传编程项目,所以我需要做的是有一个表达式,我可以改变并制作成一个函数。

2 个答案:

答案 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(一方面宏会表现得更好),但它可能是您想要使用遗传算法的。