; Copyright (c) 1994 by Richard Kelsey.  See file COPYING.

; Pre-Scheme packages

; Everything else

(define-structures ((prescheme-compiler (export)))
  (open scheme big-scheme conditions comp-util structure-refs
	prescheme-front-end prescheme-display
	parameters
	node
	front-debug forms
	ps-types
	type-variables
	c
	structure-refs
	primop-data
	c-primop-data
	jump                 ;find-jump-procs procs->jumps 
	record-types         ;reset-record-data!
	node-types
	front                ;simplify-all
	simplify)            ;simplify-node
  (files top))

(define-structures ((prescheme-display (export display-forms-as-scheme)))
  (open scheme big-scheme
	structure-refs
	names
	bindings		;binding-place
	nodes
	variable primop external-values ps-primitives
	flatten-internal	;generated-top-variable?
	external-constants)
  (access forms)		;form-value form-var
  (files display))

(define-structures ((protocol (export normal-protocol
				      goto-protocol
				      goto-protocol?)))
  (open scheme big-scheme comp-util set-parameters ps-primops ps-types node)
  (files spec))

(define-structures ((prescheme-front-end (export prescheme-front-end)))
  (open scheme big-scheme comp-util structure-refs
	linking expand flatten forms
	ps-types inference
	variable
	primitive-data
	primop-data
	inference-internal  ; unify!
	type-variables)     ; reset-type-vars!
  (access nodes		    ; node? schemify
	  node              ; reset-node-id
	  record-types)     ; reset-record-types!    
  (files front-end))

(define-structures ((forms form-interface))
  (open scheme big-scheme comp-util node expand defrecord
	node-vector queues to-cps
	structure-refs
	eval-node         ; closure stuff
	ps-primops        ; get-prescheme-primop
	simplify-internal ; simplify-node simplify-args
	front             ; simplify-all
	ps-types          ; type/undetermined
	type-variables    ; maybe-follow-uvar
	node-types)       ; instantiate-type&value
  (access nodes)          ; node-predicate
  (files form))

; Translating Scheme into evaluated nodes

(define-structures ((expand (export scan-packages)))
  (open scheme big-scheme comp-util structure-refs
	variable
	bindings nodes
	ps-primitives   ;eval-primitive
	eval-node       ;eval-node
	scan-package	;package-source
	locations
	util		;fold
	syntactic)
  (access packages)     ;package->environment
  (files expand))

; Eval and type information on Pre-Scheme primitives

(define-structures ((ps-primitives (export primitive?
					   make-primitive
					   eval-primitive
					   primitive-id
					   primitive-source
					   primitive-expander
					   primitive-expands-in-place?
					   primitive-inference-rule)))
  (open scheme big-scheme comp-util defrecord)
  (files primitive))

(define-structures ((primitive-data (export)))
  (open scheme big-scheme comp-util ps-primitives
	bindings nodes
	ascii structure-refs
	ps-primops		;get-prescheme-primop
	linking			;define-prescheme!
	inference-internal	;check-arg-type
	type-variables		;make-arith-op-uvar
	record-types
	prescheme ps-memory
	ps-types external-constants external-values
	locations
	eval-node)  ; closure?  (to keep them from being made immutable)
  (access variable)   ; variable-name
  (files (primop scm-scheme)
	 (primop scm-arith)
	 (primop scm-memory)
	 (primop scm-record)))

(define-structures ((eval-node (export eval-node
				       closure? closure-node closure-env
				       make-top-level-closure
				       closure-temp set-closure-temp!
				       apply-closure
				       unspecific? constant?)))
  (open scheme define-record-types
	nodes
	ps-types		;expand-type-spec
	external-values
	external-constants	;external-constant?
	signals			;error
	util)			;unspecific
  (files eval))

; Reducing closures and data structures to simple definitions

(define-structures ((flatten (export flatten-definitions))
		    (flatten-internal (export generated-top-variable?)))
  (open scheme big-scheme comp-util defrecord
	structure-refs
	bindings nodes
	variable
	eval-node 	;closure stuff, constant?
	ps-primitives	;primitive stuff
	ps-types	;type/undetermined expand-type-spec
	linking		;prescheme-compiler-env
	syntactic	;expand
	strong
	external-values
	locations
	features)	;immutable?
  (access forms)	;avoid name conflict with NODE-FORM in nodes
  (files flatten substitute))

(define-structures ((to-cps (export x->cps)))
  (open scheme big-scheme comp-util
	variable
	names bindings nodes
	primop
	structure-refs
	cps-util enumerated
	ps-primops 	;get-prescheme-primop
	ps-types 	;type/unknown
	inference	;node-type lambda-node-return-type
	ps-primitives	;primitive-expander
	protocol)	;goto-protocol normal-protocol
  (access node)
  (files to-cps))
	
; Processing interface and package definitions

(define-structures ((linking linking-interface))
  (open scheme big-scheme structure-refs comp-util
	interfaces packages environments usual-macros
	defpackage types ;for making interfaces
        reflective-tower-maker
	fluids
	expand-define-record-type
	scan-package	 ;collect-packages
	bindings         ;binding? binding-place
	nodes		 ;get-operator
	transforms       ;make-transform
	locations)       ;contents
  (access meta-types           		;syntax-type usual-variable-type
	  variable             		;make-global-variable
	  ps-types             		;type/unknown
	  reading-forms			;$note-file-package
	  packages-internal    		;$get-location
	  package-commands-internal	;config-package
	  prescheme            		;we need this loaded
	  built-in-structures) 		;defpackage structure-refs
  (files linking))

;----------------------------------------------------------------
; Types and type inference

(define-structures ((ps-types ps-type-interface)
		    (type-variables type-variable-interface)
		    (record-types record-type-interface)
		    (expand-define-record-type
		     (export expand-define-record-type)))
  (open scheme big-scheme comp-util defrecord)
  (files type
	 type-scheme
	 type-var
	 record))

(define-structures ((inference inference-interface)
		    (inference-internal inference-internal-interface))
  (open scheme big-scheme front variable comp-util transitive
	ps-types type-variables
	bindings nodes
	structure-refs
	ps-primitives
	ps-primops    ; get-prescheme-primop
	external-values external-constants
	locations)    ; for imported constants
  (access eval-node)  ; unspecific?
  (for-syntax (open scheme big-scheme))
  (files inference infer-early))

(define-structures ((node-types (export instantiate-type&value
					make-monomorphic!)))
  (open scheme big-scheme front node comp-util
	ps-types type-variables
	inference-internal)  ; unify!
  (files node-type))

;----------------------------------------------------------------
; Primops

(define-structures ((ps-primops ps-primop-interface))
  (open scheme big-scheme comp-util node simplify-internal
	linking ps-types front expand)
  (files (primop primop)))

(define-structures ((ps-c-primops ps-c-primop-interface))
  (open scheme big-scheme comp-util node simplify-internal
	define-record-types
	ps-types ps-primops)
  (for-syntax (open scheme big-scheme))
  (files (primop c-primop)))

(define-structures ((primop-data (export)))
  (open scheme big-scheme comp-util node simplify-internal simplify-let
	front expand type-variables inference-internal
	ps-types ps-primops record-types
	parameters node-vector
	node-types)   ; instantiate-type&value
  (files (primop base)
	 (primop arith)
	 (primop io)
	 (primop vector)
	 ))

(define-structures ((c-primop-data (export)))
  (open scheme big-scheme comp-util node simplify
	ps-types ps-primops ps-c-primops
	front
	structure-refs
	c-internal
	ps-types type-variables inference-internal
	inference          ; get-variable-type
	forms byte-vectors
	record-types
	eval-node)         ; unspecific?
  (access ps-primitives prescheme)
  (files (primop c-base)
	 (primop c-arith)
	 (primop c-io)
	 (primop c-vector)
	 ))

(define-structures ((external-values (export external-value?
					     make-external-value
					     external-value-type
					     external-value-string)))
  (open scheme define-record-types)
  (begin
    (define-record-type external-value :external-value
      (make-external-value string type)
      external-value?
      (string external-value-string)
      (type external-value-type))))

;----------------------------------------------------------------
; Translating to C

(define-structures ((c (export write-c-file hoist-nested-procedures))
		    (c-internal c-internal-interface))
  (open scheme big-scheme comp-util strongly-connected node forms
	defrecord
	ps-primops ps-c-primops
	ps-types type-variables
	flatten-internal   ; generated-top-variable?
	inference          ; get-variable-type
	inference-internal ; literal-value-type
	protocol           ; goto-protocol?
	i/o		   ; force-output
	record-types
	external-values
	external-constants
	eval-node)         ; unspecific?
  (begin (define number-of-char-codes 256))  ; should be somewhere else
  (files c
	 c-decl
	 c-call
	 hoist
	 merge))