Finish 2.rkt
This commit is contained in:
12
Final/2.rkt
12
Final/2.rkt
@ -8,6 +8,7 @@
|
|||||||
[errorE (msg : String)] ;; New
|
[errorE (msg : String)] ;; New
|
||||||
[if0E (test : Exp) (then : Exp) (else : Exp)]
|
[if0E (test : Exp) (then : Exp) (else : Exp)]
|
||||||
[minus1E (n : Exp)]
|
[minus1E (n : Exp)]
|
||||||
|
[timesE (lhs : Exp) (rhs : Exp)]
|
||||||
)
|
)
|
||||||
|
|
||||||
(define-type Value
|
(define-type Value
|
||||||
@ -45,6 +46,11 @@
|
|||||||
[doMinusK (v1 : Value)
|
[doMinusK (v1 : Value)
|
||||||
(k : Continuation)]
|
(k : Continuation)]
|
||||||
[doMinus1K (k : Continuation)]
|
[doMinus1K (k : Continuation)]
|
||||||
|
[timesSecondK (r : Exp)
|
||||||
|
(env : Env)
|
||||||
|
(k : Continuation)]
|
||||||
|
[doTimesK (v1 : Value)
|
||||||
|
(k : Continuation)]
|
||||||
[appArgK (arg-expr : Exp)
|
[appArgK (arg-expr : Exp)
|
||||||
(env : Env)
|
(env : Env)
|
||||||
(k : Continuation)]
|
(k : Continuation)]
|
||||||
@ -85,6 +91,7 @@
|
|||||||
(case (s-exp->symbol (sx-ref sx 0))
|
(case (s-exp->symbol (sx-ref sx 0))
|
||||||
[(+) (plusE (px 1) (px 2))]
|
[(+) (plusE (px 1) (px 2))]
|
||||||
[(-) (minusE (px 1) (px 2))]
|
[(-) (minusE (px 1) (px 2))]
|
||||||
|
[(*) (timesE (px 1) (px 2))]
|
||||||
[(if0) (if0E (px 1) (px 2) (px 3))]
|
[(if0) (if0E (px 1) (px 2) (px 3))]
|
||||||
[else (parse-error sx)])]
|
[else (parse-error sx)])]
|
||||||
[else (parse-error sx)])))
|
[else (parse-error sx)])))
|
||||||
@ -116,6 +123,7 @@
|
|||||||
[(if0E test-expr then-expr else-expr)
|
[(if0E test-expr then-expr else-expr)
|
||||||
(interp test-expr env (doIfK then-expr else-expr env k))]
|
(interp test-expr env (doIfK then-expr else-expr env k))]
|
||||||
[(minus1E n) (interp n env (doMinus1K k))]
|
[(minus1E n) (interp n env (doMinus1K k))]
|
||||||
|
[(timesE l r) (interp l env (timesSecondK r env k))]
|
||||||
))
|
))
|
||||||
|
|
||||||
(define (continue [k : Continuation] [v : Value]) : Value
|
(define (continue [k : Continuation] [v : Value]) : Value
|
||||||
@ -131,6 +139,10 @@
|
|||||||
(continue next-k (arith-op - v1 v))]
|
(continue next-k (arith-op - v1 v))]
|
||||||
[(doMinus1K next-k)
|
[(doMinus1K next-k)
|
||||||
(continue next-k (arith-op - v (numV 1)))]
|
(continue next-k (arith-op - v (numV 1)))]
|
||||||
|
[(timesSecondK r env next-k)
|
||||||
|
(interp r env (doTimesK v next-k))]
|
||||||
|
[(doTimesK v1 next-k)
|
||||||
|
(continue next-k (arith-op * v1 v))]
|
||||||
[(appArgK arg-expr env next-k)
|
[(appArgK arg-expr env next-k)
|
||||||
(interp arg-expr env (doAppK v next-k))]
|
(interp arg-expr env (doAppK v next-k))]
|
||||||
[(doAppK fun-val next-k)
|
[(doAppK fun-val next-k)
|
||||||
|
Reference in New Issue
Block a user