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.

Reply via email to