2016-12-31 41 views
1

让我们说,Clojure中我有这样定义的列表:使用List作为Clojure的函数体

(def function-body '(+ a b)) 

接下来我想用function-body列表作为函数的有效的机构,所以我想做这样的事情:

(defn my-sum [a b] function-body) 

产生:

(defn my-sum [a b] (+ a b)) 

有效期Clojure的鳕鱼即

这是可能用Clojure?如果我应该回归宏观,我应该使用什么样的扩展?

回答

1

你可能会想使用宏来此。代码,因为你有它只会返回列表'(+ a b),不做任何补充。

在另一方面有什么问题,你实际上是试图解决?我真的不明白为什么你会想要做这样的事情。你可能会问错误的问题。

+0

我试图去耦函数体和函数声明的建设。但我明白,也许最简单的方法是将列表包装在fn声明中并评估完整声明。你怎么看待这件事? –

+2

为了什么目的,你试图去耦合函数体和函数声明的构建。 – RedDeckWins

+0

因为这里的想法是从另一个数据结构(即地图)生成实体并可能操纵它们,然后将它们包装在函数声明中。我最终不想使用eval,虽然我明白,宏和eval让我有能力做我想做的每件事...... –

2

我怀疑你需要保持身体功能作为一种形式。函数本身,(fn [a b] (+ a b))在你的例子中,可以作为一个你可以作为参数传递的东西,在数据结构中作为一个元素使用,也可以用来调用参数。

你的目标可能是有几个功能可用,您可能会调用,根据情况而定。把它们作为功能,而不是形式。

1
(def function-body '(+ a b)) 
(eval `(defn ~'my-sum ~'[a b] ~function-body)) 

快速的解释:

; what we eval above is this: 
`(defn ~'my-sum ~'[a b] ~function-body) 
; which becomes this: 
; (clojure.core/defn my-sum [a b] (+ a b)) 
(my-sum 2 3) ; => 5 

宏将是非常相似的,即只是解除引用身体。

+0

是的,最终Eval是您唯一的朋友,可以轻松实现动态代码加载:) –