【问题标题】:String to list without #\ in common lisp在普通 lisp 中不带 #\ 列出的字符串
【发布时间】:2012-01-30 15:59:38
【问题描述】:

我想把 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).

我可以删除 #\ 吗? 在此先感谢:)

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢!所以没有办法得到 (h t t p ) 而不是 (H T T P) ?
      • @r1si:我在另一个答案中展示了一种方法来做到这一点。我会使用注释,但它们不适合多行代码示例。
      【解决方案3】:

      扩展 larsmans 的答案,如果您更改 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|)

      【讨论】:

        【解决方案4】:

        您可以打印未转义的字符。查看变量*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 打印的返回值。

        【讨论】:

        • 使用princ 打印整个列表也将打印未转义的元素。
        猜你喜欢
        • 1970-01-01
        • 2019-03-12
        • 1970-01-01
        • 2016-05-01
        • 2014-04-22
        • 2012-05-12
        • 1970-01-01
        • 2021-12-17
        • 2015-11-13
        相关资源
        最近更新 更多