== debug Some trivial debugging macros [[toc:]] === Abstract According to [[http://books.google.com/books?id=nneBa6-mWfgC&lpg=PA227&ots=gEvyGdNW3u&dq=%22thou%20shalt%20put%20printf%22&pg=PA227#v=onepage&q=%22thou%20shalt%20put%20printf%22&f=false|Joe Armstrong]], "The great gods of programming said, 'Thou shalt put {{printf}} statements in your program at the point where you think it’s gone wrong, recompile, and run it.'" === Documentation ==== {{debug?}} debug? → #t `debug?' turns on or off debugging output, depending on whether it is set to #t or #f; respectively. (define debug? (make-parameter #t)) ==== {{trace}} (trace f) → unspecified Trace the input to and output from a function. ; f : The function to be traced (define-syntax trace (er-macro-transformer (lambda (expression rename compare) (match-let (((_ f) expression)) (let ((%set! (rename 'set!)) (%lambda (rename 'lambda)) (%call-with-values (rename 'call-with-values)) (%apply (rename 'apply)) (%format (rename 'format)) (%values (rename 'values)) (%let (rename 'let)) (%f (rename 'f)) (%when (rename 'when)) (%debug? (rename 'debug?))) `(,%when (,%debug?) (,%let ((,%f ,f)) (,%set! ,f (,%lambda x (,%format (current-error-port) ";; Arguments to ~a: ~a~%" ',f x) (,%let ((return-values (,%call-with-values (,%lambda () (,%apply ,%f x)) (,%lambda x x)))) (,%format (current-error-port) ";; Values from ~a: ~a~%" ',f return-values) (,%apply ,%values return-values))))))))))) ==== {{debug}} (debug expressions) → unspecified Debug the expressions to stderr by pretty-printing each expression and their evaluations. ; expressions : The expressions to be debugged (define-syntax debug (syntax-rules () ((_ x ...) (with-output-to-port (current-error-port) (lambda () (when (debug?) (pp `(,(if (or (boolean? 'x) (char? 'x) (number? 'x) (string? 'x) (vector? 'x)) x `(x => ,(handle-exceptions exn (let ((message ((condition-property-accessor 'exn 'message) exn)) (arguments ((condition-property-accessor 'exn 'arguments) exn))) (format "Error: ~a~a" message (if (null? arguments) "" (format ": ~a" (string-join (map ->string arguments) ", "))))) x))) ...)))))))) ==== {{debug-priority}} debug-priority → prio/debug The priority associated with {{debug/syslog}} (define debug-priority (make-parameter prio/debug)) ==== {{debug/syslog}} (debug/syslog expressions) → unspecified Debug to syslog. ; expressions : The expressions to debug (cf. `debug' supra) (define-syntax debug/syslog (ir-macro-transformer (lambda (expression rename inject) `(let ((port (make-syslog-port))) (with-error-output-to-port port (lambda () (when (debug?) (debug ,@(cdr expression)) (flush-output port)))))))) === About this egg ==== Author [[/users/klutometis|Peter Danenberg]] ==== Repository [[https://github.com/klutometis/debug]] ==== License BSD ==== Dependencies * [[cock]] * [[matchable]] * [[setup-helper]] * [[setup-helper-cock]] * [[syslog]] ==== Versions ; 0.1 : Version 0.1 ; 0.1.1 : Version 0.1.1 ; 0.1.2 : BSD ; 0.2 : Add a `debug?'-parameter. ; 0.3 : Add exception-guard; document. ; 0.3.1 : Add "Error: ..." ; 0.3.2 : Add arguments in errors. ; 0.3.3 : Don't do arguments if we don't have to. ; 0.3.4 : With a note about cock-utils ; 0.3.5 : Add test-exit. ; 0.3.6 : Disable an offending test. ; 0.3.7 : Self-evaluating scalars ; 0.3.8 : Fix tests ; 0.3.9 : Fix debug/syslog. ; 0.3.10 : Default-priority -> debug-priority ==== Colophon Documented by [[/egg/cock|cock]].