Common lisp 阅读限定符号

Common lisp 阅读限定符号,common-lisp,symbols,reader,Common Lisp,Symbols,Reader,我正在为Lisp开发一个代码格式化程序,它使用阅读器将代码读入S表达式格式 这适用于普通符号 对于合格的符号,它不太适用foo:bar只有在包foo已定义的情况下才可读,但就格式化程序而言,它当然没有,因为与编译器不同,格式化程序只是读取代码,而不是执行代码 我怎样才能告诉读者,要么立即自动创建一个包foo,要么失败了,别着急,直接读foo:bar,不是作为一个符号本身,而是以某种明确的格式,我可以作为一种特殊情况处理?我认为你不应该为此使用阅读器,因为这是有损的(您会丢失注释,以及通过读取器宏

我正在为Lisp开发一个代码格式化程序,它使用阅读器将代码读入S表达式格式

这适用于普通符号

对于合格的符号,它不太适用
foo:bar
只有在包
foo
已定义的情况下才可读,但就格式化程序而言,它当然没有,因为与编译器不同,格式化程序只是读取代码,而不是执行代码


我怎样才能告诉读者,要么立即自动创建一个包
foo
,要么失败了,别着急,直接读
foo:bar
,不是作为一个符号本身,而是以某种明确的格式,我可以作为一种特殊情况处理?

我认为你不应该为此使用阅读器,因为这是有损的(您会丢失注释,以及通过读取器宏更改的任何内容,例如读取时间值、读取时间引用等)

但是如果需要,您可以自动创建包,还可以通过处理错误导出符号,例如。G关于SBCL:

(handler-bind ((sb-int:simple-reader-package-error
                (lambda (e)
                  (let ((p (sb-int::package-error-package e)))
                    (ctypecase p
                      (string
                       (make-package p)
                       (invoke-restart 'retry))
                      (package
                       (export (intern (first (simple-condition-format-arguments e)) p) p)
                       (invoke-restart 'retry)))))))
  (with-simple-restart (retry "Retry")
    (read-from-string "foo:bar")))

这有点不规范,我们无法保证条件的格式保持不变。

为什么要实现此格式化程序?这不是文本编辑器的工作吗?@AlexanderArtemenko,因为即使我愿意使用我不喜欢的文本编辑器,也没有一个现有的编辑器在这方面只做了部分工作。看起来像是NIH综合症:(@AlexanderArtemenko NIH的意思是“它完成了任务,但不是在这里发明的”,而不是“它不完成任务”。事实上,我不想被迫编写一个代码格式化程序,但在这个阶段,使用一种没有人的语言会让我感觉太倒退了。