2012-01-30 6 views
5

Я хотел бы превратить String в списки. Например, http => (h t t p).Строка в список без # в общем lisp

Стараюсь:

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

, но если я

(string-to-list "http") 

результаты:

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

Могу ли я удалить # \? заранее!

ответ

16

Зачем вам это нужно? Вы просите разбить строку (одномерный массив символов) на список символов. Вы действительно этого хотите?

#\h - персональный объект, напечатанный.

Вы можете напечатать их по-разному:

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

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

Давайте распечатывает список с помощью PRINC:.

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

Btw, так как строки, векторы и списки последовательности, вы можете МАП непосредственно над строкой ...

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

Вы можете превратить строку в символ с intern. Вы можете превратить символ в строку с string. Ввод строки нижнего регистра может привести к тому, что она будет напечатана как |h| вместо h, поэтому вы должны будете указать string-upcase. Вводя все это вместе:

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

спасибо! поэтому нет способа привести (h t t p) вместо (H T T P)? – r1si

+0

@ r1si: Я демонстрирую способ сделать это в дополнительном ответе. Я бы использовал комментарий, но они плохо подходят для примеров с несколькими линиями. –

3

Расширяясь от ответа larsmans, вы можете распечатать lo wercase символы в кавычки, если вы измените readtable:

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

Это будет печатать (h t t p) и вернуть (|h| |t| |t| |p|).

3

Вы можете печатать символы, не привязанные к экрану. См. Переменную *PRINT-ESCAPE*.

Функция WRITE имеет параметр ключевого слова :ESCAPE для этого:

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

В приведенном выше примере первой форме печатаются путем вызова WRITE и вторая формой является возвращаемым значением отпечатано РЕПЛ.

+1

Просто распечатать весь список с помощью 'princ' также распечатает свои элементы без сохранения. –

Смежные вопросы