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.

也许除了#匿名函数阅读器宏之外还有另一种方法。

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

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

如果您想在运行时评估引用的表达式(与编译时相反,à la 宏),您可以使用eval

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

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

通常一个人会避开eval(一方面宏会表现得更好),但它可能是你想要玩遗传算法的东西。

于 2013-03-25T18:24:01.853 回答