git.fiddlerwoaroof.com
Raw Blame History
;;; 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))