2012-04-09 19 views
5

So che nidificare #,% è sbagliato, tuttavia spesso mi trovo a scrivere brevi funzioni anonime online che hanno esattamente 2 livelli di # /%.Nidificazione di # /% nelle macro di clojure

Quindi, sono curioso, c'è un modo per dire al clojure qualcosa in cui ogni% è legata al più vicino (il più piccolo racchiude) #?

Grazie!

+1

ho letto due volte, ma non riesco a capire quale sia la tua domanda. Potresti per favore chiarirlo? Probabilmente ti aiuterà a ottenere una risposta più utile. –

risposta

6

L'annidamento di funzioni anonime non è supportato in clojure.

Modifica: Per "funzioni anonime" intendevo #(...), non (fn ...). Scuse per la confusione.

+5

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

+5

che non è corretto come mostra danlei. L'uso annidato della macro del lettore # (...) per le funzioni anonime non è supportato; l'annidamento con 'fn' va bene. – Gert

+2

Sì, certo. Il mio commento era diretto alla macro del lettore, che era l'argomento della domanda. –

8

L'uso di funzioni anonime nidificate è perfettamente corretto. Devi solo usare la sintassi non abbreviata.

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

è equivalente a

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

La variante completa può essere nidificate arbitrariamente. Inoltre, se si tende a usare map con fn sacco, considerare l'utilizzo di for invece (che tendono a guardare più chiaro a mio parere):

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

fa la stessa cosa di

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