git.fiddlerwoaroof.com
flic/print-flic.scm
4e987026
 ;;; print-flic.scm -- printers for FLIC structures
 ;;;
 ;;; author :  Sandra Loosemore
 ;;; date   :  30 Mar 1992
 ;;;
 ;;;
 
 
 ;;; For now, printing of FLIC structures is controlled by the same
 ;;; *print-ast-syntax* variable as for AST structures.
 ;;; Maybe eventually this should use its own variable.
 
 (define-syntax (define-flic-printer type lambda-list . body)
   `(define-ast-printer ,type ,lambda-list ,@body))
 
 (define-flic-printer flic-lambda (object xp)
   (with-ast-block (xp)
     (write-string "\\ " xp)
     (write-ordinary-list (flic-lambda-vars object) xp)
     (write-string " ->" xp)
     (write-whitespace xp)
     (write (flic-lambda-body object) xp)))
 
 (define-flic-printer flic-let (object xp)
   (pprint-logical-block (xp '() "" "")  ; no extra indentation
     (write-string "let " xp)
     (write-layout-rule (flic-let-bindings object) xp
 		       (lambda (v xp)
 		         (with-ast-block (xp)
 		           (write v xp)
 			   (write-string " =" xp)
 			   (write-whitespace xp)
 			   (write (var-value v) xp))))
     (write-whitespace xp)
     (write-string "in " xp)
     (write (flic-let-body object) xp)))
 
 (define-flic-printer flic-app (object xp)
   (with-ast-block (xp)
     (maybe-paren-flic-object (flic-app-fn object) xp)
     (write-whitespace xp)
     (write-flic-list (flic-app-args object) xp)))
 
 (define (maybe-paren-flic-object object xp)
   (cond ((or (flic-ref? object)
 	     (flic-const? object)
 	     (flic-pack? object))
 	 (write object xp))
 	(else
 	 (write-char #\( xp)
 	 (write object xp)
 	 (write-char #\) xp))))
 
 (define (write-flic-list objects xp)
   (write-delimited-list objects xp (function maybe-paren-flic-object) "" "" ""))
 
 (define-flic-printer flic-ref (object xp)
   (write (flic-ref-var object) xp))
 
 (define-flic-printer flic-const (object xp)
   (write (flic-const-value object) xp))
 
 (define-flic-printer flic-pack (object xp)
   (write-string "pack/" xp)
   (write (flic-pack-con object) xp))
 
 (define-flic-printer flic-case-block (object xp)
   (with-ast-block (xp)
     (write-string "case-block " xp)
     (write (flic-case-block-block-name object) xp)
     (write-whitespace xp)
     (write-layout-rule (flic-case-block-exps object) xp (function write))))
 
 (define-flic-printer flic-return-from (object xp)
   (with-ast-block (xp)
     (write-string "return-from " xp)
     (write (flic-return-from-block-name object) xp)
     (write-whitespace xp)
     (write (flic-return-from-exp object) xp)))
 
 (define-flic-printer flic-and (object xp)
   (with-ast-block (xp)
     (write-string "and " xp)
     (write-layout-rule (flic-and-exps object) xp (function write))))
 
 (define-flic-printer flic-if (object xp)
   (with-ast-block (xp)
     (write-string "if " xp)
     (write (flic-if-test-exp object) xp)
     (write-whitespace xp)
     (with-ast-block (xp)
       (write-string "then" xp)
       (write-whitespace xp)
       (write (flic-if-then-exp object) xp))
     (write-whitespace xp)
     (with-ast-block (xp)
       (write-string "else" xp)
       (write-whitespace xp)
       (write (flic-if-else-exp object) xp))
     ))
 
 
 (define-flic-printer flic-sel (object xp)
   (with-ast-block (xp)
     (write-string "sel/" xp)
     (write (flic-sel-con object) xp)
     (write-char #\/ xp)
     (write (flic-sel-i object) xp)
     (write-whitespace xp)
     (write (flic-sel-exp object) xp)))
 
 (define-flic-printer flic-is-constructor (object xp)
   (with-ast-block (xp)
     (write-string "is-constructor/" xp)
     (write (flic-is-constructor-con object) xp)
     (write-whitespace xp)
     (write (flic-is-constructor-exp object) xp)))
 
 (define-flic-printer flic-con-number (object xp)
   (with-ast-block (xp)
     (write-string "con/" xp)
     (write (flic-con-number-type object) xp)
     (write-whitespace xp)
     (write (flic-con-number-exp object) xp)))
 
 (define-flic-printer flic-void (object xp)
   (declare (ignore object))
   (write-string "Void" xp))