2012-04-09 23 views
5

Sé que anidar #,% es malo. Sin embargo, a menudo me encuentro escribiendo funciones anónimas cortas en línea que terminan teniendo exactamente 2 niveles de # /%.Anidamiento de # /% en macros de clojure

Por lo tanto, tengo curiosidad, ¿hay alguna manera de decirle a Clojure algo donde cada% se une al # más cercano (el más pequeño) #?

Gracias!

+1

leí esto dos veces, pero no puede entender cuál es su pregunta. ¿Podría aclararlo? Probablemente lo ayude a obtener una respuesta más útil. –

Respuesta

6

La anidación de funciones anónimas no es compatible con clojure.

Editar: Por "funciones anónimas" quise decir #(...), no (fn ...). Disculpas por la confusión.

+5

'(((fn [x] (fn [y] [x y])) 1) 2)' – danlei

+5

que no es correcto como muestra danlei. No se admite el uso anidado de la macro del lector # (...) para funciones anónimas; anidar utilizando 'fn' está bien. – Gert

+2

Sí, por supuesto. Mi comentario fue dirigido a la macro del lector, que fue el tema de la pregunta. –

8

Tener funciones anónimas anidadas está perfectamente bien. Solo tienes que usar la sintaxis no abreviada.

#(foo (bar %1) 
     (baz %2)) 

es equivalente a

(fn [x y] 
    (foo (bar x) 
     (bax y))) 

La variante completo se puede anidar arbitrariamente. Además, si usted tiende a utilizar map con fn mucho, considere el uso de for lugar (que tienden a ver más claro en mi opinión):

(map (fn [row] 
     (map (fn [col] 
       (+ (* 10 row) col)) 
      (range 3))) 
    (range 3)) 

hace lo mismo que

(for [row (range 3)] 
    (for [col (range 3)] 
    (+ (* 10 row) col)))