2012-01-30 11 views
5

Vorrei trasformare String in elenchi. Ad esempio, http => (h t t p).Stringa da elencare senza # in comune lisp

cerco:

(defun string-to-list (s) 
    (assert (stringp s) (s) "~s :questa non e una stringa") 
    (coerce s 'list)) 

ma se lo faccio

(string-to-list "http") 

risultati:

(#\h #\t #\t #\p). 

Posso rimuovere # \? grazie in anticipo :)

risposta

16

Perché dovresti farlo? Quello che chiedi è dividere una stringa (una serie monodimensionale di caratteri) in una lista di simboli. Lo vuoi davvero?

#\h è un oggetto di carattere stampato.

È possibile stampare in modo diverso:

CL-USER 8 > (prinC#\h) 
h 

CL-USER 9 > (prin1 #\h) 
#\h 

Diamo stampare l'elenco utilizzando PRINC:.

CL-USER 10 > (map nil #'princ (coerce "Hello!" 'list)) 
Hello! 

Btw, dal momento che le stringhe, vettori e le liste sono sequenze, è possibile associare direttamente sopra la stringa ...

CL-USER 11 > (map nil #'princ "Hello!") 
Hello! 
3

È possibile trasformare una stringa in un simbolo con intern. Puoi trasformare un personaggio in una stringa con string. Interning una stringa minuscola potrebbe causare la stampa come |h| anziché h, quindi ti consigliamo di string-upcase esso. Mettere insieme tutto ciò dà:

(loop for c in (coerce "http" 'list) 
     collecting (intern (string-upcase (string c)))) 
+0

grazie! quindi non c'è modo di ottenere (h t t p) invece di (H T T P)? – r1si

+0

@ r1si: sto dimostrando un modo per farlo in una risposta aggiuntiva. Avrei usato il commento, ma sono dannosi per gli esempi di codice su più righe. –

3

Espandere la risposta di larsman, è possibile stampare wercase simboli non quotato se si cambia la readtable:

(let ((*readtable* (copy-readtable))) 
    (setf (readtable-case *readtable*) :preserve) 
    (prin1 (loop for c in (coerce "http" 'list) 
       collecting (intern (string c))))) 

Questo stamperà (h t t p) e tornare (|h| |t| |t| |p|).

3

È possibile stampare caratteri escape. Vedi la variabile *PRINT-ESCAPE*.

La funzione WRITE ha un parametro parola chiave per :ESCAPE che:

(defun string-to-list (s) 
    (assert (stringp s) (s) "~s :questa non e una stringa") 
    (write (coerce s 'list) :escape nil) 


CL-USER 11 > (string-to-list "abcd") 
(a b c d) 
(#\a #\b #\C#\d) 

Nell'esempio sopra del primo modulo è stampato chiamando WRITE e la seconda forma è il valore restituito stampato dal REPL.

+1

Stampando semplicemente l'intero elenco con 'princ' verranno stampati anche i suoi elementi senza caratteri di escape. –