Re: Possible bug with sbcl 2.5.11 and FN package (and NAMED-READTABLES)

Peter Keller via Sbcl-help <[email protected]> Tue, 2 Dec 2025 22:39:28 -0600
Newsgroups gmane.lisp.steel-bank.general
Message-ID <[email protected]>
Given your comment I see now the fix that was done in named-readtables.

Things are working great for me with the head of named-readtables!

Thank you!

-pete

On 12/2/25 21:26, Robert Smith wrote:
> update your named-readtables, which has been patched
> 
> it was relying on an internal representation of the readtable
> 
> On Tue, Dec 2, 2025 at 22:12 Peter Keller via Sbcl-help <
> [email protected]> wrote:
> 
>> Hello,
>>
>> I have run into an unexpected problem when using sbcl 2.5.11 on x86_64.
>>
>> When using a newly built sbcl with documented methods (and adding --fancy
>> and --dynamic-space-size=24Gb), and when loading the FN package from
>> the most recent quicklisp of 2025-06-22, I get this signaled condition:
>>
>> CL-USER> (ql:quickload :fn)
>>
>> ;; piles of normal compilation output, then:
>>
>> debugger invoked on a SIMPLE-ERROR in thread
>> #<THREAD tid=4031189 "main thread" RUNNING {1200030003}>:
>>     Bug in readtable iterators or concurrent access?
>>
>> Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
>>
>> restarts (invokable by number or by possibly-abbreviated name):
>>     0: [CONTINUE                     ] Retry assertion.
>>     1: [TRY-RECOMPILING              ] Recompile fn and try loading it again
>>     2: [RETRY                        ] Retry
>>                                        loading FASL for #<CL-SOURCE-FILE
>> "fn" "fn">.
>>     3: [ACCEPT                       ] Continue, treating
>>                                        loading FASL for #<CL-SOURCE-FILE
>> "fn" "fn">
>>                                        as having been successful.
>>     4:                                 Retry ASDF operation.
>>     5: [CLEAR-CONFIGURATION-AND-RETRY] Retry ASDF operation after resetting
>> the
>>                                        configuration.
>>     6:                                 Retry ASDF operation.
>>     7:                                 Retry ASDF operation after resetting
>> the
>>                                        configuration.
>>     8: [ABORT                        ] Give up on "fn"
>>     9: [REGISTER-LOCAL-PROJECTS      ] Register local projects and try
>> again.
>>    10:                                 Exit debugger, returning to top
>> level.
>>
>> (EDITOR-HINTS.NAMED-READTABLES::CHECK-READER-MACRO-CONFLICT
>> #<NAMED-READTABLE
>> :COMMON-LISP {12000421A3}> #<NAMED-READTABLE FN-READER {1220C19033}> #\Nul
>> NIL)
>>      source: (ASSERT FROM-FN NIL
>>                      "Bug in readtable iterators or concurrent access?")
>> 0]
>>
>>
>> Here is the backtrace. After the backtrace is more commentary:
>>
>> 0] backtrace
>>
>> Backtrace for: #<SB-THREAD:THREAD tid=4031189 "main thread" RUNNING
>> {1200030003}>
>> 0: (EDITOR-HINTS.NAMED-READTABLES::CHECK-READER-MACRO-CONFLICT
>> #<NAMED-READTABLE :COMMON-LISP {12000421A3}> #<NAMED-READTABLE FN-READER
>> {1220C19033}> #\Nul NIL)
>> 1: (EDITOR-HINTS.NAMED-READTABLES:MERGE-READTABLES-INTO #<NAMED-READTABLE
>> FN-READER {1220C19033}> :STANDARD)
>> 2: ("top level form") [toplevel]
>> 3: (SB-FASL::LOAD-FASL-GROUP #S(SB-FASL::FASL-INPUT :STREAM
>> #<SB-SYS:FD-STREAM
>> for "file
>> /home/psilord/.cache/common-lisp/sbcl-2.5.11-linux-x64/home/psilord/quicklisp/dists/quicklisp/software/fn-20241012-git/fn.fasl"
>>
>> {1220C12A93}> :TABLE #(308
>> #1="/home/psilord/quicklisp/dists/quicklisp/software/fn-20241012-git/fn.lisp"
>>
>> :MACRO #<PACKAGE "FN"> FN* DEFMACRO #2=(:MACRO FN* . DEFMACRO) FORM (#2#
>> FORM)
>> MACRO-FUNCTION (MACRO-FUNCTION FN*) #(8 79 4 36 8 36 28 10 0 1 103 40 ...)
>> ...)
>> :STACK #(0 #<FUNCTION "top level form" {B800C2F8EB}> *PACKAGE*
>> *STOP-ON-SYMBOLS* #S(SB-C:DEFINITION-SOURCE-LOCATION :NAMESTRING #1#
>> :INDICES
>> 65537) (QUOTE LAMBDA) FN* #S(SB-C:DEFINITION-SOURCE-LOCATION :NAMESTRING
>> #1#
>> :INDICES 98305) FN*-INTERNALS NORMALIZED-ARG-COUNT VALID-_-NAME
>> FILTER-TREE
>> ...) :NAME-BUFFER #("" "FIND-UNDELETED-PACKAGE-OR-LOSEE") :PRINT NIL
>> :PARTIAL-SOURCE-INFO #S(SB-C::DEBUG-SOURCE :NAMESTRING #1# :CREATED
>> 3972516143
>> :START-POSITIONS NIL :PLIST NIL)))
>> 4: ((LAMBDA NIL :IN SB-FASL::LOAD-AS-FASL))
>> 5: (SB-IMPL::CALL-WITH-LOADER-PACKAGE-NAMES #<FUNCTION (LAMBDA NIL :IN
>> SB-FASL::LOAD-AS-FASL) {1220C1622B}>)
>> 6: (SB-FASL::LOAD-AS-FASL #<SB-SYS:FD-STREAM for "file
>> /home/psilord/.cache/common-lisp/sbcl-2.5.11-linux-x64/home/psilord/quicklisp/dists/quicklisp/software/fn-20241012-git/fn.fasl"
>>
>> {1220C12A93}> NIL NIL)
>> 7: ((LABELS SB-FASL::LOAD-STREAM-1 :IN LOAD) #<SB-SYS:FD-STREAM for "file
>> /home/psilord/.cache/common-lisp/sbcl-2.5.11-linux-x64/home/psilord/quicklisp/dists/quicklisp/software/fn-20241012-git/fn.fasl"
>>
>> {1220C12A93}> T)
>> 8: (SB-FASL::CALL-WITH-LOAD-BINDINGS #<FUNCTION (LABELS
>> SB-FASL::LOAD-STREAM-1
>> :IN LOAD) {7CDE5D7AE2CB}> #<SB-SYS:FD-STREAM for "file
>> /home/psilord/.cache/common-lisp/sbcl-2.5.11-linux-x64/home/psilord/quicklisp/dists/quicklisp/software/fn-20241012-git/fn.fasl"
>>
>> {1220C12A93}> T #<SB-SYS:FD-STREAM for "file
>> /home/psilord/.cache/common-lisp/sbcl-2.5.11-linux-x64/home/psilord/quicklisp/dists/quicklisp/software/fn-20241012-git/fn.fasl"
>>
>> {1220C12A93}>)
>> 9: (LOAD
>> #P"/home/psilord/.cache/common-lisp/sbcl-2.5.11-linux-x64/home/psilord/quicklisp/dists/quicklisp/software/fn-20241012-git/fn.fasl"
>>
>> :VERBOSE NIL :PRINT NIL :IF-DOES-NOT-EXIST :ERROR :EXTERNAL-FORMAT
>> :DEFAULT)
>> 10: (UIOP/UTILITY:CALL-WITH-MUFFLED-CONDITIONS #<FUNCTION (LAMBDA NIL :IN
>> UIOP/LISP-BUILD:LOAD*) {1220C124BB}> ("Overwriting already existing
>> readtable
>> ~S." #(#:FINALIZERS-OFF-WARNING :ASDF-FINALIZERS)))
>> 11: ((SB-PCL::EMF ASDF/ACTION:PERFORM) #<unused argument> #<unused
>> argument>
>> #<ASDF/LISP-ACTION:LOAD-OP > #<ASDF/LISP-ACTION:CL-SOURCE-FILE "fn" "fn">)
>> 12: ((LAMBDA NIL :IN ASDF/ACTION:CALL-WHILE-VISITING-ACTION))
>> 13: ((:METHOD ASDF/ACTION:PERFORM :AROUND (ASDF/LISP-ACTION:LOAD-OP
>> ASDF/LISP-ACTION:CL-SOURCE-FILE)) #<ASDF/LISP-ACTION:LOAD-OP >
>> #<ASDF/LISP-ACTION:CL-SOURCE-FILE "fn" "fn">) [fast-method]
>> 14: ((:METHOD ASDF/ACTION:PERFORM-WITH-RESTARTS (ASDF/LISP-ACTION:LOAD-OP
>> ASDF/LISP-ACTION:CL-SOURCE-FILE)) #<ASDF/LISP-ACTION:LOAD-OP >
>> #<ASDF/LISP-ACTION:CL-SOURCE-FILE "fn" "fn">) [fast-method]
>> 15: ((:METHOD ASDF/ACTION:PERFORM-WITH-RESTARTS :AROUND (T T))
>> #<ASDF/LISP-ACTION:LOAD-OP > #<ASDF/LISP-ACTION:CL-SOURCE-FILE "fn" "fn">)
>> [fast-method]
>> 16: ((:METHOD ASDF/PLAN:PERFORM-PLAN (T)) #<ASDF/PLAN:SEQUENTIAL-PLAN
>> {121A088F33}>) [fast-method]
>> 17: ((FLET SB-C::WITH-IT :IN SB-C::%WITH-COMPILATION-UNIT))
>> 18: ((:METHOD ASDF/PLAN:PERFORM-PLAN :AROUND (T))
>> #<ASDF/PLAN:SEQUENTIAL-PLAN
>> {121A088F33}>) [fast-method]
>> 19: ((:METHOD ASDF/OPERATE:OPERATE (ASDF/OPERATION:OPERATION
>> ASDF/COMPONENT:COMPONENT)) #<ASDF/LISP-ACTION:LOAD-OP >
>> #<ASDF/SYSTEM:SYSTEM
>> "fn"> :PLAN-CLASS NIL :PLAN-OPTIONS NIL) [fast-method]
>> 20: ((SB-PCL::EMF ASDF/OPERATE:OPERATE) #<unused argument> #<unused
>> argument>
>> #<ASDF/LISP-ACTION:LOAD-OP > #<ASDF/SYSTEM:SYSTEM "fn"> :VERBOSE NIL)
>> 21: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE))
>> 22: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T))
>> #<ASDF/LISP-ACTION:LOAD-OP >
>> #<ASDF/SYSTEM:SYSTEM "fn"> :VERBOSE NIL) [fast-method]
>> 23: ((SB-PCL::EMF ASDF/OPERATE:OPERATE) #<unused argument> #<unused
>> argument>
>> ASDF/LISP-ACTION:LOAD-OP "fn" :VERBOSE NIL)
>> 24: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE))
>> 25: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) ASDF/LISP-ACTION:LOAD-OP
>> "fn"
>> :VERBOSE NIL) [fast-method]
>> 26: (ASDF/SESSION:CALL-WITH-ASDF-SESSION #<FUNCTION (LAMBDA NIL :IN
>> ASDF/OPERATE:OPERATE) {121A0813CB}> :OVERRIDE T :KEY NIL :OVERRIDE-CACHE T
>> :OVERRIDE-FORCING NIL)
>> 27: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE))
>> 28: (ASDF/SESSION:CALL-WITH-ASDF-SESSION #<FUNCTION (LAMBDA NIL :IN
>> ASDF/OPERATE:OPERATE) {121A07A73B}> :OVERRIDE NIL :KEY NIL :OVERRIDE-CACHE
>> NIL
>> :OVERRIDE-FORCING NIL)
>> 29: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) ASDF/LISP-ACTION:LOAD-OP
>> "fn"
>> :VERBOSE NIL) [fast-method]
>> 30: (ASDF/OPERATE:LOAD-SYSTEM "fn" :VERBOSE NIL)
>> 31: (QUICKLISP-CLIENT::CALL-WITH-MACROEXPAND-PROGRESS #<FUNCTION (LAMBDA
>> NIL
>> :IN QUICKLISP-CLIENT::APPLY-LOAD-STRATEGY) {121A07648B}>)
>> 32: (QUICKLISP-CLIENT::AUTOLOAD-SYSTEM-AND-DEPENDENCIES "fn" :PROMPT NIL)
>> 33: ((:METHOD QUICKLISP-CLIENT:QUICKLOAD (T)) :FN :PROMPT NIL :SILENT NIL
>> :VERBOSE NIL) [fast-method]
>> 34: (QL-DIST::CALL-WITH-CONSISTENT-DISTS #<FUNCTION (LAMBDA NIL :IN
>> QUICKLISP-CLIENT:QUICKLOAD) {1219D65A4B}>)
>> 35: (SB-INT:SIMPLE-EVAL-IN-LEXENV (QUICKLISP-CLIENT:QUICKLOAD :FN)
>> #<NULL-LEXENV>)
>> 36: (EVAL (QUICKLISP-CLIENT:QUICKLOAD :FN))
>> 37: (SB-EXT:INTERACTIVE-EVAL (QUICKLISP-CLIENT:QUICKLOAD :FN) :EVAL NIL)
>> 38: (SB-IMPL::REPL-FUN NIL)
>> 39: ((LAMBDA NIL :IN SB-IMPL::TOPLEVEL-REPL))
>> 40: (SB-IMPL::%WITH-REBOUND-IO-SYNTAX #<FUNCTION (LAMBDA NIL :IN
>> SB-IMPL::TOPLEVEL-REPL) {7CDE5D7AFC1B}>)
>> 41: (SB-IMPL::TOPLEVEL-REPL NIL)
>> 42: (SB-IMPL::TOPLEVEL-INIT)
>> 43: ((FLET SB-UNIX::BODY :IN SB-IMPL::START-LISP))
>> 44: ((FLET "WITHOUT-INTERRUPTS-BODY-3" :IN SB-IMPL::START-LISP))
>> 45: (SB-IMPL::%START-LISP)
>>
>> Here is the code in question which signaled the condition:
>>
>> (defun check-reader-macro-conflict (from to char &optional subchar)
>>     (flet ((conflictp (from-fn to-fn)
>>              (assert from-fn ()
>>                      "Bug in readtable iterators or concurrent access?")
>>              (and to-fn (not (function= to-fn from-fn)))))
>>       (when (if subchar
>>                 (conflictp (%get-dispatch-macro-character char subchar from)
>>                            (%get-dispatch-macro-character char subchar to))
>>                 (conflictp (%get-macro-character char from)
>>                            (%get-macro-character char to)))
>>         (cerror (format nil "Overwrite ~@C in ~A." char to)
>>                 'reader-macro-conflict
>>                 :from-readtable from
>>                 :to-readtable to
>>                 :macro-char char
>>                 :sub-char subchar))))
>>
>> It resides in:
>>
>>
>> ~/quicklisp/dists/quicklisp/software/named-readtables-20250622-git/src/named-readtables.lisp
>>
>> So it looks like the 2025-06-22 release of named-readtables is signaling
>> the
>> condition. I did not debug more about why this is happening, but this
>> works on
>> SBCL 2.5.6. I can poke it to debug more if needed.
>>
>> Thank you!
>>
>> -pete
>>
>>
>> _______________________________________________
>> Sbcl-help mailing list
>> [email protected]
>> https://urldefense.com/v3/__https://lists.sourceforge.net/lists/listinfo/sbcl-help__;!!Mak6IKo!KhLY4bWpGsG-acaU9JjDjCO3-TTRGLhD4j7tGmIhVZmYznL061EXYblV6c5glNbWdMQaioqa4XdjplJq$
>>
>