|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 16605 (0x40dd)
Types: TextFile
Names: »debug.scm.76«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/gnu-31mar87/scheme/scm/debug.scm.76«
;;; -*-SCHEME-*-
;;;
;;; Copyright (c) 1984 Massachusetts Institute of Technology
;;;
;;; All rights reserved. This software is distributed on the
;;; condition that any improvements or modifications to it are
;;; returned to the Scheme project at MIT.
;;;
;;; Permission to copy all or part of this material is granted,
;;; provided that the copies are not made or distributed for
;;; resale, the MIT copyright notice appears, and that notice is
;;; given that copying is by permission of Massachusetts Institute
;;; of Technology.
;;;
;;;; Debugger
(in-package debugger-package
(declare (usual-integrations))
(define debug-package
(make-package debug-package
((current-continuation)
(previous-continuations)
(command-set (make-command-set 'DEBUG-COMMANDS))
(current-reduction-number)
(current-number-of-reductions)
(current-reduction)
(current-environment)
(reduction-wrap-around-tag 'WRAP-AROUND)
(print-user-friendly-name
(access print-user-friendly-name env-package))
(print-expression pp)
(student-walk? #!FALSE)
(print-return-values? #!FALSE))
(define (define-debug-command letter function help-text)
(define-letter-command command-set letter function help-text))
\f
;;; Basic Commands
(define-debug-command '? (standard-help-command command-set)
"Help, list command letters")
(define-debug-command 'Q standard-exit-command "Quit (exit DEBUG)")
(define (debug . optional)
(fluid-let ((current-continuation)
(previous-continuations '())
(current-reduction-number)
(current-number-of-reductions)
(current-reduction #!FALSE)
(current-environment '()))
(debug-abstract-continuation
(if (null? optional) (rep-continuation) (car optional)))))
(define (debug-abstract-continuation continuation)
(set-current-continuation! continuation initial-reduction-number)
(letter-commands command-set
(lambda ()
(print-current-expression)
((standard-rep-message "Debugger")))
(standard-rep-prompt "Debug-->")))
(define (undefined-environment? environment)
(disjunction (continuation-undefined-environment? environment)
(eq? environment system-global-environment)
(conjunction
(environment? environment)
((access system-external-environment? environment-package)
environment))))
(define (print-undefined-environment)
(format "~%Undefined environment at this subproblem/reduction level"))
(define (with-rep-alternative env receiver)
(if (undefined-environment? env)
(sequence
(print-undefined-environment)
(format "~%Using the read-eval-print environment instead!")
(receiver (rep-environment)))
(receiver env)))
(define (if-valid-environment env receiver)
(if (undefined-environment? env)
(print-undefined-environment)
(receiver env)))
(define (current-expression)
(if current-reduction
(reduction-expression current-reduction)
(continuation-expression current-continuation)))
\f
;;;; Random display commands
(define (pretty-print-current-expression)
(print-expression (current-expression)))
(define-debug-command 'L pretty-print-current-expression
"(list expression) Pretty-print the current expression")
(define (pretty-print-reduction-function)
(if-valid-environment (if current-reduction
(reduction-environment current-reduction)
current-environment)
(lambda (env) (pp (environment-procedure env)))))
(define-debug-command 'P pretty-print-reduction-function
"Pretty print current procedure")
(define (print-current-expression)
(define (print-current-reduction)
(format "~2xReduction Number:~x~o~%Expression:" current-reduction-number)
(print-expression (reduction-expression current-reduction)))
(define (print-application-information env)
(define (do-it return?)
(if return? (format "~%within ") (format "within "))
(print-user-friendly-name env)
(if return?
(format "~%applied to ~@68o" (environment-arguments env))
(format " applied to ~@68o" (environment-arguments env))))
(let ((output (with-output-to-string (lambda () (do-it #!FALSE)))))
(if (< (string-size output) *printer-width*)
(format "~%~s" output)
(do-it #!TRUE))))
(if (null-continuation? current-continuation)
(format "~%Null continuation")
(sequence
(format "~%Subproblem Level: ~o" (length previous-continuations))
(if current-reduction
(print-current-reduction)
(sequence
(format "~%Possibly Incomplete Expression:")
(print-expression (continuation-expression current-continuation))))
(if-valid-environment current-environment
print-application-information))))
(define-debug-command 'S print-current-expression
"Print the current subproblem/reduction")
(define (reductions-command)
(if (null-continuation? current-continuation)
(format "~%Null continuation")
(let loop ((r (continuation-reductions current-continuation)))
(cond ((pair? r)
(print-expression (reduction-expression (car r)))
(loop (cdr r)))
((wrap-around-in-reductions? r)
(format "~%Wrap Around in the reductions at this level."))
(else 'done)))))
(define-debug-command 'R reductions-command
"Print the reductions of the current subproblem level")
\f
;;;; Short history display
(define (summarize-history-command)
(define (print-continuations cont level)
(define (print-reductions reductions show-all?)
(define (print-reduction red number)
(terse-print-expression level
(reduction-expression red)
(reduction-environment red)))
(let loop ((reductions reductions) (number 0))
(if (pair? reductions)
(sequence
(print-reduction (car reductions) number)
(if show-all? (loop (cdr reductions) (1+ number)))))))
(if (null-continuation? cont)
*the-non-printing-object*
(sequence
(let ((reductions (continuation-reductions cont)))
(if (not (pair? reductions))
(terse-print-expression level
(continuation-expression cont)
(continuation-environment cont))
(print-reductions reductions (= level 0))))
(print-continuations (continuation-next-continuation cont)
(1+ level)))))
(let ((top-continuation (if (null? previous-continuations)
current-continuation
(car (last-pair previous-continuations)))))
(if (null-continuation? top-continuation)
(format "~%No history available")
(sequence
(format "~%Sub Prb. Procedure Name Expression~%")
(print-continuations top-continuation 0)))))
(define terse-print-expression
(let ((the-non-printing-symbol (make-symbol "")))
(named-lambda (terse-print-expression level expression environment)
(format "~%~@3o~:20o~4x~@:52c"
level
;; procedure name
(if (disjunction (undefined-environment? environment)
(special-name? (environment-name environment)))
the-non-printing-symbol
(environment-name environment))
expression))))
(define-debug-command 'H summarize-history-command
"Prints a summary of the entire history")
\f
;;;; Motion to earlier expressions
(define (earlier-reduction)
(define (up! message)
(format "~%~s~%Going to the previous (earlier) continuation!" message)
(earlier-continuation-command))
(cond ((conjunction student-walk?
(> (length previous-continuations) 0)
(= current-reduction-number 0))
(earlier-continuation-command))
((< current-reduction-number (-1+ current-number-of-reductions))
(set-current-reduction! (1+ current-reduction-number))
(print-current-expression))
((wrap-around-in-reductions?
(continuation-reductions current-continuation))
(up! "Wrap around in reductions at this level!"))
(else (up! "No more reductions at this level!"))))
(define-debug-command 'B earlier-reduction "Earlier reduction (Back in time)")
(define (earlier-subproblem)
(let ((new (continuation-next-continuation current-continuation)))
(set! previous-continuations
(cons current-continuation previous-continuations))
(set-current-continuation! new normal-reduction-number)))
(define (earlier-continuation-command)
(if (not (null-continuation? (continuation-next-continuation
current-continuation)))
(earlier-subproblem)
(format "~%There are only ~o subproblem levels"
(length previous-continuations)))
(print-current-expression))
(define-debug-command 'U earlier-continuation-command
"Move (Up) to the previous (earlier) continuation")
\f
;;;; Motion to later expressions
(define (later-reduction)
(cond ((> current-reduction-number 0)
(set-current-reduction! (-1+ current-reduction-number))
(print-current-expression))
((disjunction (not student-walk?)
(= (length previous-continuations) 1))
(later-continuation-TO-LAST-REDUCTION))
(else (later-continuation))))
(define-debug-command 'F later-reduction "Later reduction (Forward in time)")
(define (later-continuation)
(if (null? previous-continuations)
(format "~%Already at lowest subproblem level")
(sequence (later-subproblem) (print-current-expression))))
(define (later-continuation-TO-LAST-REDUCTION)
(define (later-subproblem-TO-LAST-REDUCTION)
(set-current-continuation!
(car (set! previous-continuations (cdr previous-continuations)))
last-reduction-number))
(if (null? previous-continuations)
(format "~%Already at lowest subproblem level")
(sequence (later-subproblem-TO-LAST-REDUCTION)
(print-current-expression))))
(define (later-subproblem)
(set-current-continuation!
(car (set! previous-continuations (cdr previous-continuations)))
normal-reduction-number))
(define (later-continuation-command)
(if (null? previous-continuations)
(format "~%Already at oldest continuation")
(sequence (later-subproblem) (print-current-expression))))
(define-debug-command 'D later-continuation-command
"Move (Down) to the next (later) continuation")
\f
;;;; General motion command
(define (goto-command)
(define (get-reduction-number)
(format "~%Reduction Number (0 through ~o inclusive: "
(-1+ current-number-of-reductions))
(let ((red (read)))
(cond ((not (number? red))
(tyo #\BELL)
(format "~%Reduction number must be numeric!")
(get-reduction-number))
((not (conjunction (>= red 0)
(< red current-number-of-reductions)))
(format "~%Reduction number out of range.!")
(get-reduction-number))
(else (set-current-reduction! red)))))
(define (choose-reduction)
(cond ((> current-number-of-reductions 1) (get-reduction-number))
((= current-number-of-reductions 1)
(format "~%There is only one reduction for this subproblem")
(set-current-reduction! 1))
(else (format "~%There are no reductions for this subproblem."))))
(define (get-subproblem-number)
(format "~%Subproblem number: ")
(let ((len (length previous-continuations)) (sub (read)))
(cond ((not (number? sub))
(tyo #\BELL)
(format "~%Subproblem level must be numeric!")
(get-subproblem-number))
((< sub len) (repeat later-subproblem (- len sub))
(choose-reduction))
(else
(let loop ((len len))
(cond ((= sub len) (choose-reduction))
((null-continuation?
(continuation-next-continuation current-continuation))
(format "~%There is no such subproblem.")
(format "~%Now at subproblem number: ~o"
(length previous-continuations))
(choose-reduction))
(else (earlier-subproblem) (loop (1+ len)))))))))
(get-subproblem-number)
(print-current-expression))
(define-debug-command 'G goto-command
"Go to a particular Subproblem/Reduction level")
\f
;;;; Evaluation and frame display commands
(define (enter-read-eval-print-loop)
(with-rep-alternative
current-environment
(lambda (env)
(read-eval-print env
"You are now in the desired environment"
"Eval-in-env-->"))))
(define-debug-command 'E enter-read-eval-print-loop
"Enter a read-eval-print loop in the current environment")
(define (eval-in-current-environment)
(with-rep-alternative current-environment
(lambda (env)
(environment-warning-hook env)
(format "~%Eval--> ")
(eval (read) env))))
(define-debug-command 'V eval-in-current-environment
"Evaluate expression in current environment")
(define show-current-frame
(let ((show-frame (access show-frame env-package)))
(named-lambda (show-current-frame)
(if-valid-environment current-environment
(lambda (env) (show-frame env -1))))))
(define-debug-command 'C show-current-frame
"Show Bindings of identifiers in the current environment")
(define (enter-where-command)
(with-rep-alternative current-environment where))
(define-debug-command 'W enter-where-command
"Enter WHERE on the current environment")
(define (error-info-command)
(format "~% Message: ~s~%Irritant: ~o" (error-message) (error-irritant)))
(define-debug-command 'I error-info-command "Redisplay the error message")
\f
;;;; Advanced hacking commands
(define (return-command) ;command Z
(define (confirm)
(format "~%Confirm: [Y or N] ")
(let ((ans (read)))
(cond ((eq? ans 'Y) #!TRUE)
((eq? ans 'N) #!FALSE)
(else (confirm)))))
(define (return-read)
(let ((exp (read)))
(if (eq? exp '$) (unsyntax (current-expression)) exp)))
(define (do-it environment next)
(environment-warning-hook environment)
(format "~%Enter an expression to EVALUATE and CONTINUE with: ")
(if print-return-values?
(let ((eval-exp (eval (return-read) environment)))
(format "~%That evaluates to:~%~o" eval-exp)
(if (confirm) (next eval-exp)))
(next (eval (return-read) environment))))
(let ((next (continuation-next-continuation current-continuation)))
(if (null-continuation? next)
(sequence (tyo #\BELL) (format "~%Can't continue!!!"))
(with-rep-alternative current-environment
(lambda (env) (do-it env next))))))
(define-debug-command 'Z return-command
"Return (continue with) an expression after evaluating it")
(define user-debug-environment (make-environment))
(define (internal-command)
(read-eval-print user-debug-environment
"You are now in the debugger environment"
"Debugger-->"))
(define-debug-command 'X internal-command
"Create a read eval print loop in the debugger environment")
\f
;;;; Reduction and continuation motion low-level
(define reduction-expression car)
(define reduction-environment cadr)
(define (last-reduction-number)
(-1+ current-number-of-reductions))
(define (normal-reduction-number)
(min (-1+ current-number-of-reductions) 0))
(define (initial-reduction-number)
(let ((environment (continuation-environment current-continuation)))
(if (conjunction (environment? environment)
(let ((procedure (environment-procedure environment)))
(disjunction (eq? procedure error-procedure)
(eq? procedure breakpoint-procedure))))
1
0)))
(define (set-current-continuation! continuation hook)
(set! current-continuation continuation)
(set! current-number-of-reductions
(if (null-continuation? continuation)
0
(dotted-list-length
(continuation-reductions current-continuation))))
(set-current-reduction! (hook)))
(define (set-current-reduction! number)
(set! current-reduction-number number)
(if (>= number 0)
(set! current-reduction
(list-ref (continuation-reductions current-continuation) number))
(set! current-reduction #!FALSE))
(set! current-environment
(if current-reduction
(reduction-environment current-reduction)
(continuation-environment current-continuation))))
(define (repeat f n)
(if (> n 0)
(sequence
(f)
(repeat f (-1+ n)))))
(define (dotted-list-length l)
(let count ((n 0) (L L))
(if (pair? l)
(count (1+ n) (CDR L))
n)))
(define (wrap-around-in-reductions? reductions)
(eq? (list-tail reductions (dotted-list-length reductions))
reduction-wrap-around-tag))
\f
;;; end DEBUG-PACKAGE.
))
;;; end IN-PACKAGE DEBUGGER-PACKAGE.
)
(define debug
(access debug debug-package debugger-package))
(define (special-name? symbol)
(disjunction (eq? symbol lambda-tag:unnamed)
(eq? symbol (access internal-lambda-tag lambda-package))
(eq? symbol (access internal-lexpr-tag lambda-package))
(eq? symbol lambda-tag:let)
(eq? symbol lambda-tag:fluid-let)
(eq? symbol lambda-tag:make-environment)
(eq? symbol lambda-tag:make-package)))