Clojure China

Function literals 无法这般#(%)使用?

clojure
#1
(map #(%) {:a \a})
 ;;;=> ArityException Wrong number of args (0) passed to: MapEntry
(map identity {:a \a})
 ;;;=>  ([:a \a])
(map (fn [x] x) {:a \a}) ;
;;=> ([:a \a])

第一种写法是错误的,因为%就是[:a \a]这样的MapEntry,而我们知道[:a \a]在这里是被当做函数了,它缺少参数。
除此之外,Function literals也不可嵌套使用。

所以,大家还遇到哪些Function literals的限制呢?

#2

#(%) 相当于 (fn [x] (x)),也就是把参数当作函数调用。一个可行的例子:

(let [f1 (constantly 1)
      f2 (constantly 2)
      fns [f1 f2]]
  (map #(%) fns))

;; (1 2)

也就是说,#() 隐含了 函数调用 的 “语句”。如果一定要用 #(),可以这样达到跟直接用 identity 一样的效果:

#(identity %)