在公共lisp中列出不带#\的字符串

在公共lisp中列出不带#\的字符串,lisp,common-lisp,Lisp,Common Lisp,我想把字符串转换成列表。例如,http=>(htp) 我尝试: (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). 我可以删除吗? 提前感谢:)您可以使用intern将字符串转换为符号。您可以使用string将字符转换为字符串

我想把字符串转换成列表。例如,http=>(htp)

我尝试:

(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).
我可以删除吗?
提前感谢:)

您可以使用
intern
将字符串转换为符号。您可以使用
string
将字符转换为字符串。插入小写字符串可能会导致将其打印为
|h |
,而不是
h
,因此您需要
字符串大写。把所有这些放在一起可以得到:

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

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

#\h
是打印的字符对象

您可以以不同方式打印它们:

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

CL-USER 9 > (prin1 #\h)
#\h
让我们使用
PRINC
打印列表:

CL-USER 10 > (map nil #'princ (coerce "Hello!" 'list))
Hello!
顺便说一句,因为字符串、向量和列表都是序列,所以可以直接映射到字符串上

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

根据larsmans的答案展开,如果更改可读表,则可以打印不带引号的小写符号:

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

这将打印
(http)
并返回
(|h | t | t | t | p |)

您可以打印不带转义的字符。请参阅变量
*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打印的返回值。

谢谢!所以没有办法得到(htp)而不是(htp)?@r1si:我在另一个答案中演示一种方法。我可能会使用注释,但它们不适合多行代码示例。只需使用
princ
打印整个列表,也会打印其未替换的元素。