git.fiddlerwoaroof.com
cfn/main.scm
4e987026
 ;;; main.scm -- main entry point for CFN pass
 ;;;
 ;;; author :  Sandra Loosemore
 ;;; date   :  27 Feb 1992
 ;;;
 
 
 ;;;===================================================================
 ;;; Basic support
 ;;;===================================================================
 
 
 ;;; Define the basic walker and some helper functions.
 
 (define-walker cfn ast-td-cfn-walker)
 
 (define (cfn-ast-1 x)
   (call-walker cfn x))
 
 (define (cfn-ast/list l)
   (map (lambda (x) (cfn-ast-1 x)) l))
 
 
 ;;; This is the main entry point.  It is called by the driver on
 ;;; each top-level decl in the module.
 
 (define (cfn-ast x)
   (let ((result  (cfn-ast-1 x)))
 ;    (pprint result)  ;*** debug
     result))
 
 
 
 ;;;===================================================================
 ;;; Default traversal methods
 ;;;===================================================================
 
 
 (define-local-syntax (make-cfn-code slot type)
   (let ((stype  (sd-type slot))
         (sname  (sd-name slot)))
     (cond ((and (symbol? stype)
                 (or (eq? stype 'exp)
                     (subtype? stype 'exp)))
            `(setf (struct-slot ',type ',sname object)
                   (cfn-ast-1 (struct-slot ',type ',sname object))))
           ((and (pair? stype)
                 (eq? (car stype) 'list)
                 (symbol? (cadr stype))
                 (or (eq? (cadr stype) 'exp)
                     (subtype? (cadr stype) 'exp)))
            `(setf (struct-slot ',type ',sname object)
                   (cfn-ast/list (struct-slot ',type ',sname object))))
           ((and (pair? stype)
                 (eq? (car stype) 'list)
                 (eq? (cadr stype) 'decl))
            `(setf (struct-slot ',type ',sname object)
                   (cfn-valdef-list (struct-slot ',type ',sname object))))
           (else
 ;          (format '#t "Cfn: skipping slot ~A in ~A~%"
 ;                  (sd-name slot)
 ;                  type)
            '#f))))
 
 (define-modify-walker-methods cfn
   (let if
    exp-sign
    app
    var-ref con-ref
    integer-const float-const char-const string-const
    con-number sel is-constructor
    void
    case-block return-from and-exp
    )
   (object)
   make-cfn-code)
 
 
 ;;; These have specialized walkers:
 ;;; lambda, case, valdef, list-comp  (pattern.scm)
 ;;; list-exp, list-comp, section-l, section-r, dict-placeholder,
 ;;; recursive-placeholder, save-old-exp (misc.scm)