请注意,在尝试查找 的来源时,REPL 中有一个警告DEFUN
:
警告:不一致的 2 个表格编号翻译
您可以在 REPL 中自己复制它:
CL-USER> (let ((slynk::*buffer-package* (find-package :cl))
(slynk::*buffer-readtable* *readtable*))
(slynk:find-definitions-for-emacs "DEFUN"))
WARNING: inconsistent 2 form-number-translations
(("(DEFMACRO DEFUN)"
(:LOCATION (:FILE "/home/chris/data/src/sbcl/src/code/macros.lisp")
(:POSITION 4140)
(:SNIPPET "(setq doc nil)
(let* (;; stuff shared between LAMBDA and INLINE-LAMBDA and NAMED-LAMBDA
(lambda-guts `(,@decls (block ,(fun-name-block-name name) ,@forms)))
(lambda `(lambda ,lambda-list ,@lambda-guts))
(named-lambda `("))))
要查找警告的来源,您可以像我一样先对存储库进行文本搜索,或者您可以使用以下更好的替代方法,即在警告时调用调试器:
(handler-bind ((warning (lambda (c) (invoke-debugger c))))
(let ((slynk::*buffer-package* (find-package :cl))
(slynk::*buffer-readtable* *readtable*))
(slynk:find-definitions-for-emacs "DEFUN")))
这来自SLYNK-SBCL::FORM-NUMBER-POSITION
,调试器中有趣的值是从 SBCL 获得的源位置:
#<SB-INTROSPECT:DEFINITION-SOURCE {10369C50F3}>
--------------------
The object is a STRUCTURE-OBJECT of type SB-INTROSPECT:DEFINITION-SOURCE.
PATHNAME: #P"SYS:SRC;CODE;MACROS.LISP"
FORM-PATH: (5)
FORM-NUMBER: 89
CHARACTER-OFFSET: 3917
FILE-WRITE-DATE: 3825178034
PLIST: NIL
DESCRIPTION: NIL
它说源是文件中的第五个顶层表单(对应于字符偏移),从这里开始,它FORM-NUMBER
是表单的深度优先搜索遍历中的第 89 个表单(这来自结构的文档字符串)。
但是,如果我在 DEBUG 设置为 3 的情况下重新编译该函数FORM-NUMBER-POSITION
,则在此位置读取的顶级表单 TLF
为 NIL:
1: (SLYNK-SBCL::FORM-NUMBER-POSITION #S(SB-INTROSPECT:DEFINITION-SOURCE :PATHNAME #P"SYS:SRC;CODE;MACROS.LISP" :FORM-PATH (5) :FORM-NUMBER 89 :CHARACTER-OFFSET 3917 :FILE-WRITE-DATE 3825178034 :PLIST NIL..
Locals:
DEFINITION-SOURCE = #S(SB-INTROSPECT:DEFINITION-SOURCE :PATHNAME #P"SYS:SRC;CODE;MACROS.LISP" :FORM-PATH (5) :FORM-NUMBER 89 :CHARACTER-OFFSET 3917 :FILE-WRITE-DATE 3825178034 :PLIST NIL :DESCRIPTION NIL)
FORM-NUMBER = 89
PATH-TABLE = #((0 0))
POS-MAP = #<HASH-TABLE :TEST EQ :COUNT 126 {103B227EA3}>
POS-MAP#1 = #<HASH-TABLE :TEST EQ :COUNT 126 {103B227EA3}>
STREAM = #<SB-IMPL::STRING-INPUT-STREAM {7F3E0350D953}>
TLF = NIL
TLF#1 = NIL
TLF-NUMBER = 5
在read-source-form
中,您可以看到该表单正在表单中被读取(ignore-errors (read ...))
,如果出现错误,该表单将返回 NIL。我尝试(read ...)
只调用,但这不知何故没有调用调试器,所以我做了与上面相同的事情并在任何情况下显式调用它。
有一个错误,即“SB-XC”包不存在,这是意料之中的,因为如果我没记错的话,这是一个只在SBCL本身编译期间存在的包。
我认为你应该联系SBCLSLY 开发人员并为此直接提交错误,他们肯定会更好地了解如何修复该行为(除了提供错误报告的通常详细信息外,请随时链接到您的问题)。