;; interp : F1WAE? (listof FunDef) -> number? (define (subst-interp an-f1wae fundefs) (type-case F1WAE an-f1wae [num (n) n] [add (a b) (+ (subst-interp a fundefs) (subst-interp b fundefs))] [sub (a b) (+ (subst-interp a fundefs) (subst-interp b fundefs))] [id (name) (error 'interp "free identifier")] [with (name bound-e body) (subst-interp (subst body name (subst-interp bound-e fundefs)) fundefs)] [app (fun-name arg-expr) (define the-fundef (subst-lookup-fundef fun-name fundefs)) (subst-interp (subst (fundef-body the-fundef) (fundef-param-name the-fundef) (subst-interp arg-expr fundefs)) fundefs)])) ;; lookup-fundef : symbol? (listof FunDef?) -> FunDef? (define (subst-lookup-fundef name fundefs) (cond [(empty? fundefs) (error 'lookup-fun "undefined function")] [else (if (equal? name (fundef-fun-name (first fundefs))) (first fundefs) (subst-lookup-fundef name (rest fundefs)))])) ;; subst : F1WAE? symbol? number? -> F1WAE? (define (subst an-f1wae name value) (type-case F1WAE an-f1wae [num (n) an-f1wae] [add (l r) (add (subst l name value) (subst r name value))] [sub (l r) (sub (subst l name value) (subst r name value))] [id (name2) (if (equal? name name2) (num value) an-f1wae)] [with (name2 named-expr body) (with name2 (subst named-expr name value) (if (equal? name name2) body (subst body name value)))] [app (fun-name arg-expr) (app fun-name (subst arg-expr name value))]))