保留注释的Common Lisp解析器

rwa*_*ace 4 common-lisp

Common Lisp附带一个解析器(reader),它将其文本语法转换为s表达式.但是,它会丢弃注释,使其不适用于往返Lisp代码的工具.

是否存在Common Lisp的现有解析器,它保留了注释?

K. *_*uhr 8

如注释中所述,您应该能够修改readtable以将宏字符绑定;到不同的reader宏函数.例如,如果您定义:

(defun semicolon-reader (stream char)
  (list 'my-comment
        (concatenate 'string (string char)
                     (read-line stream nil #\Newline t))))
Run Code Online (Sandbox Code Playgroud)

然后在顶部运行:

> (set-macro-character #\; #'semicolon-reader)
> (read)
Run Code Online (Sandbox Code Playgroud)

用户输入:

(a b ; is b
c ; is c
)
Run Code Online (Sandbox Code Playgroud)

会产生:

(A B (MY-COMMENT "; is b") C (MY-COMMENT "; is c"))
Run Code Online (Sandbox Code Playgroud)

但是,真正的往返处理也需要您保留空白.我不太了解读者是否能够为空白字符定义一些聪明的宏函数,或者如果你必须编写某种预处理函数来预先引用具有另一个宏字符的空格的运行然后与semicolon-reader上面类似地处理它.

  • 保留文件偏移量可以使用自定义流类来完成,该类记录正在读取的元素的位置 (2认同)