Oh. I checked that that the expressions were accumulating in the definition of 
extract-expression, but I didn't check that it expanded in the right order to 
do what you want.

So this doesn't actually work. 

On Jul 21, 2015, at 3:08 PM, Alexander D. Knauth <alexan...@knauth.org> wrote:

> Here's a macro that does something similar:
> 
> #lang at-exp racket
> 
> (require (for-syntax syntax/parse
>                     racket/contract
>                     ))
> 
> (begin-for-syntax
>  (define (get-extracted-exprs-box extracted-exprs-id)
>    (syntax-local-value extracted-exprs-id))
>  (define (get-extracted-exprs extracted-exprs-id)
>    (unbox (get-extracted-exprs-box extracted-exprs-id)))
>  (define (box-update! b f)
>    (set-box! b (f (unbox b))))
>  (define (add-extracted-expr! extracted-exprs-id new-expr)
>    (box-update! (get-extracted-exprs-box extracted-exprs-id)
>                 (λ (lst) (append lst (list (syntax-local-introduce 
> new-expr)))))))
> 
> (define-syntax extract-expression
>  (syntax-parser
>    [(extract-expression expr:expr extracted-exprs-id:id)
>     (add-extracted-expr! #'extracted-exprs-id #'expr)
>     #'expr]))
> 
> (define-syntax with-extract-expressions
>  (syntax-parser
>    [(with-extract-expressions stx-expr:expr ...)
>     #:with [extracted-exprs macro-id:id ...]
>     (generate-temporaries #'[extracted-expressions stx-expr ...])
>     #'(begin
>         (define-syntax extracted-exprs (box '()))
>         (begin
>           (define-syntax macro-id
>             (lambda (stx)
>               (stx-expr #'extracted-exprs)))
>           (macro-id))
>     ...)]))
> 
> (define (square x) (* x x))
> 
> (with-extract-expressions
> (lambda (exprs)
>   (with-syntax ([exprs exprs])
>     #'(module+ test
>         (require rackunit)
>         (check-equal? (extract-expression (square 5) exprs) 25)
>         (check-equal? (extract-expression (square -5) exprs) 25))))
> (lambda (exprs)
>   (with-syntax ([(expr ...) (get-extracted-exprs exprs)])
>     #'(module+ doc
>         (require scribble/manual
>                  scribble/eval)
>         (define evaluator (make-base-eval))
>         @defproc[(square [x real?]) real?]{
>           Returns the square of @racket[x], the result of
>           multiplying @racket[x] by itself.
>           @examples[#:eval evaluator expr ...]}))))
> 
> 
> On Jul 20, 2015, at 8:03 PM, Jack Firth <jackhfi...@gmail.com> wrote:
> 
>> I'm trying to create a way to automatically turn test cases into examples. 
>> I'd like a macro that turns this:
>> 
>> (extract-expressions
>> (module+ test
>>  (check-equal? (extract-expression (square 5)) 25)
>>  (check-equal? (extract-expression (square -5)) 25))
>> (module+ doc
>>  @defproc[(square [x real?]) real?]{
>>    Returns the square of @racket[x], the result of
>>    multiplying @racket[x] by itself.
>>    @examples[#:eval evaluator (include-extracted-expressions)]}))
>> 
>> into this:
>> 
>> (begin
>> (module+ test
>>   (check-equal? (square 5) 25))
>> (module+ doc
>>   @defproc[(square [x real?]) real?]{
>>     Returns the square of @racket[x], the result of
>>     multiplying @racket[x] by itself.
>>     @examples[#:eval evaluator (square 5) (square -5)]}))
>> 
>> That's the general idea anyway. I want to be able to gather arbitrary 
>> expressions inside a region and "copy" them into some other marked place 
>> inside the expressions. How exactly do I go about doing this, and how should 
>> I do it "properly"?
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Racket Users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to racket-users+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to racket-users+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to