git.fiddlerwoaroof.com
import-export/ie-utils.scm
4e987026
 
 ;;; This file contains utilities, globals, and macros used by the
 ;;; import-export system.
 
 (define *new-exports-found?* '#f)  ; used by the fixpoint iteration
 
 ;;; A group is a collection of related symbols.  It is represented
 ;;; by a list of (name,def) pairs.  The first element is the head
 ;;; of the group; the group is entered in the export table under the
 ;;; name of the head only.  Groups for vars and synonyms have only the
 ;;; head.  Data types and classes have the constructors or methods in
 ;;; the tail of the group.
 
 (define (group-name x)  ; name of the head
   (tuple-2-1 (car x)))
 
 (define (group-definition x) ; definition of the head
   (tuple-2-2 (car x)))
 
 ;;; The name & entry are the head of the group.  Others is a list of
 ;;; name - definition pairs.
 (define (make-group name entry . others)
   (if (null? others)
       (list (cons name entry))
       (cons (cons name entry) (car others))))
 
 (define (hidden-constructors? group)
   (null? (cdr group)))
 
 (define (strip-constructors group)
   (list (car group)))
 
 ;;; rename-group applies the current renaming  to every
 ;;;  name in a group.  When uses, a renaming is marked to allow unused
 ;;;  renamings to be detected.
 
 (define (rename-group g renamings)
   (if (null? renamings)
       g
       (map (lambda (n-d)
 	     (let* ((def (tuple-2-2 n-d))
 		    (keep-name? (or (con? def) (var? def)))
 		    (n (tuple-2-1 n-d))
 		    (name (if keep-name? n (add-con-prefix/symbol n)))
 		    (renaming (locate-renaming name renamings)))
 	       (cond (renaming
 		      (let ((new-name
 			     (if keep-name?
 				 (renaming-to renaming)
 				 (remove-con-prefix/symbol
 				   (renaming-to renaming)))))
 			(when (and (def-prelude? def)
 				   (not (eq? (def-name def) new-name)))
 			    (signal-prelude-renaming def new-name)
 			    (setf new-name (def-name def)))
 			(setf (renaming-referenced? renaming) '#t)
 			(tuple new-name def)))
 		     (else n-d))))
 	   g)))
 
 (define (locate-renaming name renamings)
   (if (null? renamings)
       '#f
       (if (eq? name (renaming-from (car renamings)))
 	  (car renamings)
 	  (locate-renaming name (cdr renamings)))))
 
 (define (gather-algdata-group name def)
   (cons (tuple name def)
 	(gather-group (algdata-constrs def))))
 
 (define (gather-class-group name def)
   (cons (tuple name def)
 	(gather-group (class-method-vars def))))
 
 (define (gather-group defs)
   (if (null? defs)
       '()
       (let ((local-name (local-name (car defs))))
 	(if (eq? local-name '#f)
 	    '()
 	    (cons (tuple local-name (car defs))
 		  (gather-group (cdr defs)))))))
 
 ;;; These deal with `hiding' lists.
 
 ;;; Note: as per the new report, no need to worry about anything but the
 ;;; group head and the entity name since only var, Class(..),Alg(..) allowed
 
 (define (in-hiding-list? group hiding)
   (cond ((null? hiding)
 	 '#f)
 	((eq? (entity-name (car hiding)) (group-name group))
 	 '#t)
 	(else (in-hiding-list? group (cdr hiding)))))
 
 (define (remove-entity group hiding)
   (cond ((eq? (entity-name (car hiding)) (group-name group))
 	 (cdr hiding))
 	(else (cons (car hiding) (remove-entity group (cdr hiding))))))
 
 ;;; This moves fixity information to the local symbols.  This must be
 ;;; called after local symbols are installed but before imported
 ;;; symbols arrive.
 
 (define (attach-fixities)
   (dolist (fixity-decl (module-fixities *module*))
     (let ((fixity (fixity-decl-fixity fixity-decl)))
       (dolist (op (fixity-decl-names fixity-decl))
         (let ((def (resolve-toplevel-name op)))
 	  (cond ((or (eq? def '#f) (not (eq? *module-name* (def-module def))))
 		 ;;; ***This is WRONG!  Inner fixities may be found.
 		 (signal-non-local-fixity op))
 		((var? def)
 		 (setf (var-fixity def) fixity)
 		 (setf (table-entry *fixity-table* op) fixity))
 		((con? def)
 		 (setf (con-fixity def) fixity)
 		 (setf (table-entry *fixity-table* op) fixity))
 		(else (signal-fixity-not-var/con op))))))))