如何区分转义字符和非转义字符,例如Common Lisp 中字符串中来自 "x27" 的“\x27”?

How to distinguish escaped characters from non-escaped e.g. "\x27" from "x27" in a string in Common Lisp?

解决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 # #)

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

当 Lisp reader 开始工作时,\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。

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