在公共lisp中列出不带#\的字符串
我想把字符串转换成列表。例如,http=>(htp) 我尝试:在公共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将字符转换为字符串
(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
打印整个列表,也会打印其未替换的元素。