【问题标题】:How to distinguish escaped characters from non-escaped e.g. "\x27" from "x27" in a string in Common Lisp?如何区分转义字符和非转义字符,例如Common Lisp中字符串中的“x27”中的“\x27”?
【发布时间】:2022-01-01 20:20:20
【问题描述】:

解决Advent of Code 2015 task 8 part2 我遇到了必须区分字符串中出现的“\x27”和普通“x27”的问题。 但我没有办法做到这一点。因为

(length "\x27") ;; is 3
(length "x27")  ;; is also 3
(subseq "\x27" 0 1) ;; is "x"
(subseq "x27" 0 1)  ;; is "x"

printprin1princ 都没有影响。

# nor does `coerce`
(coerce "\x27" 'list)
;; (#\x #\2 #\7)

那么如何在字符串中区分 "\x27" 或任何此类 出现十六进制表示?

  • 事实证明,解决任务不需要解决这个问题。但是,现在我还是想知道在 common lisp 中是否有办法区分 "\x" 和 "x"。

【问题讨论】:

    标签: string hex escaping common-lisp


    【解决方案1】:

    当 Lisp 阅读器开始工作时,\xx 相同。可能有一些方法可以关闭它 - 我不会感到惊讶 - 但原始文本谈到了圣诞老人的文件。

    所以,我创建了自己的文件,如下所示:

    x27
    \x27
    

    然后我将数据读入这样的特殊变量中:

     (defun read-line-crlf (stream)
        (string-right-trim '(#\Return) (read-line stream nil)))
    
     (defun read-lines (filename)
        (with-open-file (stream filename)
          (setf x (read-line-crlf stream))
          (setf x-esc (read-line-crlf stream))
        ))
    

    那么x的长度是3,x-esc的长度是4。返回的字符串必须在Windows上修剪,或者声明一个外部格式,否则SBCL会留下一半的CR-LF读取字符串的结尾。

    【讨论】:

      【解决方案2】:

      字符串文字"\x27""x27" 读取相同,因为\ 是字符串文字中的转义字符。如果您想要一个内容为\x27 的字符串,则需要将文字写为"\\x27"(即转义转义字符)。这与字符串本身无关。如果从包含\x27 的文件中读取字符串(例如read-line),则结果为四字符字符串\x27

      【讨论】:

      • 谢谢!这引起了我的一些大脑怪癖......:D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多