我遇到prin1-to-string
和read
没有的情况
符号相互反转,例如:
(prin1-to-string (read "foo?"))
;; "foo\\?"
(prin1-to-string (read "foo."))
;; "foo\\."
我想知道发生这种情况的所有可能情况。 我特别感兴趣的是一种区分不同来源的方法 产生相同代码的代码,例如:
(prin1-to-string (read "foo."))
;; "foo\\."
(prin1-to-string (read "foo\\."))
;; "foo\\."
我正在考虑将foo.bar
之类的iffy符号替换为正则表达式
例如'(raw "foo.bar")
在将其传递给read
之前。但我需要知道
这些iffy符号的完整正则表达式。
我查看了信息页面,但没有找到符号的精确语法 爱好。
答案 0 :(得分:3)
实际上,prin1到字符串和读取应该是彼此相反的,但只能在一个方向上进行:(read-from-string (print1-to-string X)) ~ X
。当然,仅对于可打印的对象,您可能需要设置print-circle
和其他一些此类变量(print-depth
,..)以确保它成立。
答案 1 :(得分:2)
我在文档中找不到它,但是根据source code,在打印符号时似乎引用了以下字符:
"
\
'
;
#
(
)
,
.
`
[
]
?
<= 040
)此外,如果符号名称以数字开头,以数字结尾,并且只包含数字和e
,则第一个字符将被转义:
ELISP> (prin1-to-string (make-symbol "2e5"))
"\\2e5"
当然,您感兴趣的只是读取作为符号一部分的那些。似乎?
和.
确实是唯一可以在未转义时阅读的内容。