我对Clojure中的线程宏可能有所遗漏。
我有一个值为映射的地图,我想在另一个查找结果中查找。让地图简单些:{:a {:b 2}}
-- 首先,我想查找键:a
,这将产生{:b 2}
,然后查找b
,结果是2
。第二个查找的关键字需要是函数的结果。
((fn [x] (get x :b)) ({:a {:b 2} } :a ))
=> 2
好的,让我们使用线程宏使其更易读。
(-> {:a {:b 2} } :a (fn [x] (get x :b)))
即,在地图上将:a
作为函数应用,然后应用另一个函数。这样做是不起作用的:CompilerException java.lang.IllegalArgumentException: Parameter declaration :a should be a vector
奇怪的是,如果将匿名函数提取到命名函数中,则可以正常工作:
(defn f [x] (get x :b))
(-> {:a {:b 2} } :a f)
=> 2
甚至可以这样说:
(def f (fn [x] (get x :b)) )
(-> {:a {:b 2} } :a f)
=> 2
为什么命名函数和匿名函数的工作方式存在差异?
fn
,而是对fn
的调用。 - noisesmith