2012-01-30 8 views
5

Me gustaría convertir Cadena en listas. Por ejemplo, http => (h t t p).Cadena para listar sin # en lisp común

Trato:

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

pero si lo hago

(string-to-list "http") 

resultados:

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

puedo eliminar # \? gracias de antemano :)

Respuesta

16

¿Por qué harías eso? Lo que usted pregunta es dividir una cadena (una matriz unidimensional de caracteres) en una lista de símbolos. ¿De verdad quieres eso?

#\h es un objeto de personaje impreso.

Se puede imprimir de forma diferente:

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

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

Vamos a imprimir la lista con PRINC:.

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

Por cierto, desde cadenas, vectores y las listas son secuencias, puede asignar directamente sobre la cuerda ...

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

Puede convertir una cadena en un símbolo con intern. Puede convertir un personaje en una cadena con string. Si introduce una cadena en minúsculas, puede imprimirse como |h| en lugar de h, por lo que querrá string-upcase. Poniendo todo eso junto da:

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

gracias! entonces no hay forma de resultar (h t t p) en lugar de (H T T P)? – r1si

+0

@ r1si: Estoy demostrando una manera de hacerlo en una respuesta adicional. Hubiera usado el comentario, pero son malos para los ejemplos de código de varias líneas. –

3

Ampliando la respuesta de larsmans, puede imprimir lo wercase símbolos no cotizado, si cambia el readtable:

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

Esto imprimirá (h t t p) y volver (|h| |t| |t| |p|).

3

Puede imprimir caracteres sin guardar. Vea la variable *PRINT-ESCAPE*.

La función WRITE tiene un parámetro de palabra clave :ESCAPE para que:

(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) 

En el ejemplo por encima de la primera forma se imprime llamando WRITE y la segunda forma es el valor de retorno impreso por el REPL.

+1

Simplemente imprimiendo toda la lista con 'princ' también imprimirá sus elementos sin guardar. –

Cuestiones relacionadas