我正在通过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的细胞自动机实验室中从阶跃函数中获取了前一种模式:
(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))))更新:--我添加了每种模式的具体示例,以帮助使问题更加清晰。
发布于 2012-10-07 01:07:51
不,没什么区别。没有理由编写更长的表单;我只能假设它是通过对代码的渐变来实现的,这些代码在同一时间是有意义的。
发布于 2012-10-07 00:42:17
本质上,这两种形式完成了相同的事情,或多或少是一样的。它们都提供了一种引入匿名函数的方法。
使用#(...是匿名函数的Clojure阅读器的缩写。它在某种程度上等同于(fn [arg1 & args]...,但不能将一个#(...匿名函数嵌入另一个函数中,并且参数被表示为% %2...或%1 %2...,而不是使用向量绑定(fn [arg & args]。
两者都是表示匿名函数的方法。#(...用于更简单的函数,(fn...用于更详细的函数。
#(...会使事情看起来更整洁一些。
https://stackoverflow.com/questions/12765035
复制相似问题