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