git.fiddlerwoaroof.com
printers/print-modules.scm
4e987026
 ;;; print-modules.scm -- print routines for module-related AST structures
 ;;;
 ;;; author :  Sandra Loosemore
 ;;; date   :  6 Jan 1992
 ;;;
 ;;;
 ;;; This file corresponds to the file ast/modules.scm.
 
 ;;; Note: by default, only the module name is printed.  To print the
 ;;; full module, the function print-full-module must be called.
 
 (define *print-abbreviated-modules* '#t)
 
 (define-ast-printer module (object xp)
  (if *print-abbreviated-modules*
      (begin
        (write-string "Module " xp)
        (write-string (symbol->string (module-name object)) xp))
      (do-print-full-module object xp)))
 
 (define (print-full-module object . maybe-stream)
   (let ((stream  (if (not (null? maybe-stream))
 		     (car maybe-stream)
 		     (current-output-port))))
     (dynamic-let ((*print-abbreviated-modules* '#f))
        (pprint object stream))))
 
 (define (do-print-full-module object xp)
  (dynamic-let ((*print-abbreviated-modules* '#t))
   (let ((modid    (module-name object))
 	(exports  (module-exports object))
 	(body     (append (module-imports object)
 			  (module-fixities object)
 			  (module-synonyms object)
 			  (module-algdatas object)
 			  (module-classes object)
 			  (module-instances object)
 			  (if (or (not (module-default object))
 				  (eq? (module-default object)
 				       *standard-module-default*))
 			      '()
 			      (list (module-default object)))
 			  (module-decls object))))
     (write-string "module " xp)
     (write-modid modid xp)
     (when (not (null? exports))
       (write-whitespace xp)
       (write-commaized-list exports xp))
     (write-wheredecls body xp))))
 
 (define-ast-printer import-decl (object xp)
   (let ((modid     (import-decl-module-name object))
 	(mode      (import-decl-mode object))
 	(specs     (import-decl-specs object))
 	(renamings (import-decl-renamings object)))
     (with-ast-block (xp)
       (write-string "import " xp)
       (write-modid modid xp)
       (if (eq? mode 'all)
 	  (when (not (null? specs))
 	    (write-whitespace xp)
 	    (write-string "hiding " xp)
 	    (write-commaized-list specs xp))
 	  (begin
 	    (write-whitespace xp)
 	    (write-commaized-list specs xp)))
       (when (not (null? renamings))
 	(write-whitespace xp)
 	(write-string "renaming " xp)
 	(write-commaized-list renamings xp))
       )))
 
 (define-ast-printer entity-module (object xp)
   (write-modid (entity-name object) xp)
   (write-string ".." xp))
 
 (define-ast-printer entity-var (object xp)
   (write-varid (entity-name object) xp))
 
 (define-ast-printer entity-con (object xp)
   (write-tyconid (entity-name object) xp))
 
 (define-ast-printer entity-abbreviated (object xp)
   (write-tyconid (entity-name object) xp)
   (write-string "(..)" xp))
 
 (define-ast-printer entity-class (object xp)
   (with-ast-block (xp)
     (write-tyclsid (entity-name object) xp)
     (write-whitespace xp)
     (write-delimited-list (entity-class-methods object) xp
 			  (function write-varid) "," "(" ")")))
 
 (define-ast-printer entity-datatype (object xp)
   (with-ast-block (xp)
     (write-tyconid (entity-name object) xp)
     (write-whitespace xp)
     (write-delimited-list (entity-datatype-constructors object) xp
 			  (function write-conid) "," "(" ")")))
 
 
 (define-ast-printer renaming (object xp)
   (with-ast-block (xp)
     (write-varid-conid (renaming-from object) xp)
     (write-string " to" xp)
     (write-whitespace xp)
     (write-varid-conid (renaming-to object) xp)))
 
 ;;; *** Should it omit precedence if it's 9?
 
 (define-ast-printer fixity-decl (object xp)
   (let* ((fixity         (fixity-decl-fixity object))
 	 (associativity  (fixity-associativity fixity))
 	 (precedence     (fixity-precedence fixity))
 	 (ops            (fixity-decl-names object)))
     (with-ast-block (xp)
       (cond ((eq? associativity 'l)
 	     (write-string "infixl " xp))
 	    ((eq? associativity 'r)
 	     (write-string "infixr " xp))
 	    ((eq? associativity 'n)
 	     (write-string "infix " xp)))
       (write precedence xp)
       (write-whitespace xp)
       (write-delimited-list ops xp (function write-varop-conop) "," "" ""))))