使用列表作为 Clojure 函数体

Use list as Clojure function body

假设在 Clojure 中我有一个定义如下的列表:

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

接下来我想使用 function-body 列表作为函数的有效主体,所以我想做类似的事情:

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

生产:

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

这是有效的 Clojure 代码。

这在 Clojure 中可行吗?如果我应该恢复到宏,我应该使用什么样的扩展?

您可能希望为此使用宏。您拥有的代码只是 return 列表 '(+ 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

宏会非常相似,即只是取消对主体的引用。