|
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 r
Length: 8520 (0x2148) Types: TextFile Names: »rep.scm.340«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/gnu-31mar87/scheme/scm/rep.scm.340«
;;; -*-Scheme-*- ;;; ;;; Copyright (c) 1984 Massachusetts Institute of Technology ;;; ;;; This material was developed by the Scheme project at the ;;; Massachusetts Institute of Technology, Department of ;;; Electrical Engineering and Computer Science. Permission to ;;; copy this software, to redistribute it, and to use it for any ;;; purpose is granted, subject to the following restrictions and ;;; understandings. ;;; ;;; 1. Any copy made of this software must include this copyright ;;; notice in full. ;;; ;;; 2. Users of this software agree to make their best efforts (a) ;;; to return to the MIT Scheme project any improvements or ;;; extensions that they make, so that these may be included in ;;; future releases; and (b) to inform MIT of noteworthy uses of ;;; this software. ;;; ;;; 3. All materials developed as a consequence of the use of ;;; this software shall duly acknowledge such use, in accordance ;;; with the usual standards of acknowledging credit in academic ;;; research. ;;; ;;; 4. MIT has made no warrantee or representation that the ;;; operation of this software will be error-free, and MIT is ;;; under no obligation to provide any services, by way of ;;; maintenance, update, or otherwise. ;;; ;;; 5. In conjunction with products arising from the use of this ;;; material, there shall be no use of the name of the ;;; Massachusetts Institute of Technology nor of any adaptation ;;; thereof in any advertising, promotional, or sales literature ;;; without prior written consent from MIT in each case. ;;; ;;;; Read-Eval-Print Loop (declare (usual-integrations)) \f ;;;; Command Loops (define make-command-loop) (define push-command-loop) (define with-rep-continuation) (define continue-rep) (define rep-continuation) (define rep-state) (define rep-level) (define abort->nearest) (define abort->previous) (define abort->top-level) (let ((top-level-driver-hook) (previous-driver-hook) (nearest-driver-hook) (current-continuation) (current-state) (current-level 0)) (set! make-command-loop (named-lambda (make-command-loop message driver) (define (driver-loop message) (driver-loop (with-rep-continuation (lambda (quit) (set! top-level-driver-hook quit) (set! nearest-driver-hook quit) (driver message))))) (set-interrupt-enables! INTERRUPT-MASK-GC-OK) (fluid-let ((top-level-driver-hook) (nearest-driver-hook)) (driver-loop message)))) (set! push-command-loop (named-lambda (push-command-loop startup-hook driver initial-state) (define (restart entry-hook) (let ((reentry-hook (catch (lambda (again) (set! nearest-driver-hook again) (set-interrupt-enables! INTERRUPT-MASK-ALL) (entry-hook) (loop))))) (set-interrupt-enables! INTERRUPT-MASK-GC-OK) (restart reentry-hook))) (define (loop) (set! current-state (driver current-state)) (loop)) (fluid-let ((current-level (1+ current-level)) (previous-driver-hook nearest-driver-hook) (nearest-driver-hook) (current-state initial-state)) (restart startup-hook)))) (set! with-rep-continuation (named-lambda (with-rep-continuation receiver) (catch (lambda (continuation) (fluid-let ((current-continuation continuation)) (receiver continuation)))))) \f (set! continue-rep (named-lambda (continue-rep value) (current-continuation (if (eq? current-continuation top-level-driver-hook) (lambda () (print value)) value)))) (set! abort->nearest (named-lambda (abort->nearest message) (nearest-driver-hook message))) (set! abort->previous (named-lambda (abort->previous message) ((if (null? previous-driver-hook) nearest-driver-hook previous-driver-hook) message))) (set! abort->top-level (named-lambda (abort->top-level message) (top-level-driver-hook message))) (set! rep-continuation (named-lambda (rep-continuation) current-continuation)) (set! rep-state (named-lambda (rep-state) current-state)) (set! rep-level (named-lambda (rep-level) current-level)) ) \f ;;;; Read-Eval-Print Loops (define make-rep) (define push-rep) (define rep-environment) (define rep-base-environment) (define set-rep-environment!) (define set-rep-base-environment!) (define rep-prompt) (define rep-base-prompt) (define set-rep-prompt!) (define set-rep-base-prompt!) (define rep-input-stream) (define rep-output-stream) (define reader-history) (define printer-history) (define environment-warning-hook identity-procedure) (let ((user-base-environment) (user-current-environment) (user-base-prompt) (user-current-prompt) (input-stream) (output-stream)) (set! make-rep (named-lambda (make-rep environment message prompt) (fluid-let ((user-base-environment environment) (user-base-prompt prompt) (input-stream (current-input-stream)) (output-stream (current-output-stream))) (make-command-loop message rep-top-driver)))) (define (rep-top-driver message) (push-rep user-base-environment message user-base-prompt)) (set! push-rep (named-lambda (push-rep environment message prompt) (fluid-let ((user-current-environment environment) (user-current-prompt prompt)) (with-input-from-stream input-stream (lambda () (with-output-to-stream output-stream (lambda () (with-syntax-environment user-base-environment (lambda () (environment-warning-hook user-current-environment) (push-command-loop message rep-driver (make-rep-state (make-history 5) (make-history 10)))))))))))) (define (rep-driver state) (user-current-prompt) (let ((object (let ((scode (let ((s-expression (read))) (record-in-history! (rep-state-reader-history state) s-expression) (syntax s-expression)))) (with-new-history (lambda () (scode-eval scode user-current-environment)))))) (record-in-history! (rep-state-printer-history state) object) (print object)) state) \f ;;; History Manipulation (define (make-history size) (let ((list (make-list size '()))) (append! list list) (vector history-tag size list))) (define history-tag '(REP-HISTORY)) (define (record-in-history! history object) (if (not (null? (vector-ref history 2))) (sequence (set-car! (vector-ref history 2) object) (vector-set! history 2 (cdr (vector-ref history 2)))))) (define (read-history history n) (list-ref (vector-ref history 2) (remainder (- (vector-ref history 1) n 1) (vector-ref history 1)))) (define ((history-reader selector name) n) (let ((state (rep-state))) (if (rep-state? state) (read-history (selector state) n) (error "Not in REP loop" name)))) (define rep-state-tag '(REP-STATE)) (define (make-rep-state reader-history printer-history) (vector rep-state-tag reader-history printer-history)) (define (rep-state? object) (conjunction (vector? object) (not (zero? (vector-size object))) (eq? (vector-ref object 0) rep-state-tag))) (define rep-state-reader-history vector-second) (define rep-state-printer-history vector-third) (set! reader-history (history-reader rep-state-reader-history 'READER-HISTORY)) (set! printer-history (history-reader rep-state-printer-history 'PRINTER-HISTORY)) \f ;;; REP Accessors (set! rep-environment (named-lambda (rep-environment) user-current-environment)) (set! rep-base-environment (named-lambda (rep-base-environment) user-base-environment)) (set! set-rep-environment! (named-lambda (set-rep-environment! environment) (set! user-current-environment environment) (environment-warning-hook user-current-environment))) (set! set-rep-base-environment! (named-lambda (set-rep-base-environment! environment) (set! user-base-environment environment) (set! user-current-environment environment) (environment-warning-hook user-current-environment))) (set! rep-prompt (named-lambda (rep-prompt) user-current-prompt)) (set! rep-base-prompt (named-lambda (rep-base-prompt) user-base-prompt)) (set! set-rep-prompt! (named-lambda (set-rep-prompt! prompt) (set! user-current-prompt prompt))) (set! set-rep-base-prompt! (named-lambda (set-rep-base-prompt! prompt) (set! user-base-prompt prompt) (set! user-current-prompt prompt))) (set! rep-input-stream (named-lambda (rep-input-stream) input-stream)) (set! rep-output-stream (named-lambda (rep-output-stream) output-stream)) )