git.fiddlerwoaroof.com
cfn/misc.scm
4e987026
 ;;; misc.scm -- random other transformations done during CFN processing
 ;;;
 ;;; author :  Sandra Loosemore
 ;;; date   :  27 Feb 1992
 ;;;
 ;;; This file contains specialized CFN walkers that implement rewrite rules
 ;;; for list-exp, sequence-xxx, list-comp, section-l, and section-r.
 
 
 ;;; Turn list-exps into cons chains.
 
 (define-walker-method cfn list-exp (object)
   (do-cfn-list-exp (list-exp-exps object)))
 
 (define (do-cfn-list-exp exps)
   (if (null? exps)
       ;; Make a con-ref for []
       (**con/def (core-symbol "Nil"))
       ;; Otherwise make an app of :
       (let ((first  (cfn-ast-1 (car exps)))
 	    (rest   (do-cfn-list-exp (cdr exps))))
 	(**app (**con/def (core-symbol ":")) first rest))))
 	
 
 ;;; Sections get turned into lambda expressions.
 
 (define-walker-method cfn section-l (object)
   (let ((def   (create-temp-var 'section-arg)))
     (**lambda/pat
       (list (**var-pat/def def))
       (**app (cfn-ast-1 (section-l-op object))
              (**var/def def)
 	     (cfn-ast-1 (section-l-exp object))))))
 
 (define-walker-method cfn section-r (object)
   (let ((def   (create-temp-var 'section-arg)))
     (**lambda/pat
       (list (**var-pat/def def))
       (**app (cfn-ast-1 (section-r-op object))
 	     (cfn-ast-1 (section-r-exp object))
              (**var/def def)))))
 
 
 
 ;;; Do list comprehensions.
 ;;; rewrite in terms of build and foldr so that we can apply
 ;;; deforestation techniques later.
 
 (define-walker-method cfn list-comp (object)
   (let ((c   (create-temp-var 'c))
 	(n   (create-temp-var 'n)))
     (cfn-ast-1
       (**app (**var/def (core-symbol "build"))
 	     (**lambda/pat
 	       (list (**var-pat/def c) (**var-pat/def n))
 	       (do-cfn-list-comp
 		 (list-comp-exp object) (list-comp-quals object) c n))))))
 
 (define (do-cfn-list-comp exp quals c n)
   (if (null? quals)
       (**app (**var/def c) exp (**var/def n))
       (let ((qual  (car quals)))
 	(if (is-type? 'qual-generator qual)
 	    (do-cfn-list-comp-generator exp qual (cdr quals) c n)
 	    (do-cfn-list-comp-filter exp qual (cdr quals) c n)))))
 
 (define (do-cfn-list-comp-filter exp qual quals c n)
   (**if (qual-filter-exp qual)
 	(do-cfn-list-comp exp quals c n)
 	(**var/def n)))
 
 (define (do-cfn-list-comp-generator exp qual quals c n)
   (let ((gen-pat  (qual-generator-pat qual))
 	(gen-exp  (qual-generator-exp qual))
 	(l        (create-temp-var 'list))
 	(b        (create-temp-var 'rest)))
     (**app (**var/def (core-symbol "foldr"))
 	   (**lambda/pat
 	     (list (**var-pat/def l) (**var-pat/def b))
 	     (**case (**var/def l)
 		     (list (**alt/simple
 			    gen-pat
 			    (do-cfn-list-comp exp quals c b))
 			   (**alt/simple
 			    (**wildcard-pat)
 			    (**var/def b)))))
 	   (**var/def n)
 	   gen-exp)))
 
 ;;; Placeholders just get eliminated
 
 (define-walker-method cfn dict-placeholder (object)
   (if (eq? (dict-placeholder-exp object) '#f)
       (error "Type checker screwed a dict placeholder object ~s." object)
       (cfn-ast-1 (dict-placeholder-exp object))))
 
 (define-walker-method cfn method-placeholder (object)
   (if (eq? (method-placeholder-exp object) '#f)
       (error "Type checker screwed a method placeholder object ~s." object)
       (cfn-ast-1 (method-placeholder-exp object))))
 
 (define-walker-method cfn recursive-placeholder (object)
   (if (eq? (recursive-placeholder-exp object) '#f)
       (error "Type checker screwed a recursive placeholder object ~s." object)
       (cfn-ast-1 (recursive-placeholder-exp object))))
 
 (define-walker-method cfn cast (object)
   (cfn-ast-1 (cast-exp object)))
 
 ;;; Eliminate saved old expressions
 
 (define-walker-method cfn save-old-exp (object)
   (cfn-ast-1 (save-old-exp-new-exp object)))