[armedbear-devel] [Bug] Identically named gensymed coalesced into same object in fasl file
I'm currently running an old checkout ("0.17.0-dev"), so the issue may have been fixed meanwhile. ### /tmp/foo.lisp (eval-when (:load-toplevel :execute) (let ((a '#:foo) (b '#:foo)) (setf (fdefinition 'foo) (lambda () (values a b))))) (eval-when (:load-toplevel :execute) (format t "~&(multiple-value-call #'eq (foo)) => ~S~%" (multiple-value-call #'eq (foo)))) ### CL-USER> (compile-file "/tmp/foo.lisp") ; Compiling /tmp/foo.lisp ... ; (LET (# #) ...) ; (FORMAT T ...) ; Compilation unit finished ; The following functions were used but not defined: ; FOO ; Wrote /tmp/foo.abcl (0.034 seconds) #P"/tmp/foo.abcl" NIL NIL That warning is bogus. There some work in this area so this bit may be fixed already. The actual issue of my mail is this one, though: CL-USER> (load *) (multiple-value-call #'eq (foo)) => T T As you can see, ABCL coalesces the two identical named gensyms into the same object in the fasl file. While 3.2.4.2.2 does specify that Two apparently uninterned symbols S and C are similar if their names are similar. ABCL's behavior is still wrong because 3.2.4.1 says If two literal objects appearing in the source code for a single file processed with the file compiler are the [sic] identical, the corresponding objects in the compiled code must also be the identical. __With the exception of symbols and packages__, any two literal objects in code being processed by the file compiler may be coalesced if and only if they are similar; __if they are either both symbols or both packages, they may only be coalesced if and only if they are identical__. -T.
participants (1)
-
Tobias C. Rittweiler