Строка в списке без # \ в общем lisp - PullRequest
7 голосов
/ 30 января 2012

Я бы хотел превратить String в списки.Например, http => (http).

Я пытаюсь:

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

Могу ли я удалить # \?заранее спасибо :)

Ответы [ 4 ]

19 голосов
/ 30 января 2012

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

#\h - это напечатанный символьный объект.

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

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

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

Давайте распечатать список, используя PRINC:

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

Кстати, поскольку строки, векторы и списки являются последовательностями, вы можете MAP непосредственно над строкой ...

CL-USER 11 > (map nil #'princ "Hello!")
Hello!
3 голосов
/ 31 января 2012

Вы можете печатать символы без экранирования.См. Переменную *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и вторая форма - возвращаемое значение, напечатанное REPL.

3 голосов
/ 30 января 2012

Расширяя ответ larsmans, вы можете печатать строчные символы без кавычек, если вы измените читаемую таблицу:

(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 голосов
/ 30 января 2012

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

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