Common lisp Readtable与cl annot(cl语法,jonathan)和Python字符串读取器冲突

Common lisp Readtable与cl annot(cl语法,jonathan)和Python字符串读取器冲突,common-lisp,reader-macro,Common Lisp,Reader Macro,我喜欢启用python风格的三重引号: (defun hello() “文档字符串” :你好) 使用它: (ql:quickload "pythonic-string-reader") (pythonic-string-reader:enable-pythonic-string-syntax) 它也适用于 (named-readtables:in-readtable pythonic-string-reader:pythonic-string-syntax) 但是我想加

我喜欢启用python风格的三重引号:

(defun hello()
“文档字符串”
:你好)
使用它:

(ql:quickload "pythonic-string-reader")
(pythonic-string-reader:enable-pythonic-string-syntax)
它也适用于

(named-readtables:in-readtable pythonic-string-reader:pythonic-string-syntax)
但是我想加载Jonathan库,我遇到了一个冲突:

(ql:quickload“jonathan”)
=>
尝试合并宏字符时读取器宏冲突
#\“从#到#”
#.
[类型EDITOR-HINTS.NAMED-READTABLES:READER-MACRO-CONFLICT的条件]
回溯:
0:(EDITOR-hits.NAMED-READTABLES:MERGE-READTABLES-INTO#)
当地人:
字符=#\“
显示?=无
从=#
NAMED-READTABLES=(#)
读卡器-FN=#
结果可读表=#
结果表=#
表=零
1:(CL-SYNTAX::%USE-SYNTAX(:CL-ANNOT))
当地人:
名称=(:CL-ANNOT)
这是不对的,因为我没有要求使用另一个可读表。Jonathan只在内部使用cl-annot

它是谁的bug(cl语法?)以及如何解决它


它首先加载Jonathan,然后启用pythonic字符串语法。但是,这不是一个可接受的解决方法(我想定义一个启用语法的用户包,用户可以在其中加载任何其他库)


查看cl语法行错误,它希望合并readtables
(将readtables合并到*readtable*语法中))
,同时它似乎正确使用了
复制readtable

(defun%使用语法(名称)
(声明(类型或语法指示符)
(正确的列表语法指示符)
(姓名)
(除非(列表名称)
(setq名称(列表名称)))
(setq*可读*(复制可读))
(名称中名称的循环)
对于语法=(查找语法名称)
对于选项=(获取选项名称)
如果(关联:引信(如果(消费(汽车选件))选件(cdr选件))执行
(处理程序绑定((命名的readtables:reader宏冲突)
(lambda)(声明(忽略)
(调用重新启动“继续”))
(将可读表合并到*可读表*语法中)
否则会
(将可读表合并到*可读表*语法中)
(何时(查找包:swank)
(命名的可读表::%frob swank可读表列表*包**可读表*))
有什么想法吗?谢谢。

(cl-syntax::get-options :CL-ANNOT)
给予


看起来语法应该合并
:standard
可读表,而不是当前的。我怀疑
(copy readtable nil)
在您描述的函数中是更好的选择。

copy readtable nil
允许我进一步加载jonathan。我会联系cl syntax的问题跟踪者。(并且很可能会接受这个答案)我联系了一个成员。@tfb cl annot作为标准可读表的扩展并不是很可组合,但至少实现应该尊重这一点。此外,与当前可读表合并只会导致冲突,只有开发人员使用不同的语法扩展才能解决冲突。我认为命名的readtables在这方面很好,但我有兴趣了解更好的solutions@tfb我通过加载和安装添加了#Z阅读器的SERIES进行了测试,然后强制重新编译jonathan(这里没有冲突),编译和加载后的readtable仍然是一样的,并且不支持at doc语法。我认为这是可行的,因为可读表在编译文件和加载过程中会自动恢复,允许更改只对jonathan源文件可见(?)@coredump:哦,是的,你是对的。单方面设置可读表将起作用。抱歉,我错了(更令人恼火的是,我也测试了一些东西,但由于假设有什么东西在做
(使用标准io语法…
)。
((:MERGE :STANDARD)
 (:MACRO-CHAR #\@ #'CL-ANNOT.SYNTAX:ANNOTATION-SYNTAX-READER))