2012-10-07 16 views
6

estoy trabajando mi camino a través labrepl y vi algo de código que sigue este patrón:clojure: (aplicar coll fn) vs (aplicar # (aplicar coll fn% y))

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

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

Ésta parece ser equivalente a este patrón:

;; Pattern 
(apply f coll) 

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

son estos patrones equivalente? Si no, ¿cuál es la diferencia y cuándo usarías una sobre la otra?

Tomé la ex patrón de la step function en el laboratorio celular-autómatas de 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)))) 

Actualización: he añadido un ejemplo concreto de cada patrón para ayudar a hacer la pregunta más clara.

Respuesta

4

No, no hay ninguna diferencia. No hay razón para escribir la forma más larga; Solo puedo suponer que se llegó a cambios graduales en el código que tenían sentido al mismo tiempo.

+0

De acuerdo. Pensé que tal vez el parámetro podría hacer la diferencia, pero '(aplicar # (aplicar (fn [c] (mapa + c [1 1 1]))% &) [[-1 -1 -1]])' y ' (aplicar (fn [c] (mapa + c [1 1 1])) [[-1 -1 -1]]) 'fueron equivalentes. – noahlz

0

Esencialmente, ambas formas lograr lo mismo y son más o menos lo mismo. Cada uno proporciona una forma de introducir una función anónima.

Usando #(... es un lector de taquigrafía Clojure para una función anónima. Equivale a (fn [arg1 & args]..., pero no puede incrustar una función anónima #(... dentro de otra, y los argumentos se expresan como % %2... o %1 %2... en lugar de con el vector vinculante (fn [arg & args].

Ambos son métodos para expresar una función anónima. #(... se usa para funciones más simples, y (fn... se usa para funciones más detalladas.

#(... tiende a hacer las cosas un poco más ordenado.

+1

No se ... ¿por qué las dos funciones se aplican? – noahlz

+0

Mi pregunta no es sobre las diferentes sintaxis para funciones anónimas. Agregué ejemplos a mi pregunta para hacerlo más claro. – rigdern

+0

@rigdern usando 'fn' para representar cualquier función es engañoso, edité la pregunta – soulcheck