|
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 u
Length: 9288 (0x2448) Types: TextFile Names: »ustruc.scm.165«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/gnu-31mar87/scheme/scm/ustruc.scm.165«
;;; -*-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. ;;; ;;; Note: This file must be after the SCODE abstraction in the boot sequence. (declare (usual-integrations)) \f ;;;; Procedure (define compound-procedure?) (define procedure?) (let ((p-type (microcode-type 'PRIMITIVE)) (e-type (microcode-type 'PRIMITIVE-EXTERNAL)) (c-type (microcode-type 'PROCEDURE)) (x-type (microcode-type 'EXTENDED-PROCEDURE))) (set! compound-procedure? (named-lambda (compound-procedure? object) (disjunction (primitive-type? c-type object) (primitive-type? x-type object)))) (set! procedure? (named-lambda (procedure? object) (disjunction (primitive-type? p-type object) (primitive-type? e-type object) (primitive-type? c-type object) (primitive-type? x-type object))))) (define procedure-lambda) (define procedure-environment) (define procedure-components) (define procedure-package (make-environment (define select-lambda system-pair-car) (define modify-lambda! system-pair-set-car!) (define select-environment system-pair-cdr) (define modify-environment! system-pair-set-cdr!) (define (select-components procedure receiver) (receiver (select-lambda procedure) (select-environment procedure))) (define ((type-dispatch name p-operation c-operation) procedure) ((cond ((compound-procedure? procedure) c-operation) ((primitive-procedure? procedure) p-operation) (else (error "Not a procedure" name procedure))) procedure)) (define (compound-system-operation name operation) (type-dispatch name (compound-operation-error name) operation)) (define ((compound-operation-error name) procedure) (error "Not a compound procedure" name procedure)) (define (user-operation name p-operation c-operation) (type-dispatch name p-operation (trap-internal-lambdas name c-operation))) (define ((trap-internal-lambdas name operation) procedure) (if ((access is-internal-lambda? lambda-package) (select-lambda procedure)) (error "Internal procedure encountered -- get a wizard" name procedure) (operation procedure))) \f (define system-procedure-lambda (compound-system-operation 'SYSTEM-PROCEDURE-LAMBDA select-lambda)) (define system-procedure-environment (compound-system-operation 'SYSTEM-PROCEDURE-ENVIRONMENT select-environment)) (set! procedure-lambda (user-operation 'PROCEDURE-LAMBDA (compound-operation-error 'PROCEDURE-LAMBDA) select-lambda)) (set! procedure-environment (user-operation 'PROCEDURE-ENVIRONMENT (lambda (primitive-procedure) system-global-environment) select-environment)) (set! procedure-components (user-operation 'PROCEDURE-COMPONENTS (compound-operation-error 'PROCEDURE-COMPONENTS) select-components)) )) \f ;;;; Environment (define environment? (microcode-type-predicate 'ENVIRONMENT)) (define environment-procedure) (define environment-has-parent?) (define environment-parent) (define environment-bindings) (define environment-arguments) (define environment-package (make-environment (define null-environment (primitive-set-type (microcode-type 'NULL) 1)) (define system-procedure-lambda (access system-procedure-lambda procedure-package)) (define system-procedure-environment (access system-procedure-environment procedure-package)) (define ((environment-operation name operation global) environment) (cond ((environment? environment) (let ((procedure (select-procedure environment))) (let ((lambda (system-procedure-lambda procedure))) (if ((access has-internal-lambda? lambda-package) lambda) (error "External environment frame encountered" name) (operation (if ((access is-internal-lambda? lambda-package) lambda) (system-procedure-environment procedure) environment) environment))))) ((eq? environment system-global-environment) (global name)) (else (error "Not an environment" name environment)))) (define (global-environment-error name) (error "Operation not implemented for global environment" name)) (define (select-procedure environment) (system-vector-ref environment 2)) (define (select-parent environment) (system-procedure-environment (select-procedure environment))) (define (select-lambda environment) (system-procedure-lambda (select-procedure environment))) (define (environment-value environment name) (if (lexical-unassigned? environment name) '() (list (lexical-reference environment name)))) \f (set! environment-procedure (environment-operation 'ENVIRONMENT-PROCEDURE (lambda (external-environment internal-environment) (select-procedure external-environment)) global-environment-error)) (set! environment-has-parent? (environment-operation 'ENVIRONMENT-HAS-PARENT? (lambda (external-environment internal-environment) (not (eq? (select-parent external-environment) null-environment))) (lambda (name) #!FALSE))) (set! environment-parent (environment-operation 'ENVIRONMENT-PARENT (lambda (external-environment internal-environment) (select-parent external-environment)) global-environment-error)) (set! environment-bindings (environment-operation 'ENVIRONMENT-BINDINGS (lambda (external-environment internal-environment) (mapcar (lambda (name) (cons name (environment-value internal-environment name))) (mapcar* (lambda-bound (select-lambda external-environment)) car (system-vector-ref internal-environment 0)))) global-environment-error)) (set! environment-arguments (environment-operation 'ENVIRONMENT-ARGUMENTS (lambda (external-environment internal-environment) (define (lookup name) (if (lexical-unassigned? internal-environment name) (make-unassigned-object) (lexical-reference internal-environment name))) (lambda-components (select-lambda external-environment) (lambda (name required optional rest auxiliary body) (mapcar* (let optional-loop ((names optional)) (cond ((null? names) (if (null? rest) '() (lookup rest))) ((lexical-unreferenceable? internal-environment (car names)) '()) (else (cons (lookup (car names)) (optional-loop (cdr names)))))) lookup required)))) global-environment-error)) (define (system-environment-add-parent! environment parent) (system-pair-set-cdr! (environment-procedure environment) parent)) (define (system-environment-remove-parent! environment) (system-pair-set-cdr! (environment-procedure environment) null-environment)) (define (system-external-environment? environment) ((access has-internal-lambda? lambda-package) (select-lambda environment))) )) \f ;;;; Delayed Evaluation (define delayed? (microcode-type-predicate 'DELAYED)) (define delayed-evaluation-forced? (let ((true-type (microcode-type 'TRUE))) (lambda (delayed-evaluation) (primitive-type? true-type (system-pair-car delayed-evaluation))))) (define (delayed-evaluation-value delayed-evaluation) (if (delayed-evaluation-forced? delayed-evaluation) (system-pair-cdr delayed-evaluation) (error "Delayed Evaluation not yet forced" 'DELAYED-EVALUATION-VALUE delayed-evaluation))) (define (delayed-evaluation-expression delayed-evaluation) (if (delayed-evaluation-forced? delayed-evaluation) (error "Delayed Evaluation already forced" 'DELAYED-EVALUATION-EXPRESSION delayed-evaluation) (system-pair-cdr delayed-evaluation))) (define (delayed-evaluation-environment delayed-evaluation) (if (delayed-evaluation-forced? delayed-evaluation) (error "Delayed Evaluation already forced" 'DELAYED-EVALUATION-ENVIRONMENT delayed-evaluation) (system-pair-car delayed-evaluation)))