From 48821f2a7d30fe68dce8f24f4f63c304a5183287 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sat, 4 Jul 2015 10:12:59 -0700 Subject: [PATCH] add `report/line` and `report/file` --- sugar/scribblings/debug.scrbl | 12 ++++++++- typed/sugar/debug.rkt | 51 ++++++++++++++++++++++++----------- 2 files changed, 47 insertions(+), 16 deletions(-) diff --git a/sugar/scribblings/debug.scrbl b/sugar/scribblings/debug.scrbl index 2698cd4..a6999ca 100644 --- a/sugar/scribblings/debug.scrbl +++ b/sugar/scribblings/debug.scrbl @@ -51,8 +51,18 @@ But be careful — in the example below, the result of the @racket[if] expressi (report x)] +@defform*[((report/line expr) (report/line expr maybe-name))] +Same as @racket[report], but also shows the line number of @racket[_expr]. + +@defform*[((report/file expr) (report/file expr maybe-name))] +Same as @racket[report], but also shows the line number and source-file name of @racket[_expr]. + +@deftogether[( @defform[(report* expr ...)] -Apply @racket[report] separately to each @racket[_expr] in the list. +@defform[(report*/line expr ...)] +@defform[(report*/file expr ...)] +)] +Apply the relevant @racket[report] macro separately to each @racket[_expr] in the list. @defform[(repeat num expr ...)] Evaluate @racket[_expr] repeatedly — @racket[_num] times, in fact — and return the last value. diff --git a/typed/sugar/debug.rkt b/typed/sugar/debug.rkt index e2fac99..683b2aa 100644 --- a/typed/sugar/debug.rkt +++ b/typed/sugar/debug.rkt @@ -1,22 +1,46 @@ #lang typed/racket/base (require (for-syntax racket/base racket/syntax)) - (provide (all-defined-out)) + (define-syntax (report stx) (syntax-case stx () [(_ expr) #'(report expr expr)] - [(_ expr #:line) #'(report expr expr #:line)] [(_ expr name) - #'(let ([x expr]) - (eprintf "~a = ~v\n" 'name x) - x)] - [(_ expr name #:line) + #'(let ([expr-result expr]) + (eprintf "~a = ~v\n" 'name expr-result) + expr-result)])) + + +(define-syntax (report/line stx) + (syntax-case stx () + [(_ expr) #'(report/line expr expr)] + [(_ expr name) (with-syntax ([line (syntax-line #'expr)]) - #'(let ([x expr]) - (eprintf "~a = ~v on line ~v\n" 'name x line) - x))] - )) + #'(let ([expr-result expr]) + (eprintf "~a = ~v on line ~v\n" 'name expr-result line) + expr-result))])) + + +(define-syntax (report/file stx) + (syntax-case stx () + [(_ expr) #'(report/file expr expr)] + [(_ expr name) + (with-syntax ([file (syntax-source #'expr)] + [line (syntax-line #'expr)]) + #'(let ([expr-result expr]) + (eprintf "~a = ~v on line ~v in \"~a\"\n" 'name expr-result line file) + expr-result))])) + + +(define-syntax-rule (define-multi-version multi-name name) + (define-syntax-rule (multi-name x (... ...)) + (begin (name x) (... ...)))) + +(define-multi-version report* report) +(define-multi-version report*/line report/line) +(define-multi-version report*/file report/file) + (define-syntax report-apply (syntax-rules () @@ -27,8 +51,7 @@ [(report-apply proc expr #:line) (let ([lst expr]) (report (apply proc lst) (apply proc expr) #:line) - lst)] - )) + lst)])) #| (define-syntax (verbalize stx) @@ -40,9 +63,7 @@ (report (proc args ...))))])) |# -(define-syntax (report* stx) - (syntax-case stx () - [(_ expr ...) #'(begin (report expr) ...)])) + (define-syntax-rule (repeat num expr ...)