git @ Cat's Eye Technologies Robin / master eg / traverse-expr.robin
master

Tree @master (Download .tar.gz)

traverse-expr.robin @masterraw · history · blame

(require let) (require choose) (require fold)

;''Demonstration of some code that traverses an expression, in preparation for
   writing some actual Robin static analysis code, in Robin.

   Note, this example code is woefully incomplete.''

(define traverse-expr (fun (expr)
  (bind traverse-r (fun (self expr acc)
    (if (list? expr)
        (let ((fname (head expr))
              (args  (tail expr))
              (acc1  (prepend fname acc))
              (visit (fun (x a) (self self x a)))
              (acc2  (fold visit acc1 args)))
          acc2)
        (prepend expr acc)))
    (traverse-r traverse-r expr ()))))

(define little-program (literal
  (add (mul 7 8) (mul 5 9))
))

(display (traverse-expr little-program))