Clojure 从存储在变量中的表达式定义函数

Clojure 从存储在变量中的表达式定义函数,clojure,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. 问题是,我想把表达式存储在一个变量中,这样我就可以像 (def bar2 (list (first bar) 3 (nth bar 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.
问题是,我想把表达式存储在一个变量中,这样我就可以像

(def bar2 (list (first bar) 3 (nth bar 2)))
(#(bar2) 2) ;this line obviously doesn't work either.
也许除了
#
匿名函数读取器宏之外还有另一种方法


我正在为uni做一个基因编程的项目,所以我需要做的是有一个表达式,我可以把它修改成一个函数

如果您希望在运行时计算带引号的表达式(与编译时相反,即宏),您可以使用:

通常情况下,人们会避开
eval
(首先,宏的性能会更好),但这可能正是使用遗传算法所需要的

(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

您无法生成
(fn[x](*2 x))
有什么原因吗?即使出于某种原因,您在运行时将其作为列表获取,您也可以将其通过eval进行一次,以生成一个函数,然后存储并重用该函数。
(def bar '(* 2 p))

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

((eval f-expr) 3)
=> 6