4e987026 |
;;; dump-flic.scm -- general dump functions for flic structures
;;;
;;; author : Sandra Loosemore
;;; date : 24 Feb 1993
;;;
;;;
;;; This stuff is used to write inline expansions to the interface file.
;;;
(define-flic-walker dump-flic (object var-renamings))
(define (dump-flic-list objects var-renamings)
(let ((result '()))
(dolist (o objects)
(push (dump-flic o var-renamings) result))
`(list ,@(nreverse result))))
(define (dump-flic-top object)
(dump-flic object '()))
(define (make-temp-bindings-for-dump oldvars var-renamings)
(let ((vars '())
(bindings '()))
(dolist (v oldvars)
(let ((var (def-name v))
(temp (gensym)))
(push temp vars)
(push `(,temp (create-temp-var ',var)) bindings)
(push (cons v temp) var-renamings)))
(setf bindings (nreverse bindings))
(setf vars (nreverse vars))
(values vars bindings var-renamings)))
(define-dump-flic flic-lambda (object var-renamings)
(multiple-value-bind (vars bindings var-renamings)
(make-temp-bindings-for-dump (flic-lambda-vars object) var-renamings)
`(let ,bindings
(make-flic-lambda
(list ,@vars)
,(dump-flic (flic-lambda-body object) var-renamings)))
))
(define-dump-flic flic-let (object var-renamings)
(multiple-value-bind (vars bindings var-renamings)
(make-temp-bindings-for-dump (flic-let-bindings object) var-renamings)
`(let ,bindings
,@(map (lambda (temp v)
`(setf (var-value ,temp)
,(dump-flic (var-value v) var-renamings)))
vars
(flic-let-bindings object))
(make-flic-let
(list ,@vars)
,(dump-flic (flic-let-body object) var-renamings)
',(flic-let-recursive? object)))
))
(define-dump-flic flic-app (object var-renamings)
`(make-flic-app
,(dump-flic (flic-app-fn object) var-renamings)
,(dump-flic-list (flic-app-args object) var-renamings)
',(flic-app-saturated? object)))
(define-dump-flic flic-ref (object var-renamings)
(let* ((var (flic-ref-var object))
(entry (assq var var-renamings)))
(if entry
`(make-flic-ref ,(cdr entry))
`(make-flic-ref ,(dump-object var)))))
(define-dump-flic flic-const (object var-renamings)
(declare (ignore var-renamings))
`(make-flic-const ',(flic-const-value object)))
(define-dump-flic flic-pack (object var-renamings)
(declare (ignore var-renamings))
`(make-flic-pack ,(dump-object (flic-pack-con object))))
(define-dump-flic flic-case-block (object var-renamings)
`(make-flic-case-block
',(flic-case-block-block-name object)
,(dump-flic-list (flic-case-block-exps object) var-renamings)))
(define-dump-flic flic-return-from (object var-renamings)
`(make-flic-return-from
',(flic-return-from-block-name object)
,(dump-flic (flic-return-from-exp object) var-renamings)))
(define-dump-flic flic-and (object var-renamings)
`(make-flic-and
,(dump-flic-list (flic-and-exps object) var-renamings)))
(define-dump-flic flic-if (object var-renamings)
`(make-flic-if
,(dump-flic (flic-if-test-exp object) var-renamings)
,(dump-flic (flic-if-then-exp object) var-renamings)
,(dump-flic (flic-if-else-exp object) var-renamings)))
(define-dump-flic flic-sel (object var-renamings)
`(make-flic-sel
,(dump-object (flic-sel-con object))
,(flic-sel-i object)
,(dump-flic (flic-sel-exp object) var-renamings)))
(define-dump-flic flic-is-constructor (object var-renamings)
`(make-flic-is-constructor
,(dump-object (flic-is-constructor-con object))
,(dump-flic (flic-is-constructor-exp object) var-renamings)))
(define-dump-flic flic-con-number (object var-renamings)
`(make-flic-con-number
,(dump-object (flic-con-number-type object))
,(dump-flic (flic-con-number-exp object) var-renamings)))
(define-dump-flic flic-void (object var-renamings)
(declare (ignore object var-renamings))
`(make-flic-void))
|