[armedbear-devel] [Bug] Identically named gensymed coalesced into same object in fasl file
Tobias C. Rittweiler
tcr at freebits.de
Mon Jan 11 21:35:27 UTC 2010
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.
More information about the armedbear-devel
mailing list