使用列表作为 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
宏会非常相似,即只是取消对主体的引用。
假设在 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
宏会非常相似,即只是取消对主体的引用。