2013-08-05 18 views

Odpowiedz

23
(map nil #'princ "bacon") 

lub

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

zapętlenie nad ciągiem można zrobić za pomocą loop tak:

(let ((string "bacon")) 

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

;=> bacon 
;=> NIL 

zebrać znaki w string jako listę użyj collect w pętli zamiast do tak jak:

(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

można też użyć 'print' zamiast' princ' –

+11

Ty Don't trzeba odjąć 1 od długości. Użyj 'PONIŻEJ'. Rzeczywiście nie potrzebujesz indeksu w LOOP, aby iterować po ciągu znaków w ogóle. Użyj 'ACROSS'. Również konwersja znaku na ciąg nie ma sensu. 'PRINC' może drukować znaki. Tak więc "STRING" jest odpadem. Możesz również użyć 'WRITE-CHAR', która jest nieco bardziej niskiego poziomu. '(" b "" a "" c "" o "" n ")' nie jest także listą znaków. Jest to lista ciągów. –

+0

@RainerJoswig Nie sądzę, żebym kiedykolwiek powiedział, że zwrócił listę * znaków * - Powiedziałem, że zebrał on znaki na * liście *, ale to niekoniecznie oznacza, że ​​zapisał je * jako * postacie. Chciałem tylko, żeby były przetwarzane indywidualnie. –