From: Jerry J. <log...@gm...> - 2008-11-01 17:41:10
|
I'm still working on a port of PVS (http://pvs.csl.sri.com/) to SBCL. Almost everything works, but I'm having a little trouble with the pretty printer in one place. The basic problem is that this code: (with-output-to-string (string) (write '("some string") :stream string :pretty nil :pprint-dispatch nil)) works on the existing PVS ports (Allegro and CMU Lisp), but on SBCL 1.0.21 (x86_64) does this: debugger invoked on a TYPE-ERROR in thread #<THREAD "initial thread" RUNNING {100270FAC1}>: The value NIL is not of type SB-PRETTY:PPRINT-DISPATCH-TABLE. Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL. restarts (invokable by number or by possibly-abbreviated name): 0: [ABORT] Exit debugger, returning to top level. The code in question is inside a pretty-printing function, and is trying to use a nil pprint-dispatch-table to avoid infinite recursion. Note that :pretty nil was also specified. Even binding *print-pretty* to nil doesn't help. Do you have any suggestions on how I might avoid this error? Thanks. -- Jerry James http://loganjerry.googlepages.com/ |
From: Richard M K. <kr...@pr...> - 2008-11-03 14:45:02
|
"Jerry James" writes: > I'm still working on a port of PVS (http://pvs.csl.sri.com/) to SBCL. > Almost everything works, but I'm having a little trouble with the > pretty printer in one place. The basic problem is that this code: > > (with-output-to-string (string) > (write '("some string") :stream string :pretty nil :pprint-dispatch nil)) > > works on the existing PVS ports (Allegro and CMU Lisp), but on SBCL > 1.0.21 (x86_64) does this: > > debugger invoked on a TYPE-ERROR in thread #<THREAD "initial thread" > RUNNING {100270FAC1}>: > The value NIL is not of type SB-PRETTY:PPRINT-DISPATCH-TABLE. > > Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL. > > restarts (invokable by number or by possibly-abbreviated name): > 0: [ABORT] Exit debugger, returning to top level. > > > The code in question is inside a pretty-printing function, and is > trying to use a nil pprint-dispatch-table to avoid infinite recursion. The dictionary entry for WRITE says that the PPRINT-DISPATCH argument must be a pprint dispatch table, and NIL isn't one, so that call is arguably not conforming. (The actual culprit is that SBCL declares the type of *PRINT-PPRINT-DISPATCH* to be a pprint dispatch table, and so errors if you try binding the variable to something that isn't one, and WRITE binds printer control variables.) Since you're supplying an explicit PRETTY NIL, the pprint dispatch table shouldn't be used, so leaving out the PPRINT-DISPATCH argument or supplying any pprint dispatch table ought to do the trick. (If you're worried about not bottoming out in case something rebinds *PRINT-PRETTY* to true, you might try supplying a copy of the initial pprint dispatch table.) -- Richard |
From: Jerry J. <log...@gm...> - 2008-11-04 04:03:37
|
On Mon, Nov 3, 2008 at 7:43 AM, Richard M Kreuter <kr...@pr...> wrote: > The dictionary entry for WRITE says that the PPRINT-DISPATCH argument > must be a pprint dispatch table, and NIL isn't one, so that call is > arguably not conforming. (The actual culprit is that SBCL declares the > type of *PRINT-PPRINT-DISPATCH* to be a pprint dispatch table, and so > errors if you try binding the variable to something that isn't one, and > WRITE binds printer control variables.) > > Since you're supplying an explicit PRETTY NIL, the pprint dispatch table > shouldn't be used, so leaving out the PPRINT-DISPATCH argument or > supplying any pprint dispatch table ought to do the trick. (If you're > worried about not bottoming out in case something rebinds *PRINT-PRETTY* > to true, you might try supplying a copy of the initial pprint dispatch > table.) > > -- > Richard Thanks, Richard. Unfortunately, leaving the :pprint-dispatch argument out altogether still didn't work. I got an error in write-object. Let me dig through the PVS code a little to see if I can understand how it is supposed to work. Once I get that information in my head, I'll ping the list again if I need more help. Thanks! -- Jerry James http://loganjerry.googlepages.com/ |
From: Jerry J. <log...@gm...> - 2008-11-05 04:11:22
|
On Mon, Nov 3, 2008 at 9:03 PM, Jerry James <log...@gm...> wrote: > Thanks, Richard. Unfortunately, leaving the :pprint-dispatch argument > out altogether still didn't work. I got an error in write-object. > Let me dig through the PVS code a little to see if I can understand > how it is supposed to work. Once I get that information in my head, > I'll ping the list again if I need more help. Thanks! So this is what worked for me: (write ... :pprint-dispatch #-sbcl nil #+sbcl (sb-pretty::make-pprint-dispatch-table) ...) That seems to have done the trick. Thanks again, -- Jerry James http://loganjerry.googlepages.com/ |