我可以使用以下语法
从函数返回一个映射(defn retmap [bar] { :foo bar })
如何使用reader宏语法实现相同的功能?我试过跟着
(def retmap #({:foo %}))
但是调用此函数(retmap)
会出现错误
clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentArrayMap
答案 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}