The following interactions window transcript shows the results of defining and evaluating several expressions using the HW5 MUPL interpreter. These are similar to the demo in class. Lines beginning with '>' are input typed in the interactions window.

> (eval-exp (int 17))
(int 17)
> (eval-exp (var "x"))
. . unbound variable during evaluation "x"
> (mlet "x" (int 17) (var "x"))
(mlet "x" (int 17) (var "x"))
> (eval-exp (mlet "x" (int 17) (var "x")))
(int 17)
> (define letexpr (mlet "x" (int 17) (add (var "x") (int 1)))) ; name mupl expr
> letexpr
(mlet "x" (int 17) (add (var "x") (int 1)))
> (eval-exp letexpr)
(int 18)
> (fun "id" "x" (var "x"))
(fun "id" "x" (var "x"))
> (eval-exp (fun "id" "x" (var "x")))
(closure '() (fun "id" "x" (var "x")))
> (define muplid (fun null "x" (var "x")))
> muplid
(fun '() "x" (var "x"))
> (eval-exp muplid)
(closure '() (fun '() "x" (var "x")))
> (eval-exp (call muplid (int 42)))
(int 42)
> (eval-exp (mlet "x" (int 17) (add (var "x") (int 1))))
(int 18)
> (eval-exp (mlet "x" (int 17) (fun "f" "y" (add (var "x") (var "y")))))
(closure (list (cons "x" (int 17))) (fun "f" "y" (add (var "x") (var "y"))))
> (define func (eval-exp (mlet "x" (int 17) (fun "f" "y" (add (var "x") (var "y"))))))
> func
(closure (list (cons "x" (int 17))) (fun "f" "y" (add (var "x") (var "y"))))
> (call func (int 1))
(call (closure (list (cons "x" (int 17))) (fun "f" "y" (add (var "x") (var "y")))) (int 1))
> (eval-exp (call func (int 1)))
(int 18)
> (define mupl-addseq (fun "addseq" "n"
                           (ifnz (var "n") (int 1) (int 0))))
> (eval-exp mupl-addseq)
(closure '() (fun "addseq" "n" (ifnz (var "n") (int 1) (int 0))))
> (call mupl-addseq (int 0))
(call (fun "addseq" "n" (ifnz (var "n") (int 1) (int 0))) (int 0))
> (eval-exp (call mupl-addseq (int 0)))
(int 0)
> (eval-exp (call mupl-addseq (int 1)))
(int 1)
> (define mupl-addseq (fun "addseq" "n"
                           (ifnz (var "n") (int 1) (call (var "addseq") (int 2)))))
> (eval-exp (call mupl-addseq (int 1)))
(int 1)
> (eval-exp (call mupl-addseq (int 0)))
(int 1)
> (define mupl-sumseq (fun "sumseq" "n"
                           (ifnz (var "n")
                                 (add (var "n") (call (var "sumseq") (add (var "n") (int -1))))
                                 (int 0))))
> (eval-exp (call mupl-sumseq (int 0)))
(int 0)
> (eval-exp (call mupl-sumseq (int 1)))
(int 1)
> (eval-exp (call mupl-sumseq (int 2)))
(int 3)
> (eval-exp (call mupl-sumseq (int 3)))
(int 6)