6

我正在通过 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 函数中获取了前一种模式:

(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))))

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

4

2 回答 2

4

不,没有区别。没有理由写更长的形式;我只能假设它是通过对曾经有意义的代码进行逐步更改来实现的。

于 2012-10-07T01:07:51.290 回答
0

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

Using#(...是匿名函数的 Clojure 阅读器简写。它有点等价于(fn [arg1 & args]...,但您不能将一个#(...匿名函数嵌入另一个匿名函数中,并且参数表示为% %2...or%1 %2...而不是向量绑定(fn [arg & args]

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

#(...倾向于使事情看起来更整洁。

于 2012-10-07T00:42:17.563 回答