2009-07-23 15 views
7

Ho una funzione chiamata show che mostra una finestra di dialogo con il messaggio. Devo mappare questa funzione a tutti gli elementi in alist. Ma Clojure non mi mostra alcun messaggio. Che cosa sto facendo di sbagliato?Perché Clojure non esegue affatto questa funzione?

(defn show[message] 
(. javax.swing.JOptionPane (showMessageDialog nil message))) 

(defn action[] 
    (map show '(HELLO Sweet love))) 

risposta

5

la funzione mappa non esegue effettivamente la funzione mappata su ciascun memeber della raccolta. piuttosto restituisce una cella "pigro-cons". questo assomiglia molto al tuo classico elenco linkato singolarmente con una differenza molto importante, i dati in ogni cella sono calcolati nel momento in cui viene letto non nel momento in cui è definito (questo risultato è ovviamente memorizzato per le letture successive). Quindi, per far funzionare la funzione, è necessario leggere il risultato dell'esecuzione della funzione. Perché in questo caso non vi preoccupate circa il risultato della funzione unica che ha funzionato clojure fornisce una grande funzione wrapper chiamato

(dorun .... insert your map here ....) 

che creerà la mappa, leggere i risultati e prontamente li buttare fuori con fuori sprecare la memoria memorizzare loro per dopo.

Se si esegue il mapping di una funzione con i risultati che si desidera conservare, utilizzare invece doseq.

+0

Grazie per la risposta dettagliata. Tutte le astrazioni sono pigri? Come faccio a sapere quali sono e quali no? – unj2

+0

credo che siano tutti tranne l'inverso, sebbene i vettori abbiano una funzione (rsec [1 2 3]) che crea un secondo che inizia alla fine e che di solito risolve il problema. –

7

map è pigro. Nulla verrà valutato finché non lo imporrà di essere valutato. O (dorun (action)) oppure utilizzare doseq anziché map.

Problemi correlati