71 lines
1.6 KiB
Plaintext
71 lines
1.6 KiB
Plaintext
;** allow primitives
|
|
; Procedure call/return tracing
|
|
; Uses: startup
|
|
|
|
(define trace
|
|
(lambda (var)
|
|
(if (get var 'traced)
|
|
(list var 'already 'traced)
|
|
(if (not (bound-to-lambda? var))
|
|
'(not a defined-procedure name)
|
|
(begin
|
|
(put var 'traced (eval var))
|
|
(set var (make-traced var))
|
|
var)))))
|
|
|
|
(define untrace
|
|
(lambda (var)
|
|
(if (not (get var 'traced))
|
|
(list var 'not 'traced)
|
|
(begin
|
|
(set var (get var 'traced))
|
|
var))))
|
|
|
|
(define bound-to-lambda?
|
|
(lambda (var)
|
|
(and (symbol? var)
|
|
(let ((value (eval var)))
|
|
(and (pair? value)
|
|
(eq? (car value) 'lambda))))))
|
|
|
|
(define make-traced
|
|
(lambda (var)
|
|
(let ((proc (eval var)))
|
|
(list 'lambda (cadr proc)
|
|
(list '=enter= (list 'quote var) (cons 'list (cadr proc)))
|
|
(list '=exit= (list 'quote var)
|
|
(cons (list 'get (list 'quote var) (list 'quote 'traced))
|
|
(cadr proc)))))))
|
|
|
|
(define =enter=
|
|
(lambda (name args)
|
|
(tab *indentation*)
|
|
(set! *indentation* (+ *indentation* 1))
|
|
(write 'entering)
|
|
(write name)
|
|
(write ':)
|
|
(for-each write args)
|
|
(newline)))
|
|
|
|
(define =exit=
|
|
(lambda (name result)
|
|
(set! *indentation* (- *indentation* 1))
|
|
(tab *indentation*)
|
|
(write 'exiting)
|
|
(write name)
|
|
(write ':)
|
|
(print result)
|
|
result))
|
|
|
|
(define *indentation* 0)
|
|
|
|
(define tab
|
|
(lambda (n)
|
|
(while (< 0 n)
|
|
(write '>)
|
|
(set! n (- n 1)))))
|
|
|
|
(define set
|
|
(lambda (var value)
|
|
(eval (list 'set! var (list 'quote value)))))
|