Print debugging statement

From Rosetta Code
Revision as of 13:41, 27 August 2019 by rosettacode>Sorawee (Add print debugging statement task with Pyret and Racket as initial implementations)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Print debugging statement is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

From Wikipedia:

Print debugging (or tracing) is the act of watching (live or recorded) trace statements, or print statements, that indicate the flow of execution of a process. This is sometimes called printf debugging, due to the use of the printf function in C.

Task

Show the print debugging statements in the language. If possible, demonstrate their ability to display information about source code (e.g., code fragment, line number).

Pyret

Pyret has the spy expression. The expression can print the value of an identifier, using the identifier itself as a label if it's not already given. It could also print the value of an arbitrary expression, but it needs an explicit label in this case.

<lang pyret>fun add(x, y):

 result = x + y
 spy "in add": 
   x,
   y,
   result,
   result-plus-one: result + 1
 end
 result

end

add(2, 7)</lang>

Output:
Spying "in add" (at file:///spies.arr:3:2-8:5)
  x: 2
  y: 7
  result: 9
  result-plus-one: 10

9

Racket

Racket doesn't have a built-in print debugging statement. However, it can be defined by users as a macro.

<lang racket>#lang racket

(require syntax/parse/define)

(define (debug:core line col code val #:label [label #f])

 ;; if label exists, use it instead of the code
 (printf "~a at line ~a column ~a\n" (or label code) line col)
 (printf "result: ~a\n\n" val)
 ;; return the value itself, so that we can wrap macro around an expression 
 ;; without restructuring any code
 val)

(define-simple-macro (debug <x> option ...)

 #:with line (datum->syntax this-syntax (syntax-line #'<x>))
 #:with col (datum->syntax this-syntax (syntax-column #'<x>))
 (debug:core line col '<x> <x> option ...))

(define (add x y)

 (define result (+ x y))
 (debug x)
 (debug y)
 (debug (if #t (+ x y) (error 'impossible)))
 (debug (add1 result) #:label "result plus one")
 (debug result))

(add 2 7)</lang>

Output:
x at line 20 column 9
result: 2

y at line 21 column 9
result: 7

(if #t (+ x y) (error 'impossible)) at line 22 column 9
result: 9

result plus one at line 23 column 9
result: 10

result at line 24 column 9
result: 9

9