2016-06-26 19 views
5

Sono molto nuovo nel clojure. Voglio stampare ogni elemento della lista in newline. Sto cercando in questo modo:Come stampare ogni elemento della lista in clojure di linea separato?

user=> (def my-list '(1 2 3 4 5)) 
;; #'user/my-list 
user=> my-list 
;; (1 2 3 4 5) 
user=> (apply println my-list) 
;; 1 2 3 4 5 
;; nil 

Ma io voglio che la mia uscita deve essere:

1 
2 
3 
4 
5 
nil 

qualcuno può dirmi, Come posso fare questo? Grazie.

risposta

6

Questo tipo di caso d'uso (eseguire un effetto collaterale una volta per ogni membro di una sequenza) è lo scopo di doseq. Utilizzando qui sarebbe come

(doseq [item my-list] 
    (println item)) 

Si noti che questo non stampanil ma restituirlo. Lavorando con esso in REPL vedremo i valori di ritorno di tutte le espressioni stampate, ma non accade ad es. avviare il tuo progetto come un programma terminale.

+0

okay. Ho la mia risposta Grazie. @Magos –

14

Se si dispone già di una funzione che si desidera applicare ad ogni elemento in una singola sequenza, è possibile utilizzare run! invece di doseq per una maggiore concisione:

(run! println [1 2 3 4 5]) 
;; 1 
;; 2 
;; 3 
;; 4 
;; 5 
;;=> nil 

doseq è utile quando l'azione che si vuole eseguire è più complicato rispetto all'applicazione di una singola funzione agli elementi in un'unica sequenza, ma qui lo standard run! funziona correttamente.

+0

Oh bello! Sembra un approccio migliore. Grazie. @Sam –

1

Un'altra strategia sarebbe quella di creare una stringa dall'elenco che si desidera stampare e quindi stampare semplicemente la stringa.

user> (defn unlines [coll] 
     (clojure.string/join \newline coll)) 
#'user/unlines 

user> (unlines [1 2 3 4 5]) 
"1\n2\n3\n4\n5" 

user> (println (unlines [1 2 3 4 5])) 
1 
2 
3 
4 
5 
nil 
+0

La differenza principale è quando la sequenza che si sta stampando è pigra; confronta '(esegui! println (intervallo))' e '(println (unlines (range)))'. –

+0

@SamEstep hai ragione, non è altrettanto utile su una lista infinita. Le sequenze pigre dovranno essere realizzate prima di costruire la stringa. Ma in generale, il confinare il codice che ha effetto collaterale sui confini non è una cattiva strategia. Una funzione che restituisce una stringa è molto più verificabile di una che stampa sulla console. –

+0

concordato. È solo una questione di quale compito specifico deve essere fatto. In questo caso particolare di stampa di cinque elementi già noti separati da newline, direi che la soluzione 'unlines' è migliore. Ma nel caso più generale di eseguire azioni (che possono coinvolgere input o output o entrambi) ripetutamente, precalcolare il risultato non è sempre un'opzione. –

Problemi correlati