home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-27 | 5.3 KB | 185 lines | [TEXT/CCL2] |
- ;;; print-valdefs.scm -- print AST structures for local declarations
- ;;;
- ;;; author : Sandra Loosemore
- ;;; date : 14 Jan 1992
- ;;;
- ;;; This file corresponds to ast/valdef-structs.scm.
- ;;;
- ;;;
-
-
-
- (define-ast-printer signdecl (object xp)
- (with-ast-block (xp)
- (write-delimited-list (signdecl-vars object) xp (function write) "," "" "")
- (write-string " ::" xp)
- (write-whitespace xp)
- (write (signdecl-signature object) xp)))
-
-
- ;;; This interacts with the layout rule stuff. See util.scm.
-
- (define-ast-printer valdef (object xp)
- (let ((lhs (valdef-lhs object))
- (definitions (filter (lambda (d)
- (not (single-fun-def-avoid-printing? d)))
- (valdef-definitions object))))
- (write-definition lhs (car definitions) xp)
- (dolist (d (cdr definitions))
- (if (dynamic *print-pretty*)
- (pprint-newline 'mandatory xp)
- (write-string "; " xp))
- (write-definition lhs d xp))))
-
- (define-ast-printer single-fun-def (object xp)
- (write-definition (**pat '| |) object xp))
-
- (define (write-definition lhs d xp)
- (with-ast-block (xp)
- (let ((args (single-fun-def-args d))
- (rhs-list (single-fun-def-rhs-list d))
- (where-decls (single-fun-def-where-decls d))
- (infix? (single-fun-def-infix? d)))
- (write-lhs lhs args infix? xp)
- (write-rhs rhs-list xp)
- (write-wheredecls where-decls xp)
- )))
-
- (define (write-lhs lhs args infix? xp)
- (cond ((null? args)
- ;; pattern definition
- (write-apat lhs xp)
- )
- ;; If there are args, the lhs is always a var-pat pointing to a
- ;; var-ref. The infix? slot from the single-fun-def must override
- ;; the slot on the var-ref, since there can be a mixture of
- ;; infix and prefix definitions for the same lhs.
- (infix?
- ;; operator definition
- (when (not (null? (cddr args)))
- (write-char #\( xp))
- (write-apat (car args) xp)
- (write-whitespace xp)
- (write-varop (var-ref-name (var-pat-var lhs)) xp)
- (write-whitespace xp)
- (write-apat (cadr args) xp)
- (when (not (null? (cddr args)))
- (write-char #\) xp)
- (write-whitespace xp)
- (write-delimited-list (cddr args) xp (function write-apat)
- "" "" "")))
- (else
- ;; normal prefix function definition
- (write-varid (var-ref-name (var-pat-var lhs)) xp)
- (write-whitespace xp)
- (write-delimited-list args xp (function write-apat) "" "" ""))
- ))
-
- (define (write-rhs rhs-list xp)
- (let ((guard (guarded-rhs-guard (car rhs-list)))
- (rhs (guarded-rhs-rhs (car rhs-list))))
- (when (not (is-type? 'omitted-guard guard))
- (write-string " | " xp)
- (write guard xp))
- (write-string " =" xp)
- (write-whitespace xp)
- (write rhs xp)
- (when (not (null? (cdr rhs-list)))
- (write-newline xp)
- (write-rhs (cdr rhs-list) xp))))
-
-
- ;;; Pattern printers
-
-
- ;;; As per jcp suggestion, don't put whitespace after @; line break comes
- ;;; before, not after (as is the case for other infix-style punctuation).
-
- (define-ast-printer as-pat (object xp)
- (with-ast-block (xp)
- (write (as-pat-var object) xp)
- (write-whitespace xp)
- (write-string "@" xp)
- (write-apat (as-pat-pattern object) xp)))
-
- (define (write-apat pat xp)
- (if (or (is-type? 'apat pat)
- (is-type? 'pp-pat-plus pat) ; hack per jcp
- (and (is-type? 'pcon pat)
- (or (null? (pcon-pats pat))
- (eq? (pcon-con pat) (core-symbol "UnitConstructor"))
- (is-tuple-constructor? (pcon-con pat)))))
- (write pat xp)
- (begin
- (write-char #\( xp)
- (write pat xp)
- (write-char #\) xp))))
-
- (define-ast-printer irr-pat (object xp)
- (write-string "~" xp)
- (write-apat (irr-pat-pattern object) xp))
-
- (define-ast-printer var-pat (object xp)
- (write (var-pat-var object) xp))
-
- (define-ast-printer wildcard-pat (object xp)
- (declare (ignore object))
- (write-char #\_ xp))
-
- (define-ast-printer const-pat (object xp)
- (write (const-pat-value object) xp))
-
- (define-ast-printer plus-pat (object xp)
- (write (plus-pat-pattern object) xp)
- (write-string " + " xp)
- (write (plus-pat-k object) xp))
-
-
-
- (define-ast-printer pcon (object xp)
- (let ((name (pcon-name object))
- (pats (pcon-pats object))
- (infix? (pcon-infix? object))
- (def (pcon-con object)))
- (cond ((eq? def (core-symbol "UnitConstructor"))
- (write-string "()" xp))
- ((is-tuple-constructor? def)
- (write-commaized-list pats xp))
- ((null? pats)
- (if infix?
- ;; infix pcon with no arguments can happen inside pp-pat-list
- ;; before precedence parsing happens.
- (write-conop name xp)
- (write-conid name xp)))
- (infix?
- ;; This could be smarter about dealing with precedence of patterns.
- (with-ast-block (xp)
- (write-apat (car pats) xp)
- (write-whitespace xp)
- (write-conop name xp)
- (write-whitespace xp)
- (write-apat (cadr pats) xp)))
- (else
- (with-ast-block (xp)
- (write-conid name xp)
- (write-whitespace xp)
- (write-delimited-list pats xp (function write-apat) "" "" "")))
- )))
-
- (define-ast-printer list-pat (object xp)
- (write-delimited-list
- (list-pat-pats object) xp (function write) "," "[" "]"))
-
- (define-ast-printer pp-pat-list (object xp)
- (write-delimited-list (pp-pat-list-pats object) xp (function write-apat)
- "" "" ""))
-
- (define-ast-printer pp-pat-plus (object xp)
- (declare (ignore object))
- (write-string "+ " xp))
-
- (define-ast-printer pp-pat-negated (object xp)
- (declare (ignore object))
- (write-string "-" xp))
-
-