[racket] using scribble/eval in conjunction with scribble/lp

From: Joel McCracken (mccracken.joel at gmail.com)
Date: Mon Jan 5 23:17:43 EST 2015

I think I've successfully written the macro:


(define-syntax (lit-examples stx)
  (syntax-case stx ()
    [(_ e ...)
     #`(begin
         (let ([evaluator (make-base-eval)]
               [here (quote-source-file #,stx)])

           (evaluator `(begin
                         (dynamic-require '(file ,here) #f)
                         (current-namespace
                            (module->namespace '(file ,here)))))
           (examples #:eval evaluator
                     e ...)))]))


Do you have any advice on better style? This is my first "real" Racket
macro, and it was pretty hard to get working, so I am pretty sure the
code is gross in some way.


On Thu, Dec 18, 2014 at 3:14 PM, Joel McCracken
<mccracken.joel at gmail.com> wrote:
> I tried creating an `examples` macro like the existing `examples`
> macro, without success. I'll try again later, but for now thanks! This
> makes things much nicer.
>
> On Wed, Dec 17, 2014 at 10:26 AM, Matthew Flatt <mflatt at cs.utah.edu> wrote:
>> The `scribble/lp2` language doesn't include any new support for
>> `examples`. Maybe the code to create and initialize `evaluator` belongs
>> in a library somewhere, though.
>>
>> At Wed, 17 Dec 2014 10:17:57 -0500, Joel McCracken wrote:
>>> OK, so I've gotten a Racket that has scribble/lp2, so Yay. I can
>>> generate documentation with the "Scribble HTML".
>>>
>>>
>>> Do I need to do something to make `@examples` evaluate with the
>>> current module? This is what I'm currently using that makes it work:
>>>
>>>
>>> #lang scribble/lp2
>>> @(require scribble/base
>>>           scribble/eval)
>>>
>>> @title{An Example}
>>>
>>> This would be a @bold{wonderful} way to accomplish things!
>>>
>>>
>>> @chunk[<*>
>>>         (define (f x)
>>>           <f-body>)]
>>>
>>> @chunk[<f-body>
>>>         (* x x)]
>>>
>>>
>>> And then, I could show an example:
>>>
>>> @(begin
>>>    (require syntax/location)
>>>    (define here (quote-source-file))
>>>    (define evaluator (make-base-eval))
>>>    (evaluator `(begin
>>>                 (dynamic-require '(file ,here) #f)
>>>                 (current-namespace
>>>                  (module->namespace '(file ,here))))))
>>>
>>> @examples[
>>>         #:eval evaluator
>>>         (f 10)
>>> ]
>>>
>>>
>>> I'm not sure if lp2 includes some facility to make @examples work
>>> without the evaluator creation.
>>>
>>>
>>>
>>>
>>> On Tue, Dec 16, 2014 at 11:48 PM, Joel McCracken
>>> <mccracken.joel at gmail.com> wrote:
>>> > I'm glad there is a repository issue -- that's where I tried without
>>> > success. I tried the build available right now (3bb896d) without
>>> > success, but will look again tomorrow.
>>> >
>>> > This is the reason I think Racket is so great. You were able to create
>>> > the lp language version 2 as an afterthought. Awesome.
>>> >
>>> > On Tue, Dec 16, 2014 at 3:04 PM, Matthew Flatt <mflatt at cs.utah.edu> wrote:
>>> >> ... after the next build, at least.
>>> >>
>>> >> Problems related to the repository split have prevented the snapshots
>>> >> from being up-to-date for the past few days, but I'm optimistic that
>>> >> the next snapshot will be right.
>>> >>
>>> >> At Tue, 16 Dec 2014 14:54:06 -0500, Matthias Felleisen wrote:
>>> >>>
>>> >>> You probably want the current snapshot:
>>> >>>
>>> >>>   http://www.cs.utah.edu/plt/snapshots/
>>> >>>
>>> >>>
>>> >>>
>>> >>>
>>> >>> On Dec 16, 2014, at 1:28 PM, Joel McCracken <mccracken.joel at gmail.com>
>>> wrote:
>>> >>>
>>> >>> > Forwarding to users, since I forgot to reply-all.
>>> >>> >
>>> >>> >
>>> >>> > ---------- Forwarded message ----------
>>> >>> > From: Joel McCracken <mccracken.joel at gmail.com>
>>> >>> > Date: Tue, Dec 16, 2014 at 1:27 PM
>>> >>> > Subject: Re: [racket] using scribble/eval in conjunction with scribble/lp
>>> >>> > To: Matthew Flatt <mflatt at cs.utah.edu>
>>> >>> >
>>> >>> >
>>> >>> > Hmm, I'm having trouble finding this new release of Racket that will
>>> >>> > allow a #lang scribble/lp2 -- I'll keep looking later. This is awesome
>>> >>> > though, thank you for the prompt response!
>>> >>> >
>>> >>> > On Mon, Dec 15, 2014 at 8:15 PM, Matthew Flatt <mflatt at cs.utah.edu> wrote:
>>> >>> >> At Mon, 15 Dec 2014 15:49:38 -0700, Matthew Flatt wrote:
>>> >>> >>> Meanwhile, I'll work on changing `scribble/lp` so that a module
>>> >>> >>> implemented with `#lang scribble/lp` can be passed directly to
>>> >>> >>> Scribble.
>>> >>> >>
>>> >>> >> That turned out to be `scribble/lp2`, since the changes would be
>>> >>> >> incompatible with existing uses of `scribble/lp`.
>>> >>> >>
>>> >>> >> With the development versions of the "drracket" and "scribble"
>>> >>> >> packages, and with the program below, you can click "Run" to run the
>>> >>> >> program and interact with `f`, or you can click one of the "Scribble"
>>> >>> >> buttons to render the document.
>>> >>> >>
>>> >>> >> ----------------------------------------
>>> >>> >>
>>> >>> >> #lang scribble/lp2
>>> >>> >> @(require scribble/base
>>> >>> >>          scribble/eval)
>>> >>> >>
>>> >>> >> @title{An Example}
>>> >>> >>
>>> >>> >> This would be a @bold{wonderful} way to accomplish things!
>>> >>> >>
>>> >>> >> @chunk[<*>
>>> >>> >>        (define (f x)
>>> >>> >>          <f-body>)]
>>> >>> >>
>>> >>> >> @chunk[<f-body>
>>> >>> >>        (* x x)]
>>> >>> >>
>>> >>> >>
>>> >>> >> And then, I could show an example:
>>> >>> >>
>>> >>> >> @(begin
>>> >>> >>   (require syntax/location)
>>> >>> >>   (define here (quote-source-file))
>>> >>> >>   (define evaluator (make-base-eval))
>>> >>> >>   (evaluator `(begin
>>> >>> >>                (dynamic-require '(file ,here) #f)
>>> >>> >>                (current-namespace
>>> >>> >>                 (module->namespace '(file ,here))))))
>>> >>> >>
>>> >>> >> @examples[
>>> >>> >>        #:eval evaluator
>>> >>> >>        (f 10)
>>> >>> >> ]
>>> >>> >>
>>> >>> > ____________________
>>> >>> >  Racket Users list:
>>> >>> >  http://lists.racket-lang.org/users
>>> >>>
>>> >>> ____________________
>>> >>>   Racket Users list:
>>> >>>   http://lists.racket-lang.org/users

Posted on the users mailing list.