在Common Lisp中如何区分字符串内的转义序列\x27与普通字符序列x27
问题解答
核心原因
你在Common Lisp源码中写的"\x27"和"x27"本质是完全相同的字符串,不存在任何差异,自然无法区分。
Common Lisp标准字符串语法中,反斜杠是单字符转义符,仅作用是取消紧随其后的单个字符的特殊语法含义,本身不会保留在最终字符串中,也不支持C语言风格的\xHH十六进制转义规则:
- 你写的
"\x27"中,反斜杠仅转义了紧随的x,而x没有特殊语法含义,转义后还是普通x,反斜杠在读取阶段直接被丢弃,最终得到的字符串就是由x、2、7三个字符组成的,和"x27"完全一致。
如果你需要处理包含\x27转义序列的原始输入(比如Advent of Code的题目输入)
要在Common Lisp字符串中表示包含反斜杠的原始字符序列,需要对反斜杠本身做转义,也就是写两个反斜杠:
;; 这才是包含 \、x、2、7 四个字符的原始字符串,对应输入里的\x27 (length "\\x27") ;; 返回4 (length "x27") ;; 返回3 ;; 自然可以轻松区分
如果你需要解析C风格的\xHH转义序列为对应ASCII字符,可以自行实现解析逻辑,或者自定义读取宏扩展字符串语法,Common Lisp的读取器是完全可定制的。
内容的提问来源于stack exchange,提问作者Gwang-Jin Kim
相关产品推荐
相关产品推荐

