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