;; This file contains excerpts from the textbook Concrete ;; Abstractions: An Introduction to Computer Science Using Scheme, by ;; Max Hailperin, Barbara Kaiser, and Karl Knight, Copyright (c) 1998 ;; by Brooks/Cole Publishing Company. This file may not be reproduced ;; or redistributed other than for use with that textbook. ;; From exercise 13.34: (define make-read-eval-print-loop-state (lambda () (make-vector 1))) (define set-global-environment! (lambda (repl-state new-global-env) (vector-set! repl-state 0 new-global-env))) (define get-global-environment (lambda (repl-state) (vector-ref repl-state 0))) (define repl-state (make-read-eval-print-loop-state)) ;; From section 10.4: (define read-eval-print-loop ;uses plain "evaluate," unlike in 10.4 (lambda () (define loop (lambda (global-environment) (display ";Enter Mini-Scheme expr. or definition:") (newline) (let ((expression-or-definition (read))) (if (definition? expression-or-definition) (let ((name (definition-name expression-or-definition)) (value (evaluate (parse (definition-expression expression-or-definition))))) (display ";Mini-scheme defined: ") (write name) (newline) (loop (extend-global-environment-with-naming global-environment name value))) (let ((value (evaluate (parse expression-or-definition)))) (display ";Mini-scheme value: ") (write value) (newline) (loop global-environment)))))) (loop (make-initial-global-environment)))) (define definition? (lambda (x) (and (list? x) (matches? '(define _ _) x)))) (define definition-name cadr) (define definition-expression caddr) (define look-up-value-in (lambda (name global-environment) (global-environment name))) (define extend-global-environment-with-naming (lambda (old-environment name value) (lambda (n) (if (equal? n name) value (old-environment n))))) (define make-mini-scheme-version-of (lambda (procedure) ;; drastically simplified relative to section 10.4 (lambda arguments (apply procedure arguments)))) (define make-initial-global-environment (lambda () (let ((ms+ (make-mini-scheme-version-of +)) (ms- (make-mini-scheme-version-of -)) ;; the rest get similarly converted in here ) (lambda (name) (cond ((equal? name '+) ms+) ((equal? name '-) ms-) ;; the rest get similarly selected in here (else (error "Unrecognized name" name)))))))