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))
|