diff --git a/collects/tests/unstable/debug.rkt b/collects/tests/unstable/debug.rkt new file mode 100644 index 0000000000..bb04c5390c --- /dev/null +++ b/collects/tests/unstable/debug.rkt @@ -0,0 +1,21 @@ +#lang racket + +(require rackunit rackunit/text-ui unstable/debug "helpers.rkt") + +(run-tests + (test-suite "debug.ss" + (test-suite "dprintf" + (test + (let () + (define logger (make-logger)) + (define receiver (make-log-receiver logger 'debug)) + (parameterize ([current-logger logger]) + (dprintf "Danger, ~a!" "Will Robinson")) + (check-not-false + (member + "Danger, Will Robinson!" + (let loop () + (match (sync/timeout 0 receiver) + [(vector 'debug (? string? message) _) + (cons message (loop))] + [_ null]))))))))) diff --git a/collects/typed-scheme/utils/tc-utils.rkt b/collects/typed-scheme/utils/tc-utils.rkt index cea0944159..f1559e47f0 100644 --- a/collects/typed-scheme/utils/tc-utils.rkt +++ b/collects/typed-scheme/utils/tc-utils.rkt @@ -47,7 +47,7 @@ don't depend on any other portion of the system (when (and (warn-unreachable?) (log-level? l 'warning) (and (syntax-transforming?) (syntax-original? (syntax-local-introduce e))) - #;(and (orig-module-stx) (eq? (debug/call syntax-source-module e) (debug/call syntax-source-module (orig-module-stx)))) + #;(and (orig-module-stx) (eq? (call/debug syntax-source-module e) (call/debug syntax-source-module (orig-module-stx)))) #;(syntax-source-module stx)) (log-message l 'warning (format "Typed Scheme has detected unreachable code: ~e" (syntax->datum (locate-stx e))) e)))) diff --git a/collects/unstable/cce/debug.ss b/collects/unstable/cce/debug.ss deleted file mode 100644 index ce9de45894..0000000000 --- a/collects/unstable/cce/debug.ss +++ /dev/null @@ -1,161 +0,0 @@ -#lang scheme - -(provide debug - dprintf - begin/debug - define/debug - define/private/debug - define/public/debug - define/override/debug - define/augment/debug - let/debug - let*/debug - letrec/debug - let-values/debug - let*-values/debug - letrec-values/debug - with-syntax/debug - with-syntax*/debug - parameterize/debug - with-debugging) - -(require unstable/srcloc - unstable/location - unstable/syntax - (for-syntax scheme/match syntax/parse unstable/syntax)) - -(define-syntax (let/debug stx) - (syntax-parse stx - [(_ (~optional loop:id) ([lhs:id rhs:expr] ...) body:expr ...+) - #`(with-debugging - #:name '#,(if (attribute loop) #'loop #'let/debug) - #:source (quote-srcloc #,stx) - (let #,@(if (attribute loop) (list #'loop) null) - ([lhs (with-debugging #:name 'lhs rhs)] ...) - (debug body) ...))])) - -(define-syntaxes - [ let*/debug - letrec/debug - let-values/debug - let*-values/debug - letrec-values/debug - with-syntax/debug - with-syntax*/debug - parameterize/debug ] - - (let () - - (define ((expander binder-id) stx) - (with-syntax ([binder binder-id]) - (syntax-parse stx - [(binder/debug:id ([lhs rhs:expr] ...) body:expr ...+) - #`(with-debugging - #:name 'binder/debug - #:source (quote-srcloc #,stx) - (binder - ([lhs (with-debugging #:name 'lhs rhs)] ...) - (debug body) ...))]))) - - (values (expander #'let*) - (expander #'letrec) - (expander #'let-values) - (expander #'let*-values) - (expander #'letrec-values) - (expander #'with-syntax) - (expander #'with-syntax*) - (expander #'parameterize)))) - -(define-syntaxes - [ define/debug - define/private/debug - define/public/debug - define/override/debug - define/augment/debug ] - - (let () - - (define-syntax-class header - #:attributes [name] - (pattern (name:id . _)) - (pattern (inner:header . _) #:attr name (attribute inner.name))) - - (define ((expander definer-id) stx) - (with-syntax ([definer definer-id]) - (syntax-parse stx - [(definer/debug:id name:id body:expr) - #`(definer name - (with-debugging - #:name 'name - #:source (quote-srcloc #,stx) - body))] - [(definer/debug:id spec:header body:expr ...+) - #`(definer spec - (with-debugging - #:name 'spec.name - #:source (quote-srcloc #,stx) - (let () body ...)))]))) - - (values (expander #'define) - (expander #'define/private) - (expander #'define/public) - (expander #'define/override) - (expander #'define/augment)))) - -(define-syntax (begin/debug stx) - (syntax-parse stx - [(_ term:expr ...) - #`(with-debugging - #:name 'begin/debug - #:source (quote-srcloc #,stx) - (begin (debug term) ...))])) - -(define-syntax (debug stx) - (syntax-parse stx - [(_ term:expr) - (syntax (with-debugging term))])) - -(define-syntax (with-debugging stx) - (syntax-parse stx - [(_ (~or (~optional (~seq #:name name:expr)) - (~optional (~seq #:source source:expr))) - ... - body:expr) - (with-syntax* ([name (or (attribute name) #'(quote body))] - [source (or (attribute source) #'(quote-srcloc body))]) - #'(with-debugging/proc - name - source - (quote body) - (lambda () (#%expression body))))])) - -(define (with-debugging/proc name source term thunk) - (let* ([src (source-location->prefix source)]) - (begin - (dprintf ">> ~a~s" src name) - (begin0 - (parameterize ([current-debug-depth - (add1 (current-debug-depth))]) - (call-with-values thunk - (lambda results - (match results - [(list v) (dprintf "~s" v)] - [(list vs ...) - (dprintf "(values~a)" - (apply string-append - (for/list ([v (in-list vs)]) - (format " ~s" v))))]) - (apply values results)))) - (dprintf "<< ~a~s" src name))))) - -(define (dprintf fmt . args) - (let* ([message (apply format fmt args)] - [prefix (make-string (* debug-indent (current-debug-depth)) #\space)] - [indented - (string-append - prefix - (regexp-replace* "\n" message (string-append "\n" prefix)))]) - (log-debug indented))) - -(define current-debug-depth (make-parameter 0)) -(define debug-indent 2) diff --git a/collects/unstable/cce/reference/debug.scrbl b/collects/unstable/cce/reference/debug.scrbl deleted file mode 100644 index 989d8687ed..0000000000 --- a/collects/unstable/cce/reference/debug.scrbl +++ /dev/null @@ -1,71 +0,0 @@ -#lang scribble/doc -@(require scribble/manual - scribble/eval - unstable/scribble - "eval.ss") -@(require (for-label scheme unstable/cce/debug unstable/syntax)) - -@title[#:style 'quiet #:tag "cce-debug"]{Debugging} - -@defmodule[unstable/cce/debug] - -This module provides macros and functions for printing out debugging -information. - -@defform[(debug expr)]{ - -Logs debugging information before and after the evaluation of expression -@scheme[expr]. - -} - -@defform/subs[ -(with-debugging options ... expr) -([options (code:line #:name name-expr) - (code:line #:source srcloc-expr)]) -]{ - -Logs debugging information like @scheme[debug], with the option of explicitly -overriding the name and source location information for the expression. - -} - -@defproc[(dprintf [fmt string?] [arg any/c] ...) void?]{ - -Constructs a message in the same manner as @scheme[format], and logs it at the -debugging priority (like @scheme[log-debug]). - -} - -@deftogether[( -@defform[(begin/debug expr ...)] -@defform*[[(define/debug id expr) - (define/debug (head args) body ...+)]] -@defform*[[(define/private/debug id expr) - (define/private/debug (head args) body ...+)]] -@defform*[[(define/public/debug id expr) - (define/public/debug (head args) body ...+)]] -@defform*[[(define/override/debug id expr) - (define/override/debug (head args) body ...+)]] -@defform*[[(define/augment/debug id expr) - (define/augment/debug (head args) body ...+)]] -@defform*[[(let/debug ([lhs-id rhs-expr] ...) body ...+) - (let/debug loop-id ([lhs-id rhs-expr] ...) body ...+)]] -@defform[(let*/debug ([lhs-id rhs-expr] ...) body ...+)] -@defform[(letrec/debug ([lhs-id rhs-expr] ...) body ...+)] -@defform[(let-values/debug ([(lhs-id ...) rhs-expr] ...) body ...+)] -@defform[(let*-values/debug ([(lhs-id ...) rhs-expr] ...) body ...+)] -@defform[(letrec-values/debug ([(lhs-id ...) rhs-expr] ...) body ...+)] -@defform[(with-syntax/debug ([pattern stx-expr] ...) body ...+)] -@defform[(with-syntax*/debug ([pattern stx-expr] ...) body ...+)] -@defform[(parameterize/debug ([param-expr value-expr] ...) body ...+)] -)]{ - -These macros add logging based on @scheme[with-debugging] to the evaluation of -expressions in @scheme[begin], @scheme[define], @scheme[define/private], -@scheme[define/public], @scheme[define/override], @scheme[define/augment], -@scheme[let], @scheme[let*], @scheme[letrec], @scheme[let-values], -@scheme[let*-values], @scheme[letrec-values], @scheme[with-syntax], -@scheme[with-syntax*], and @scheme[parameterize]. - -} diff --git a/collects/unstable/cce/reference/manual.scrbl b/collects/unstable/cce/reference/manual.scrbl index b6fd459569..28805e5d6e 100644 --- a/collects/unstable/cce/reference/manual.scrbl +++ b/collects/unstable/cce/reference/manual.scrbl @@ -9,5 +9,3 @@ @unstable[@author+email["Carl Eastlund" "cce@racket-lang.org"]] @table-of-contents[] - -@include-section["debug.scrbl"] diff --git a/collects/unstable/cce/test/test-debug.ss b/collects/unstable/cce/test/test-debug.ss deleted file mode 100644 index 6caf26a048..0000000000 --- a/collects/unstable/cce/test/test-debug.ss +++ /dev/null @@ -1,24 +0,0 @@ -#lang scheme - -(require "checks.ss" - "../debug.ss") - -(provide debug-suite) - -(define debug-suite - (test-suite "debug.ss" - (test-suite "dprintf" - (test - (let () - (define logger (make-logger)) - (define receiver (make-log-receiver logger 'debug)) - (parameterize ([current-logger logger]) - (dprintf "Danger, ~a!" "Will Robinson")) - (check-not-false - (member - "Danger, Will Robinson!" - (let loop () - (match (sync/timeout 0 receiver) - [(vector 'debug (? string? message) _) - (cons message (loop))] - [_ null]))))))))) diff --git a/collects/unstable/cce/test/test-main.ss b/collects/unstable/cce/test/test-main.ss index 0ac815e18b..ce320820ba 100644 --- a/collects/unstable/cce/test/test-main.ss +++ b/collects/unstable/cce/test/test-main.ss @@ -1,8 +1,6 @@ #lang scheme -(require "checks.ss" - "test-debug.ss") +(require "checks.ss") (run-tests - (test-suite "scheme.plt" - debug-suite)) + (test-suite "scheme.plt")) diff --git a/collects/unstable/debug.rkt b/collects/unstable/debug.rkt index ccaa887f92..f67ed7be41 100644 --- a/collects/unstable/debug.rkt +++ b/collects/unstable/debug.rkt @@ -1,39 +1,176 @@ -#lang racket/base +#lang racket -(provide - (rename-out - [debug debug/call] - [debugm debug/macro])) +(provide debug + dprintf + call/debug + begin/debug + define/debug + define/private/debug + define/public/debug + define/override/debug + define/augment/debug + let/debug + let*/debug + letrec/debug + let-values/debug + let*-values/debug + letrec-values/debug + with-syntax/debug + with-syntax*/debug + parameterize/debug + with-debugging) -;; printf debugging convenience -(define-syntax debug - (syntax-rules () - [(_ (f . args)) - (begin (printf "starting ~a (~a)~n" 'f f) - (let ([l (list . args)]) - (printf "arguments are:~n") - (for/list ([arg 'args] - [val l]) - (printf "\t~a: ~a~n" arg val)) - (let ([e (with-handlers ([values (lambda (exn) - (printf "~a raised exception ~a~n" 'f exn) - (raise exn))]) - (call-with-values (lambda () (apply f l)) list))]) - (if (and (pair? e) (null? (cdr e))) - (printf "~a result was ~a~n" 'f (car e)) - (printf "~a results were ~a~n" 'f e)) - (apply values e))))] - [(_ f . args) (debug (f . args))])) +(require unstable/srcloc + unstable/location + unstable/syntax + (for-syntax racket/match syntax/parse unstable/syntax)) -(define-syntax debugm - (syntax-rules () - [(_ kw . forms) - (begin (printf "starting ~a\n" 'kw) - (let ([e (with-handlers ([values (lambda (exn) - (printf "~a raised exception ~a~n" 'kw exn) - (raise exn))]) - (call-with-values (lambda () (kw . forms)) list))]) - (if (and (pair? e) (null? (cdr e))) - (printf "~a result was ~a~n" 'kw (car e)) - (printf "~a results were ~a~n" 'kw e)) - (apply values e)))])) \ No newline at end of file +(define-syntax (let/debug stx) + (syntax-parse stx + [(_ (~optional loop:id) ([lhs:id rhs:expr] ...) body:expr ...+) + #`(with-debugging + #:name '#,(if (attribute loop) #'loop #'let/debug) + #:source (quote-srcloc #,stx) + (let #,@(if (attribute loop) (list #'loop) null) + ([lhs (with-debugging #:name 'lhs rhs)] ...) + (debug body) ...))])) + +(define-syntaxes + [ let*/debug + letrec/debug + let-values/debug + let*-values/debug + letrec-values/debug + with-syntax/debug + with-syntax*/debug + parameterize/debug ] + + (let () + + (define ((expander binder-id) stx) + (with-syntax ([binder binder-id]) + (syntax-parse stx + [(binder/debug:id ([lhs rhs:expr] ...) body:expr ...+) + #`(with-debugging + #:name 'binder/debug + #:source (quote-srcloc #,stx) + (binder + ([lhs (with-debugging #:name 'lhs rhs)] ...) + (debug body) ...))]))) + + (values (expander #'let*) + (expander #'letrec) + (expander #'let-values) + (expander #'let*-values) + (expander #'letrec-values) + (expander #'with-syntax) + (expander #'with-syntax*) + (expander #'parameterize)))) + +(define-syntaxes + [ define/debug + define/private/debug + define/public/debug + define/override/debug + define/augment/debug ] + + (let () + + (define-syntax-class header + #:attributes [name] + (pattern (name:id . _)) + (pattern (inner:header . _) #:attr name (attribute inner.name))) + + (define ((expander definer-id) stx) + (with-syntax ([definer definer-id]) + (syntax-parse stx + [(definer/debug:id name:id body:expr) + #`(definer name + (with-debugging + #:name 'name + #:source (quote-srcloc #,stx) + body))] + [(definer/debug:id spec:header body:expr ...+) + #`(definer spec + (with-debugging + #:name 'spec.name + #:source (quote-srcloc #,stx) + (let () body ...)))]))) + + (values (expander #'define) + (expander #'define/private) + (expander #'define/public) + (expander #'define/override) + (expander #'define/augment)))) + +(define-syntax (begin/debug stx) + (syntax-parse stx + [(_ term:expr ...) + #`(with-debugging + #:name 'begin/debug + #:source (quote-srcloc #,stx) + (begin (debug term) ...))])) + +(define-syntax (debug stx) + (syntax-parse stx + [(_ term:expr) + (syntax (with-debugging term))])) + +(define-syntax (call/debug stx) + + (define-splicing-syntax-class argument + #:attributes ([debug 1]) + (pattern arg:expr #:attr [debug 1] #'[(debug arg)]) + (pattern (~seq kw:keyword arg:expr) #:attr [debug 1] #'[kw (debug arg)])) + + (syntax-parse stx + [(_ f:expr arg:argument ...) + #`(with-debugging + #:name 'call/debug + #:source (quote-srcloc #,stx) + (#%app (debug f) arg.debug ... ...))])) + +(define-syntax (with-debugging stx) + (syntax-parse stx + [(_ (~or (~optional (~seq #:name name:expr)) + (~optional (~seq #:source source:expr))) + ... + body:expr) + (with-syntax* ([name (or (attribute name) #'(quote body))] + [source (or (attribute source) #'(quote-srcloc body))]) + #'(with-debugging/proc + name + source + (quote body) + (lambda () (#%expression body))))])) + +(define (with-debugging/proc name source term thunk) + (let* ([src (source-location->prefix source)]) + (begin + (dprintf ">> ~a~s" src name) + (begin0 + (parameterize ([current-debug-depth + (add1 (current-debug-depth))]) + (call-with-values thunk + (lambda results + (match results + [(list v) (dprintf "~s" v)] + [(list vs ...) + (dprintf "(values~a)" + (apply string-append + (for/list ([v (in-list vs)]) + (format " ~s" v))))]) + (apply values results)))) + (dprintf "<< ~a~s" src name))))) + +(define (dprintf fmt . args) + (let* ([message (apply format fmt args)] + [prefix (make-string (* debug-indent (current-debug-depth)) #\space)] + [indented + (string-append + prefix + (regexp-replace* "\n" message (string-append "\n" prefix)))]) + (log-debug indented))) + +(define current-debug-depth (make-parameter 0)) +(define debug-indent 2) diff --git a/collects/unstable/scribblings/debug.scrbl b/collects/unstable/scribblings/debug.scrbl index 6a8028a4cd..27cbf92026 100644 --- a/collects/unstable/scribblings/debug.scrbl +++ b/collects/unstable/scribblings/debug.scrbl @@ -1,35 +1,79 @@ -#lang scribble/doc -@(require scribble/base - scribble/manual scribble/eval - "utils.rkt" - (for-label unstable/debug - racket/serialize - racket/contract - racket/base)) +#lang scribble/manual +@(require "utils.rkt" (for-label racket unstable/debug unstable/syntax)) -@title[#:tag "debug"]{Debugging} -@(define the-eval (make-base-eval)) -@(the-eval '(require unstable/debug racket/match)) +@title{Debugging} @defmodule[unstable/debug] -@unstable-header[] +@unstable[@author+email["Carl Eastlund" "cce@racket-lang.org"]] + +This module provides macros and functions for printing out debugging +information. + +@defform[(debug expr)]{ + +Logs debugging information before and after the evaluation of expression +@scheme[expr]. -@defform*[[(debug/call (f args ...)) - (debug/call f args ...)]]{ -Produce debugging output for the application of @racket[f], including the values of @racket[args]. -@examples[#:eval the-eval -(debug/call (+ 3 4 (* 5 6))) -(debug/call + 1 2 3) -] } -@defform*[[(debug/macro f args ...)]]{ -Produce debugging output for the application of @racket[f], but does -not parse or print args. Suitable for use debugging macros. -@examples[#:eval the-eval -(debug/macro match (list 1 2 3) - [(list x y z) (+ x y z)]) -(debug/macro + 1 2 3) -] +@defform/subs[ +(with-debugging options ... expr) +([options (code:line #:name name-expr) + (code:line #:source srcloc-expr)]) +]{ + +Logs debugging information like @scheme[debug], with the option of explicitly +overriding the name and source location information for the expression. + +} + +@defproc[(dprintf [fmt string?] [arg any/c] ...) void?]{ + +Constructs a message in the same manner as @scheme[format], and logs it at the +debugging priority (like @scheme[log-debug]). + +} + +@defform/subs[ +(call/debug function-expr argument ...) +([argument argument-expr (code:line argument-keyword argument-expr)]) +]{ + +Logs debugging information for @scheme[(#%app function-expr argument ...)], +including the evaluation and results of the function and each argument. + +} + +@deftogether[( +@defform[(begin/debug expr ...)] +@defform*[[(define/debug id expr) + (define/debug (head args) body ...+)]] +@defform*[[(define/private/debug id expr) + (define/private/debug (head args) body ...+)]] +@defform*[[(define/public/debug id expr) + (define/public/debug (head args) body ...+)]] +@defform*[[(define/override/debug id expr) + (define/override/debug (head args) body ...+)]] +@defform*[[(define/augment/debug id expr) + (define/augment/debug (head args) body ...+)]] +@defform*[[(let/debug ([lhs-id rhs-expr] ...) body ...+) + (let/debug loop-id ([lhs-id rhs-expr] ...) body ...+)]] +@defform[(let*/debug ([lhs-id rhs-expr] ...) body ...+)] +@defform[(letrec/debug ([lhs-id rhs-expr] ...) body ...+)] +@defform[(let-values/debug ([(lhs-id ...) rhs-expr] ...) body ...+)] +@defform[(let*-values/debug ([(lhs-id ...) rhs-expr] ...) body ...+)] +@defform[(letrec-values/debug ([(lhs-id ...) rhs-expr] ...) body ...+)] +@defform[(with-syntax/debug ([pattern stx-expr] ...) body ...+)] +@defform[(with-syntax*/debug ([pattern stx-expr] ...) body ...+)] +@defform[(parameterize/debug ([param-expr value-expr] ...) body ...+)] +)]{ + +These macros add logging based on @scheme[with-debugging] to the evaluation of +expressions in @scheme[begin], @scheme[define], @scheme[define/private], +@scheme[define/public], @scheme[define/override], @scheme[define/augment], +@scheme[let], @scheme[let*], @scheme[letrec], @scheme[let-values], +@scheme[let*-values], @scheme[letrec-values], @scheme[with-syntax], +@scheme[with-syntax*], and @scheme[parameterize]. + }