;; ------------------------------------------------------------------------ ;; | FILE : free-vars.rkt | ;; | AUTHOR : Eugene Wallingford | ;; | CREATION DATE : 2022/03/31 | ;; | DESCRIPTION : Returns a set of the free variable references | ;; | in an expression from the little language of | ;; | Sessions 18 and 19, which has multi-argument | ;; | lambdas. You wrote a similar function for | ;; | Homework 7. | ;; ------------------------------------------------------------------------ #lang racket (require "syntax-procs.rkt" "set-adt.rkt") (provide free-vars) (define free-vars (lambda (exp) (cond ( (varref? exp) (set exp) ) ( (lambda? exp) (set-minus (free-vars (lambda->body exp)) (lambda->params exp)) ) ( (app? exp) (set-union (free-vars (app->proc exp)) (set-union-all (map free-vars (app->args exp))))) ( (if? exp) (set-union (free-vars (if->test exp)) (set-union (free-vars (if->then exp)) (free-vars (if->else exp)))) ) ( else (error 'free-vars "invalid expression ~a" exp)) ))) ;; ----- END OF FILE -------------------------------------------------------