Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 在swap中使用字符串调用Clojure函数?_Macros_Clojure - Fatal编程技术网

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)))