clojure :(应用fn coll)vs(应用#(应用fn%&)coll)

时间:2012-10-07 00:19:19

标签: clojure

我正在通过labrepl工作,我看到了一些遵循这种模式的代码:

;; Pattern
(apply #(apply f %&) coll)

;; Concrete example
user=> (apply #(apply + %&) [1 2 3 4])
10

这似乎与这种模式相同:

;; Pattern
(apply f coll)

;; Concrete example
user=> (apply + [1 2 3 4]) 
10

这些模式是否相同?如果没有,有什么区别,什么时候使用一个而不是另一个?

我采用了labrepl的细胞自动机实验室step function中的前一种模式:

(defn step
  "Advance the automation by one step, updating all cells."
  [board]
  (doall
   (map (fn [window]
          (apply #(apply map brians-brain-rules %&)
                 (doall (map torus-window window))))
        (torus-window board))))

更新:我添加了每个模式的具体示例,以帮助提高问题的清晰度。

2 个答案:

答案 0 :(得分:4)

不,没有区别。没有理由写更长的形式;我只能假设它是通过逐渐改变代码来实现的。

答案 1 :(得分:0)

基本上,两种形式完成相同的事情并且或多或少相同。每个都提供了一种引入匿名函数的方法。

使用#(...是匿名函数的Clojure读者简写。它有点等同于(fn [arg1 & args]...,但是你不能在另一个#(...中嵌入一个% %2...匿名函数,参数表示为%1 %2...(fn [arg & args]而不是向量绑定{{} 1}}。

两者都是表达匿名函数的方法。 #(...用于更简单的函数,(fn...用于更详细的函数。

#(...往往让事情看起来更整洁。