From: William H. N. <wil...@ai...> - 2001-02-03 01:02:23
|
On Fri, Feb 02, 2001 at 11:20:50PM +0100, Bruno Haible wrote: > Peter Van Eynde writes: > > > I think the problem is that using defconstant is only allowed if the > > value given is EQL between load and compile-time. SBCL complains if it > > sees a (defconstant +foo+ '(1 2 3)) because it can never be EQL... > > Then it is a problem in SBCL. CLHS section 3.2.2.3 says: > > "Constant variables defined in the compilation environment must > have a similar value at run time. A reference to a constant > variable in source code is equivalent to a reference to a literal > object that is the value of the constant variable." > > And similarity of literal values is defined in 3.2.4.2.2, and in a way > that two copies of (1 2 3) are similar. > > So (defconstant +foo+ '(1 2 3)) is definitely valid code. It looks as though Bruno is right: I screwed up by changing the implementation of DEFCONSTANT so that it causes valid code to fail to compile, and compounded my error by confidently quoting the DEFCONSTANT definition to say that (DEFCONSTANT +FOO+ '(1 2 3)) is bad. In my defense, even now that I know about similarity, I can't see any way that I could have found that it's relevant to DEFCONSTANT, short of just reading (and memorizing) the entire spec, which I never have done. If I understand correctly, the similarity rules mean e.g. that operations along the lines of % echo "(defparameter *foo* '(1 2))" > foo.lisp % echo "(defparameter *bar* '(1 2))" > bar.lisp % lisp <<-EOF (load (compile-file "foo.lisp")) (load (compile-file "bar.lisp")) (format t "(EQL *FOO* *BAR*)=~S~%" (eql *foo* *bar*)) EOF are supposed to show equality. Alas, this notion of similarity doesn't seem to be anywhere in the CMU CL codebase, so the magic to make this happen will have to be conjured up from scratch. That probably won't happen real soon. For now, I may end up hacking DEFCONSTANT so that until support for similarity is built into the dumper and loader, DEFCONSTANT will accept anything EQUAL (or perhaps anything EQUALP?), so that things like (DEFCONSTANT +FOO+ '(1 2 3)) will sort of work, as they used to: their semantics may still be subtly screwed up, but at least they won't cause a compile error. Does anyone have other suggestions? -- William Harold Newman <wil...@ai...> software consultant PGP key fingerprint 85 CE 1C BA 79 8D 51 8C B9 25 FB EE E0 C3 E5 7C |