2013-08-05 16 views

risposta

23
(map nil #'princ "bacon") 

o

(loop for c across "bacon" do (princ c)) 
3

Looping su una stringa può essere fatto utilizzando loop in questo modo:

(let ((string "bacon")) 

    (loop for idex from 0 to (- (length string)) 1) 
     do 
     (princ (string (aref string idex))))) 

;=> bacon 
;=> NIL 

di raccogliere i personaggi in string come lista uso collect nel ciclo, invece di do in questo modo:

(let ((string "bacon")) 

    (loop for idex from 0 to (- (length string)) 1) 
     collect 
     (princ (string (aref string idex))))) 

;=> bacon 
;=> ("b" "a" "c" "o" "n") 
+0

si potrebbe anche usare 'print' invece di' princ' –

+11

Non avete bisogno di sottrarre 1 dalla lunghezza. Usa 'BELOW'. In realtà non è necessario un indice in LOOP per iterare su una stringa. Usa 'ACROSS'. Anche la conversione di un carattere in una stringa non ha senso. 'PRINC' può stampare caratteri. Quindi 'STRING' è uno spreco. Puoi anche usare 'WRITE-CHAR', che è leggermente più a basso livello. '(" b "" a "" c "" o "" n ")' non è anche un elenco di caratteri. È una lista di stringhe. –

+0

@RainerJoswig Non penso di aver mai detto che ha restituito un elenco di * caratteri * - Ho detto che raccoglieva i caratteri in un * elenco *, ma questo non significa necessariamente che li ha memorizzati * come * personaggi. Volevo solo dire che sono stati elaborati individualmente. –