123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- ;;; Ported from Scheme 48 1.9. See file COPYING for notices and license.
- ;;;
- ;;; Port Author: Andrew Whatson
- ;;;
- ;;; Original Authors: Richard Kelsey, Jonathan Rees, Mike Sperber
- ;;;
- ;;; scheme48-1.9.2/scheme/bcomp/cenv.scm
- (define-module (prescheme bcomp cenv)
- #:use-module (srfi srfi-9)
- #:use-module (prescheme record-discloser)
- #:export (make-compiler-env ;; re-exported by syntactic
- compiler-env?
- lookup
- bind1
- bind-source-file-name ;; re-exported by syntactic
- source-file-name
- comp-env-macro-eval
- comp-env-define!
- extract-package-from-comp-env)
- #:re-export (bind))
- ;; Compile-time environments
- ;; These are functions
- ;; name -> node ; lexical variable
- ;; binding ; package variable, any syntax
- ;; #f ; free
- ;;
- ;; Special names are used to retrieve various values from compiler environments.
- (define-record-type :compiler-specials
- (make-compiler-specials lookup define! macro-eval package source-file-name)
- compiler-specials?
- (lookup compiler-specials-lookup)
- (define! compiler-specials-define!)
- (macro-eval compiler-specials-macro-eval)
- (package compiler-specials-package)
- (source-file-name compiler-specials-source-file-name))
- (define-record-type :compiler-env
- (really-make-compiler-env specials alist)
- compiler-env?
- (specials compiler-env-specials)
- (alist compiler-env-alist))
- (define (lookup cenv name)
- (cond
- ((assq name (compiler-env-alist cenv)) => cdr)
- (else
- ((compiler-specials-lookup (compiler-env-specials cenv)) name))))
- (define (bind1 name binding cenv)
- (really-make-compiler-env (compiler-env-specials cenv)
- (cons (cons name binding) (compiler-env-alist cenv))))
- (define (bind names bindings cenv)
- (really-make-compiler-env (compiler-env-specials cenv)
- (append (map cons names bindings)
- (compiler-env-alist cenv))))
- ;; Making the initial compiler environment.
- ;;
- ;; lookup : name -> binding or (binding . path) or #f
- ;; define! : name type [static] -> void
- ;; macro-eval : reflective tower, i.e. promise that returns
- ;; (<eval> . <env>) for evaluating macro expanders
- (define (make-compiler-env lookup define! macro-eval package)
- (really-make-compiler-env (make-compiler-specials lookup define! macro-eval package #f)
- '()))
- ;; EVAL function for evaluating macro expanders.
- (define (comp-env-macro-eval cenv)
- (compiler-specials-macro-eval (compiler-env-specials cenv)))
- ;; Function for adding definitions to the outer package.
- (define (comp-env-define! cenv name type . maybe-value)
- (apply (compiler-specials-define! (compiler-env-specials cenv))
- name type maybe-value))
- ;; The package on which the compiler environment is based. This is a
- ;; temporary hack to keep the package-editing code working.
- (define (extract-package-from-comp-env cenv)
- (compiler-specials-package (compiler-env-specials cenv)))
- ;; The name of the source file.
- ;; This is used by the %FILE-NAME% special form,
- ;; which is in turn used by the (MODULE ...) form to save the current file in
- ;; each package,
- ;; which is (finally) used to look up filenames in the correct directory.
- (define (bind-source-file-name filename env)
- (if filename
- (let ((specials (compiler-env-specials env)))
- (really-make-compiler-env (make-compiler-specials
- (compiler-specials-lookup specials)
- (compiler-specials-define! specials)
- (compiler-specials-macro-eval specials)
- (compiler-specials-package specials)
- filename)
- (compiler-env-alist env)))
- env))
- (define (source-file-name cenv)
- (compiler-specials-source-file-name (compiler-env-specials cenv)))
|