Elisp:符号名称的完整正则表达式是什么?

时间:2014-05-19 15:08:57

标签: emacs elisp

我遇到prin1-to-stringread没有的情况 符号相互反转,例如:

(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符号的完整正则表达式。

我查看了信息页面,但没有找到符号的精确语法 爱好。

2 个答案:

答案 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"

当然,您感兴趣的只是读取作为符号一部分的那些。似乎?.确实是唯一可以在未转义时阅读的内容。