git.fiddlerwoaroof.com
Raw Blame History
;;; 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))))))))