如何修改Elisp的阅读器?


12

修改阅读器将允许引入新的阅读语法(例如#(hash table)'(quoted))。许多Lisps都具有这种能力,但是elisp似乎不存在这样的功能。


破解C源代码。
wasamasa 2015年

3
Emacs Lisp没有Lisp可编程的阅读器。
Drew

@wasamasa好吧,这始终是一种选择:)不是便携式的,而是一种选择。
肖恩·阿雷德

我认为“很多Lips都有。” 不是一个实际的问题。我更想提出一个真实的问题。我建议缩短标题,并将其改写为正文。
YoungFrog

@YoungFrog编辑欢迎。没有过多的罗y,我想不出任何更直接或更合适的方法。问题很简单。不必太长。
肖恩·艾瑞德

Answers:


11

事实证明,该手册暗示您实际上无法执行阅读器宏。

根据附录C移植Common Lisp

阅读器宏。Common Lisp包括第二种类型的宏,它们可以在单个字符级别上工作。例如,Common Lisp通过称为'的阅读器宏实现引号表示法,而Emacs Lisp的解析器仅将引号视为特殊情况。一些Lisp软件包使用阅读器宏为自己创建特殊的语法,Emacs解析器无法读取这些语法。


我认为这与使用特殊阅读器宏而不是Elisp的Common Lisp软件有关。该页面是关于将CL代码移植到Elisp的。是的,官方而言,读者是不可自定义的,但是请在下面查看我的答案...
mishoo

这里的另一个问题是,即使您以某种方式引入了新的阅读器语法,Emacs的其余部分也不知道,所以您也需要修复syntax.c...
wasamasa

9

显然可以做到,但是要准备很多工作。(或者不,因为我要在某个周末解决它;-)。

(defvar *orig-read* (symbol-function 'read))

(defun read (&optional in)
  (message "reading from %s" load-file-name)
  (funcall *orig-read* in))

(setq load-read-function (symbol-function 'read))

现在剩下要做的就是实现一个完整的Lisp阅读器,该阅读器支持Elisp所做的一切以及您想要的更多内容。我认为这可以用来提供类似CL的defpackage符号和封装内部符号,例如。另外,我非常想做一个用于正则表达式的特殊语法(或更确切地说,是一些不能解释反斜杠的字符串语法)。

编辑:这是概念验证的实现:https : //github.com/mishoo/elisp-reader.el


最好不要在您按照您的建议实际实现了完整的Lisp阅读器之后才将其发布为答案(我想这不是一件小事)。

@Dan这是可行的,只是在C中执行它要痛苦得多,因为它很麻烦地进行字符串处理。
wasamasa

1
@Dan正常工作,我编辑了答案,将链接添加到实现中。
mishoo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.