[cmucl-imp] [Sbcl-devel] [Didier Verna] multiple string reads/writes of SB-IMPL::BAKQ-COMMA

Faré fahree at gmail.com
Fri Oct 11 22:46:25 UTC 2013


The heart of the issue is that the pretty-printer for LET forms is
confused by the comma.
A workaround would be to use (let ((,obj nil)) ...)
A fix would be to fix the pretty-printer of LET recognize SB-IMPL::BACKQ-COMMA
(and while we're at it FARE-QUASIQUOTE::UNQUOTE, etc.?) or better,
to be less clever with the printing of bindings, just setting the start column?

—♯ƒ • François-René ÐVB Rideau •Reflection&Cybernethics• http://fare.tunes.org
A successful [software] tool is one that was used to do something
undreamed of by its author.
                — S. C. Johnson


On Fri, Oct 11, 2013 at 9:09 AM, Douglas Katzman <dougk at google.com> wrote:
> You'll get correct results doing it this way -
>
> (with-input-from-string (s "(defmacro test (&body body)
>            (let ((obj (gensym)))
>              `(let (,obj)
>                 (setq ,obj (list , at body))
>                 ,obj)))")
>            (eval (with-input-from-string
>                    (s (write-to-string (read s) :pretty nil :readably t))
>                    (read s))))
>
>
>
>
> On Fri, Oct 11, 2013 at 4:27 AM, Didier Verna <didier at lrde.epita.fr> wrote:
>>
>>
>>   Hi,
>>
>> on second thought, I'm forwarding this to sbcl-devel because I think
>> this might be a bug. The same scenario works fine with CCL. CMUCL gives
>> a note and a warning but still works:
>>
>> CL-USER> (test 'a 'b)
>> ; In: TEST 'A
>>
>> ;   (TEST 'A 'B)
>> ; ==>
>> ;   (LET (#)
>> ;     (SETQ #:G0 #)
>> ;     #:G0)
>> ; Note: Variable LISP::BACKQ-COMMA defined but never used.
>> ; ;
>>
>> ; Warning: These variables are undefined:
>> ;   #:G0 OBJ
>> ; (A B)
>>
>> The macroepansion is however similar to that of SBCL:
>>
>> CL-USER> (macroexpand '(test 'a 'b))
>> (LET ((LISP::BACKQ-COMMA OBJ))
>>   (SETQ #:G4368 (LIST 'A 'B))
>>   #:G4368)
>> T
>>
>>
>>
>>
>>
>>
>> ---------- Forwarded message ----------
>> From: Didier Verna <didier at lrde.epita.fr>
>> To: SBCL Help <sbcl-help at lists.sourceforge.net>
>> Cc:
>> Date: Fri, 11 Oct 2013 09:14:06 +0200
>> Subject: multiple string reads/writes of SB-IMPL::BAKQ-COMMA
>>
>>   Hello,
>>
>> the backquote syntax gives me a problem when doing multiple (in fact 2)
>> reads and writes of an expression. Consider this:
>>
>> CL-USER> (defmacro test (&body body)
>>            (let ((obj (gensym)))
>>              `(let (,obj)
>>                 (setq ,obj (list , at body))
>>                 ,obj)))
>> TEST
>> CL-USER> (test 'foo 'bar)
>> (FOO BAR)
>>
>>
>> CL-USER> (with-input-from-string (s "(defmacro test (&body body)
>>            (let ((obj (gensym)))
>>              `(let (,obj)
>>                 (setq ,obj (list , at body))
>>                 ,obj)))")
>>            (eval (read s)))
>> STYLE-WARNING: redefining COMMON-LISP-USER::TEST in DEFMACRO
>> TEST
>> CL-USER> (test 'foo 'bar)
>> (FOO BAR)
>>
>> ;; Okay, but then...
>>
>>
>> CL-USER> (with-input-from-string (s "(defmacro test (&body body)
>>            (let ((obj (gensym)))
>>              `(let (,obj)
>>                 (setq ,obj (list , at body))
>>                 ,obj)))")
>>            (eval (with-input-from-string (s (prin1-to-string (read s)))
>>                    (read s))))
>> STYLE-WARNING: redefining COMMON-LISP-USER::TEST in DEFMACRO
>> TEST
>> CL-USER> (test 'foo 'bar)
>> ; in: TEST 'FOO
>> ;     (LET ((SB-IMPL::BACKQ-COMMA OBJ))
>> ;       (SETQ #:G2191 (LIST 'FOO 'BAR))
>> ;       #:G2191)
>> ;
>> ; caught STYLE-WARNING:
>> ;   The variable SB-IMPL::BACKQ-COMMA is defined but never used.
>>
>> ;     (SETQ #:G2191 (LIST 'FOO 'BAR))
>> ;
>> ; caught WARNING:
>> ;   undefined variable: #:G2191
>>
>>
>> and it breaks. What happens is that in the first case, SBCL understands
>> that (SB-IMPL::BACKQ-COMMA OBJ) really means ,obj in the let form, but
>> if I read this expression, write it to a string and read it again for
>> evaluation, then it thinks that I'm trying to bind SB-IMPL::BACKQ-COMMA
>> to OBJ...
>>
>>
>> How can I avoid this behavior ?
>>
>>
>> Thanks !
>>
>> --
>> Resistance is futile. You will be jazzimilated.
>>
>> Lisp, Jazz, Aïkido: http://www.didierverna.info
>>
>>
>>
>> --
>> Resistance is futile. You will be jazzimilated.
>>
>> Lisp, Jazz, Aïkido: http://www.didierverna.info
>>
>>
>> ------------------------------------------------------------------------------
>> October Webinars: Code for Performance
>> Free Intel webinars can help you accelerate application performance.
>> Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most
>> from
>> the latest Intel processors and coprocessors. See abstracts and register >
>>
>> http://pubads.g.doubleclick.net/gampad/clk?id=60134071&iu=/4140/ostg.clktrk
>> _______________________________________________
>> Sbcl-devel mailing list
>> Sbcl-devel at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/sbcl-devel
>>
>
>
> ------------------------------------------------------------------------------
> October Webinars: Code for Performance
> Free Intel webinars can help you accelerate application performance.
> Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most
> from
> the latest Intel processors and coprocessors. See abstracts and register >
> http://pubads.g.doubleclick.net/gampad/clk?id=60134071&iu=/4140/ostg.clktrk
> _______________________________________________
> Sbcl-devel mailing list
> Sbcl-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sbcl-devel
>


More information about the cmucl-imp mailing list