要在常见的lisp中列出没有#\的字符串

时间:2012-01-30 15:59:39

标签: lisp common-lisp

我想把String变成列表。例如,http => (h t t p)。

我试试:

(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 个答案:

答案 0 :(得分:19)

你为什么这样做?你要问的是将一个字符串(一维字符数组)拆分成一个符号列表。你真的想要吗?

#\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!

答案 1 :(得分:3)

您可以使用intern将字符串转换为符号。您可以使用string将字符转换为字符串。对小写字符串进行实习可能会导致它打印为|h|而不是h,因此您需要string-upcase它。把所有这些放在一起给出了:

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

答案 2 :(得分:3)

根据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 :(得分: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打印的,第二个表单是由REPL打印的返回值。

相关问题