Macros 在swap中使用字符串调用Clojure函数?
宏,Macros 在swap中使用字符串调用Clojure函数?,macros,clojure,Macros,Clojure,宏,transform,似乎适用于=>(transform![“foo”1 2 3])。其目的是接收一个列表,第一个元素是表示名称空间中函数的字符串。然后将所有内容包装到交换中 问题是转换不适用于=>(transform!coll),其中(def coll[“foo”1 2 3])。我得到了一个神秘的例外: #<UnsupportedOperationException java.lang.UnsupportedOperationException: nth not supported o
transform下面定义的代码>,似乎适用于=>(transform![“foo”1 2 3])
。其目的是接收一个列表,第一个元素是表示名称空间中函数的字符串。然后将所有内容包装到交换中代码>
问题是转换代码>不适用于=>(transform!coll)
,其中(def coll[“foo”1 2 3])
。我得到了一个神秘的例外:
#<UnsupportedOperationException java.lang.UnsupportedOperationException: nth not supported on this type: Symbol>
我觉得奇怪,它只适用于一种情况,而不适用于另一种情况。您正在向宏传递一个符号,即coll。它将尝试根据destructuring语句[f&args]分离该符号,这当然是不可能的
也可以使用(symbol)而不是(ns resolve*ns*symbol)。宏在编译时工作,并对代码而不是运行时数据进行操作。在(transform!coll)
的情况下,宏被传递一个未赋值的参数:符号coll
实际上,您不需要宏;一个常规函数就足够了:
(defn transform! [[f & args]]
(apply swap! *image* (resolve (symbol f)) args)))
在运行时解析vars可能被认为是一种代码味道,所以请考虑是否真的需要这样做
(defn transform! [[f & args]]
(apply swap! *image* (resolve (symbol f)) args)))