如何区分转义字符和非转义字符,例如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"
print
、prin1
、princ
都没有影响。
# nor does `coerce`
(coerce "\x27" 'list)
;; (#\x # #)
那么如何在字符串中区分 "\x27" 或任何此类
出现十六进制表示?
- 事实证明,不需要解决这个问题就可以解决任务。不过,现在我还是很想知道有没有什么办法可以区分common lisp中的"\x"和"x"
当 Lisp reader 开始工作时,\x
与 x
相同。可能有一些方法可以关闭它 - 我不会感到惊讶 - 但原文谈到圣诞老人的文件。
所以,我创建了自己的文件,如下所示:
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
。
解决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"
print
、prin1
、princ
都没有影响。
# nor does `coerce`
(coerce "\x27" 'list)
;; (#\x # #)
那么如何在字符串中区分 "\x27" 或任何此类 出现十六进制表示?
- 事实证明,不需要解决这个问题就可以解决任务。不过,现在我还是很想知道有没有什么办法可以区分common lisp中的"\x"和"x"
当 Lisp reader 开始工作时,\x
与 x
相同。可能有一些方法可以关闭它 - 我不会感到惊讶 - 但原文谈到圣诞老人的文件。
所以,我创建了自己的文件,如下所示:
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
。