From: Brent M. <bre...@gm...> - 2009-04-06 00:41:25
|
Hello all, first bug report. Using gentoo, 2.6.29 kernel, sbcl 1.0.19, there is a possible error. Compare the following MACROEXPAND-1 applications of the following two definitions of macros: (defmacro fails-during-exp (name &key a) `(defpackage ,name ,(when a "a exists"))) (defmacro succs-during-exp (name &key a) `(some-name ,name ,(when a "a exists"))) Notice that the first macro has the symbol 'defpackage. (macroexpand-1 '(fails-during-exp "abcd" :a t)) runs fine (macroexpand-1 '(succs-during-exp "abcd" :a t)) runs fine (macroexpand-1 '(succs-during-exp "abcd")) runs fine (macroexpand-1 '(fails-during-exp "abcd")) results in an error error in FORMAT: no more arguments ~:<~W~^ ~3I~:_~W~^~1I~@{~:@_~:<~W~^ ~:I~@_~@{~W~^ ~_~}~:>~}~:> ^ [Condition of type SB-FORMAT:FORMAT-ERROR] Restarts: 0: [ABORT] Return to SLIME's top level. 1: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-thread" RUNNING {1002C73DE1}>) Backtrace: 0: ((LABELS #:WITH-CIRCULARITY-DETECTION-BODY-3980)) 1: ((LABELS #:WITH-CIRCULARITY-DETECTION-BODY-3948)) 2: (SB-PRETTY::PPRINT-DEFPACKAGE #<SB-PRETTY:PRETTY-STREAM {10033C4991}> (DEFPACKAGE :SHEESH NIL))[:EXTERNAL] 3: (SB-PRETTY:OUTPUT-PRETTY-OBJECT (DEFPACKAGE :SHEESH NIL) #<SB-IMPL::STRING-OUTPUT-STREAM {10033C4241}>) 4: (SB-IMPL::STRINGIFY-OBJECT (DEFPACKAGE :SHEESH NIL)) 5: (PRIN1-TO-STRING (DEFPACKAGE :SHEESH NIL)) It seems that changing the (when a "a exists") to a (if a "a exists" t), fixes the problem. It seems that returning nil is a problem in this case. Returning true is fine. I don't know if due to the specification, this is not an issue, however, extending defpackage, and even redefining it can be desirable in some situations such as developing a custom system definition suite. Best, Brent Millare |
From: Sidney M. <si...@si...> - 2009-04-06 02:17:23
|
Brent Millare wrote, On 6/4/09 12:41 PM: > Backtrace: > 0: ((LABELS #:WITH-CIRCULARITY-DETECTION-BODY-3980)) > 1: ((LABELS #:WITH-CIRCULARITY-DETECTION-BODY-3948)) > 2: (SB-PRETTY::PPRINT-DEFPACKAGE #<SB-PRETTY:PRETTY-STREAM > {10033C4991}> (DEFPACKAGE :SHEESH NIL))[:EXTERNAL] This is much worse than an issue with macro expansion. You can demonstrate this bug even more easily by typing at the REPL '(defpackage :foo nil) The problem seems to be that pretty-printing a cons with car 'defpackage invokes SB-PRETTY::PPRINT-DEFPACKAGE which is defined in code/pprint.lisp pprint-defpackage assumes that the form being printed is in the form of a valid call to defpackage, which I don't think is at all a good assumption. I would post a patch for pprint-defpackage, but it really looks like someone needs to look at all of the pprint-foo functions in code/pprint.lisp to see which ones have the same problem if handed something that their format calls do not expect. -- sidney |
From: Sidney M. <si...@si...> - 2009-04-07 23:08:54
Attachments:
pprint-defpackage-bug.patch
|
Sidney Markowitz wrote, On 6/4/09 1:32 PM: > This is much worse than an issue with macro expansion. You can > demonstrate this bug even more easily by typing at the REPL > > '(defpackage :foo nil) > The problem is a missing ~^ before a ~W format control that causes an error when it tries to print the first element of that list when the list is empty. I checked all the other pprint-foo functions in the file and this is the only one that is missing such a ~^ before a ~W in a list that can be NIL. Attached is the patch for it. -- Sidney Markowitz http://sidney.com |
From: Sidney M. <si...@si...> - 2009-04-22 22:43:52
Attachments:
pprint-defpackage-bug.patch
|
This patch I posted a couple of weeks ago seems to have fallen through the cracks. The bug is still in cvs HEAD. Type '(defpackage :foo nil) at the REPL and you get (DEFPACKAGE :FOO debugger invoked on a SB-FORMAT:FORMAT-ERROR: error in FORMAT: no more arguments ~:<~W~^ ~3I~:_~W~^~1I~@{~:@_~:<~W~^ ~:I~@_~@{~W~^ ~_~}~:>~}~:> ^ ------------- The problem is a missing ~^ before a ~W format control that causes an error when it tries to print the first element of that list when the list is empty. I checked all the other pprint-foo functions in the file and this is the only one that is missing such a ~^ before a ~W in a list that can be NIL. Attached is the patch for it. -- Sidney Markowitz http://sidney.com |
From: Nikodemus S. <nik...@ra...> - 2009-04-23 11:42:54
|
2009/4/23 Sidney Markowitz <si...@si...>: > diff --git a/src/code/pprint.lisp b/src/code/pprint.lisp > index 89bac81..74c368c 100644 > --- a/src/code/pprint.lisp > +++ b/src/code/pprint.lisp > @@ -1241,7 +1241,7 @@ line break." > (defun pprint-defpackage (stream list &rest noise) > (declare (ignore noise)) > (funcall (formatter > - "~:<~W~^ ~3I~:_~W~^~1I~@{~:@_~:<~W~^ ~:I~@_~@{~W~^ ~_~}~:>~}~:>") > + "~:<~W~^ ~3I~:_~W~^~1I~@{~:@_~:<~^~W~^ ~:I~@_~@{~W~^ ~_~}~:>~}~:>") > stream > list)) Merged as 1.0.27.24, thank you! Cheers, -- Nikodemus |