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