home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-27 | 4.0 KB | 116 lines | [TEXT/CCL2] |
- ;;; File: top-definitions.scm
-
- ;;; Description: This creates definitions for all top level (exportable)
- ;;; object in a module.
-
- (define (create-top-definitions)
- (dolist (decl (module-decls *module*))
- (if (interface-module? *module*)
- (when (signdecl? decl)
- (create-var-definitions decl (signdecl-vars decl)))
- (when (valdef? decl)
- (create-var-definitions
- decl (collect-pattern-vars (valdef-lhs decl))))))
- (dolist (algdata (module-algdatas *module*))
- (create-alg-definitions algdata))
- (dolist (synonym (module-synonyms *module*))
- (create-syn-definitions synonym))
- (dolist (class (module-classes *module*))
- (create-class-definitions class))
- (dolist (deriving (module-derivings *module*))
- (create-deriving-definition deriving)))
-
- ;;; ------------------------------------------------------------------------
- ;;; creation of definitions
- ;;; ------------------------------------------------------------------------
-
- (define (create-var-definitions decl vars)
- (remember-context decl
- (dolist (v vars)
- (let* ((var-name (var-ref-name v))
- (def (create-top-definition var-name 'var)))
- (setf (def-where-defined def)
- (ast-node-line-number decl))
- (setf (var-ref-var v) def)
- (add-new-group var-name def)))))
-
- ;;; This also creates definitions for the constructors
-
- (define (create-alg-definitions algdata)
- (remember-context algdata
- (with-slots data-decl (simple constrs) algdata
- (let* ((alg-name (tycon-name simple))
- (def (create-top-definition alg-name 'algdata)))
- (setf (def-where-defined def)
- (ast-node-line-number algdata))
- (setf (tycon-def simple) def)
- (let ((constr-group
- (map (lambda (constr)
- (let* ((con-ref (constr-constructor constr))
- (con-name (con-ref-name con-ref))
- (con-def (create-top-definition con-name 'con)))
- (setf (con-ref-con con-ref) con-def)
- (tuple con-name con-def)))
- constrs)))
- (setf (algdata-constrs def) (map (function tuple-2-2) constr-group))
- (setf (tycon-def-arity def) (length (tycon-args simple)))
- (add-new-group alg-name def constr-group))))))
-
- (define (create-class-definitions class-decl)
- (remember-context class-decl
- (with-slots class-decl (class decls) class-decl
- (let* ((class-name (class-ref-name class))
- (class-def (create-top-definition class-name 'class)))
- (setf (def-where-defined class-def)
- (ast-node-line-number class-decl))
- (setf (class-ref-class class) class-def)
- (let ((method-group
- (concat
- (map
- (lambda (decl)
- (if (is-type? 'signdecl decl)
- (remember-context decl
- (map (lambda (method-var)
- (let* ((var-name (var-ref-name method-var))
- (def (create-top-definition
- var-name 'method-var)))
- (setf (def-where-defined def)
- (ast-node-line-number method-var))
- (setf (method-var-class def) class-def)
- (setf (method-var-default def) '#f)
- (setf (var-ref-var method-var) def)
- (tuple var-name def)))
- (signdecl-vars decl)))
- '()))
- decls))))
- (setf (class-method-vars class-def)
- (map (function tuple-2-2) method-group))
- (add-new-group class-name class-def method-group))))))
-
- (define (create-syn-definitions synonym-decl)
- (remember-context synonym-decl
- (let* ((simple (synonym-decl-simple synonym-decl))
- (syn-name (tycon-name simple))
- (def (create-top-definition syn-name 'synonym)))
- (setf (def-where-defined def)
- (ast-node-line-number synonym-decl))
- (setf (tycon-def simple) def)
- (setf (tycon-def-arity def) (length (tycon-args simple)))
- (add-new-group syn-name def))))
-
- (define (add-new-group name def . others)
- (when (memq *module* (module-exported-modules *module*))
- (export-group (cons (tuple name def)
- (if (null? others)
- '()
- (car others))))))
-
- (define (create-deriving-definition di)
- (remember-context di
- (let* ((simple (deriving-decl-simple di))
- (di-name (add-di-prefix (tycon-name simple)))
- (def (create-top-definition di-name 'di)))
- (setf (tycon-def simple) def)
- (add-new-group di-name def))))
-
-