From: Adam W. <li...@co...> - 2004-10-18 08:24:01
|
Hi Peter, (setf (readtable-case *readtable*) :invert) '|CL|:eval-when This should return the symbol EVAL-WHEN in the package COMMON-LISP. And this shouldn't return the symbol EVAL-WHEN in the package COMMON-LISP: '|CL|:EVAL-WHEN (The COMMON-LISP nickname is escaped so the package name is unaffected by the readtable mode. The symbol's characters are unescaped and all of one case so they are inverted. Thus eval-when should be interned as "EVAL-WHEN" in package COMMON-LISP). Regards, Adam |
From: Peter G. <pe...@ar...> - 2004-11-30 05:35:31
|
On Mon, 18 Oct 2004 at 21:23:55 +1300, Adam Warner wrote: > Hi Peter, > > (setf (readtable-case *readtable*) :invert) > '|CL|:eval-when > > This should return the symbol EVAL-WHEN in the package COMMON-LISP. > > And this shouldn't return the symbol EVAL-WHEN in the package COMMON-LISP: > '|CL|:EVAL-WHEN > > (The COMMON-LISP nickname is escaped so the package name is unaffected by > the readtable mode. The symbol's characters are unescaped and all of one > case so they are inverted. Thus eval-when should be interned as > "EVAL-WHEN" in package COMMON-LISP). This is now fixed in CVS. Thanks! -Peter |
From: Adam W. <li...@co...> - 2004-11-30 10:53:56
|
Hi Peter Graves, >> (setf (readtable-case *readtable*) :invert) >> '|CL|:eval-when >> >> This should return the symbol EVAL-WHEN in the package COMMON-LISP. >> >> And this shouldn't return the symbol EVAL-WHEN in the package COMMON-LISP: >> '|CL|:EVAL-WHEN >> >> (The COMMON-LISP nickname is escaped so the package name is unaffected by >> the readtable mode. The symbol's characters are unescaped and all of one >> case so they are inverted. Thus eval-when should be interned as >> "EVAL-WHEN" in package COMMON-LISP). > > This is now fixed in CVS. Fantastic! I've tested the symbol reader extensively and I've managed to reproduce an additional bug. (setf (readtable-case *readtable*) :invert) (make-package :another-package) (in-package :another-package) 'cl:loop => COMMON-LISP:loop [the package name is printed in the wrong case] I haven't located the fix but this section of Symbol.java appears to be insufficient (I'd add the two lines with the +'s in the order below because invert is a more popular readtable mode than downcase): // Package prefix is necessary. String packageName = pkg.getName(); if (needsEscape(packageName, readtableCase, thread)) packageName = multipleEscape(packageName); + else if (printCase == Keyword.INVERT) + packageName = invert(packageName); else if (printCase == Keyword.DOWNCASE) packageName = packageName.toLowerCase(); StringBuffer sb = new StringBuffer(packageName); if (((Package)pkg).findExternalSymbol(n) != null) sb.append(':'); else sb.append("::"); sb.append(s); return sb.toString(); Regards, Adam |
From: Peter G. <pe...@ar...> - 2004-12-06 19:54:57
|
On Tue, 30 Nov 2004 at 23:53:44 +1300, Adam Warner wrote: > Fantastic! I've tested the symbol reader extensively and I've managed > to reproduce an additional bug. > > (setf (readtable-case *readtable*) :invert) > (make-package :another-package) > (in-package :another-package) > 'cl:loop => COMMON-LISP:loop > [the package name is printed in the wrong case] I've just checked in a fix for this. The ANSI test suite does not appear to catch this failure; ABCL passed all the tests in print-symbols.lsp even without the latest fix. > I haven't located the fix but this section of Symbol.java appears to be > insufficient (I'd add the two lines with the +'s in the order below > because invert is a more popular readtable mode than downcase): > > // Package prefix is necessary. > String packageName = pkg.getName(); > if (needsEscape(packageName, readtableCase, thread)) > packageName = multipleEscape(packageName); > + else if (printCase == Keyword.INVERT) > + packageName = invert(packageName); > else if (printCase == Keyword.DOWNCASE) > packageName = packageName.toLowerCase(); > StringBuffer sb = new StringBuffer(packageName); > if (((Package)pkg).findExternalSymbol(n) != null) > sb.append(':'); > else > sb.append("::"); > sb.append(s); > return sb.toString(); *PRINT-CASE* is specified to be "one of the symbols :UPCASE, :DOWNCASE, or :CAPITALIZE", so I don't think we need to handle :INVERT there. Thanks! -Peter |
From: Paul F. D. <di...@dl...> - 2004-12-07 01:17:48
|
Peter Graves wrote: > The ANSI test suite does not appear to catch this failure; ABCL passed > all the tests in print-symbols.lsp even without the latest fix. The reader is one part of the spec that has not yet been tested (except incidentally to testing other parts.) Paul |
From: Adam W. <li...@co...> - 2004-12-07 09:59:53
|
Hi Peter Graves, > On Tue, 30 Nov 2004 at 23:53:44 +1300, Adam Warner wrote: >> Fantastic! I've tested the symbol reader extensively and I've managed >> to reproduce an additional bug. >> >> (setf (readtable-case *readtable*) :invert) >> (make-package :another-package) >> (in-package :another-package) >> 'cl:loop => COMMON-LISP:loop >> [the package name is printed in the wrong case] > > I've just checked in a fix for this. Thanks Peter! > *PRINT-CASE* is specified to be "one of the symbols :UPCASE, :DOWNCASE, > or :CAPITALIZE", so I don't think we need to handle :INVERT there. I didn't realise where the odd :CAPITALIZE option came from! Thank goodness that read case sensitivity has priority over print case: "In order to avoid complex interactions between the case setting of the readtable and *PRINT-CASE*, this proposal specifies a significance for *PRINT-CASE* only when the case setting is :UPCASE or :DOWNCASE" [Issue READ-CASE-SENSITIVITY Writeup] Regards, Adam |