【问题标题】:Elisp: what's the complete regex for symbol name?Elisp:符号名称的完整正则表达式是什么?
【发布时间】:2014-05-19 15:08:56
【问题描述】:

我遇到过 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 之类的不确定符号替换为正则表达式 例如'(raw "foo.bar") 在将其传递给 read 之前。但我需要知道 这些不确定符号的完整正则表达式。

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

【问题讨论】:

  • foo.foo\.same 符号。为什么需要区分它们?
  • 它们在代码中相同,但在源代码中不同。我正在编写修改源代码的代码,这就是为什么我想区分foo.foo\.
  • 不过,将一个替换为另一个并不会改变源代码的含义,因此您也可以将它们视为与源代码相同。

标签: emacs elisp


【解决方案1】:

确实,prin1-to-string 和 read 应该是彼此相反的,但仅在一个方向上:(read-from-string (print1-to-string X)) ~ X。当然,仅对于可打印的对象,您可能需要设置 print-circle 和其他一些此类变量(print-depth,..)以确保它成立。

【讨论】:

    【解决方案2】:

    我在文档中找不到它,但根据source code,在打印符号时似乎引用了以下字符:

    • "
    • \
    • '
    • ;
    • #
    • (
    • )
    • ,
    • .
    • `
    • [
    • ]
    • ?
    • 所有控制字符 (<= 040)

    另外,如果符号名称以数字开头,以数字结尾,并且只包含数字和e,则第一个字符被转义:

    ELISP> (prin1-to-string (make-symbol "2e5"))
    "\\2e5"
    

    当然,您感兴趣的只是那些将被读取作为符号的一部分的那些。看来?. 确实是唯一可以在未转义时读取的。

    【讨论】:

    • 谢谢。虽然在手册中有一个正式的规范会很棒。
    猜你喜欢
    • 2012-04-23
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多