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