Clojure:从reader宏函数返回map时的clojure.lang.ArityException

时间:2017-04-27 12:55:25

标签: clojure functional-programming

我可以使用以下语法

从函数返回一个映射
(defn retmap [bar] { :foo bar })

如何使用reader宏语法实现相同的功能?我试过跟着

(def retmap #({:foo %}))

但是调用此函数(retmap)会出现错误

clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentArrayMap

2 个答案:

答案 0 :(得分:2)

您可以使用hash-map

(def retmap #(hash-map :foo %))

您可以通过展开宏来了解示例为什么抛出异常:

(macroexpand `#({:foo %}))
=> (fn* [x] ({:foo x}))

因此,构造的映射会立即作为没有参数的函数调用。映射是从键到值的函数,因此需要提供参数。

答案 1 :(得分:1)

另一个有时非常方便的答案是使用identity

(def retmap #(identity {:foo %}))

当您被迫使用某个功能时,会使用identity功能,但您不希望它执行任何操作

(identity {:foo 42})  => {:foo 42}

(def retmap #(identity {:foo %}))
(retmap 42)  ;=>  {:foo 42}