common-lisp - Readtable 与 cl-annot (cl-syntax, jonathan) 和 pythonic-string-reader 冲突
问题描述
我喜欢pythonic-string-reader来启用 python-esque 三引号:
(defun hello ()
"""docstring"""
: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")
=>
Reader macro conflict while trying to merge the macro character
#\" from #<NAMED-READTABLE CL-ANNOT::SYNTAX {1001CC18C3}> into
#<NAMED-READTABLE :CURRENT {1009474833}>.
[Condition of type EDITOR-HINTS.NAMED-READTABLES:READER-MACRO-CONFLICT]
Backtrace:
0: (EDITOR-HINTS.NAMED-READTABLES:MERGE-READTABLES-INTO #<NAMED-READTABLE :CURRENT {1009474833}> #<NAMED-READTABLE CL-ANNOT::SYNTAX {1001CC18C3}>)
Locals:
CHAR = #\"
DISP? = NIL
FROM = #<NAMED-READTABLE CL-ANNOT::SYNTAX {1001CC18C3}>
NAMED-READTABLES = (#<NAMED-READTABLE CL-ANNOT::SYNTAX {1001CC18C3}>)
READER-FN = #<FUNCTION SB-IMPL::READ-STRING>
RESULT-READTABLE = #<NAMED-READTABLE :CURRENT {1009474833}>
RESULT-TABLE = #<NAMED-READTABLE :CURRENT {1009474833}>
TABLE = NIL
1: (CL-SYNTAX::%USE-SYNTAX (:CL-ANNOT))
Locals:
NAMES = (:CL-ANNOT)
这是不对的,因为我没有要求使用另一个 readtable。Jonathan 只在内部使用 cl-annot。
它是谁的错误(cl-syntax?)以及如何解决它?
它首先加载 Jonathan,然后启用 pythonic 字符串语法。但是,这不是一个可接受的解决方法(我想定义一个启用语法的用户包,用户可以在其中加载任何其他库)。
查看它想要合并 readtables 的 cl-syntax 行错误(merge-readtables-into *readtable* syntax) )
,同时它似乎正确使用copy-readtable
:
(defun %use-syntax (names)
(declare (type (or syntax-designator
(proper-list syntax-designator))
names))
(unless (listp names)
(setq names (list names)))
(setq *readtable* (copy-readtable))
(loop for name in names
for syntax = (find-syntax name)
for options = (get-options name)
if (assoc :fuze (if (consp (car options)) options (cdr options))) do
(handler-bind ((named-readtables:reader-macro-conflict
(lambda (_) (declare (ignore _))
(invoke-restart 'continue))))
(merge-readtables-into *readtable* syntax) )
else do
(merge-readtables-into *readtable* syntax) )
(when (find-package :swank)
(named-readtables::%frob-swank-readtable-alist *package* *readtable*)))
有任何想法吗?谢谢。
解决方案
评估
(cl-syntax::get-options :CL-ANNOT)
给
((:MERGE :STANDARD)
(:MACRO-CHAR #\@ #'CL-ANNOT.SYNTAX:ANNOTATION-SYNTAX-READER))
看起来语法应该合并:standard
可读表,而不是当前的。我怀疑(copy-readtable nil)
在您描述的功能中会是更好的选择。
推荐阅读
- c# - 十六进制到 int 和返回给出不同的结果
- qt - qt QML 可折叠嵌套 ListView 与 PropertyAnimation
- rust - 使用“Serde”反序列化时可以映射类型吗?
- javascript - 离子 - 反应如何重复组件
- list - 删除列表中两次出现之间的元素
- flutter - 如何在同一个项目中同时使用“Image_picker”和“shared_preferences”
- c - 未定义对函数错误“链表”的引用,C
- python - tkinter TextVar.get() 返回 '.!entry' 不是字符串
- mongodb - 我可以在 MongoDB 中索引对象类型子文档的键吗?
- wordpress - Wordpress 网站无法重新声明 noindex