使用List作为Clojure的函数体
问题描述:
让我们说,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?如果我应该回归宏观,我应该使用什么样的扩展?
答
你可能会想使用宏来此。代码,因为你有它只会返回列表'(+ a b)
,不做任何补充。
在另一方面有什么问题,你实际上是试图解决?我真的不明白为什么你会想要做这样的事情。你可能会问错误的问题。
答
我怀疑你需要保持身体功能作为一种形式。函数本身,(fn [a b] (+ a b))
在你的例子中,可以作为一个你可以作为参数传递的东西,在数据结构中作为一个元素使用,也可以用来调用参数。
你的目标可能是有几个功能可用,您可能会调用,根据情况而定。把它们作为功能,而不是形式。
答
(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是您唯一的朋友,可以轻松实现动态代码加载:) –
我试图去耦函数体和函数声明的建设。但我明白,也许最简单的方法是将列表包装在fn声明中并评估完整声明。你怎么看待这件事? –
为了什么目的,你试图去耦合函数体和函数声明的构建。 – RedDeckWins
因为这里的想法是从另一个数据结构(即地图)生成实体并可能操纵它们,然后将它们包装在函数声明中。我最终不想使用eval,虽然我明白,宏和eval让我有能力做我想做的每件事...... –