Replaced unstable/debug with unstable/cce/debug.

This commit is contained in:
Carl Eastlund 2010-05-30 22:54:17 -04:00
parent 5faced0c23
commit ddc889532e
9 changed files with 268 additions and 326 deletions

View File

@ -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])))))))))

View File

@ -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))))

View File

@ -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)

View File

@ -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].
}

View File

@ -9,5 +9,3 @@
@unstable[@author+email["Carl Eastlund" "cce@racket-lang.org"]]
@table-of-contents[]
@include-section["debug.scrbl"]

View File

@ -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])))))))))

View File

@ -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"))

View File

@ -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)))]))
(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)

View File

@ -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].
}