This homework is due October 5, 8:00 AM.
Start with an interpreter from HW 4.1 that supports multiple arguments to functions and function calls, and extend the implementation to support if0 and multiple mutually recursive bindings:
<RCFAE> = <number> | {+ <RCFAE> <RCFAE>} | {- <RCFAE> <RCFAE>} | <id> | {fun {<id>*} <RCFAE>} | {<RCFAE> <RCFAE>*} | {if0 <RCFAE> <RCFAE> <RCFAE>} | {rec {{<id> <RCFAE>}*} <RCFAE>}
Assume that each argument <id> is distinct for a rec expression.
As in HW 4, provide a parse function and a interp-expr function:
;; All the tests from HW 4.1, plus.. (test (interp-expr (parse '{if0 0 1 2})) 1) (test (interp-expr (parse '{if0 {+ 1 0} 1 2})) 2) (test (interp-expr (parse '{if0 0 {fun {x} {+ x 1}} {fun {x} {+ x 2}}})) 'function) (test (interp-expr (parse '{{if0 0 {fun {x} {+ x 1}} {fun {x} {+ x 2}}} 32})) 33) (test (interp-expr (parse '{rec {{even {fun {x} {if0 x 1 {odd {- x 1}}}}} {odd {fun {x} {if0 x 0 {even {- x 1}}}}}} {even 10}})) 1) (test (interp-expr (parse '{rec {{f {fun {x} {h x}}} {g {fun {x} {f x}}} {h {fun {x} {g x}}}} f})) 'function)
This exercise is optional, for extra credit.
Implement a compile-expr function that takes an RCFAE and produces a CRCFAE, which is like RCFAE except that all binding names are removed, and each bound identifier is replaced by a number. Since a fun can take any number of arguments, a compiled fun must record the number of expected arguments:
<CRCFAE> = <number> | {+ <CRCFAE> <CRCFAE>} | {- <CRCFAE> <CRCFAE>} | {at <number>} | {fun <number> <RCFAE>} | {<CRCFAE> <CRCFAE>*} | {if0 <CRCFAE> <CRCFAE> <CRCFAE>} | {rec {<RCFAE>*} <RCFAE>}
(You do not need a parser for CRCFAEs. The above grammar is merely to clarify the content of a compiled expression.)
In addition to compile-expr, provide cinterp-expr, which interprets the result of compile-expr and produces a number or 'function:
(test (cinterp-expr (compile-expr (parse '{{fun {x y} {- y x}} 10 12}))) 2) (test (cinterp-expr (compile-expr (parse '{fun {} 12}))) 'function) ;; etc.
Last update: Wednesday, November 23rd, 2005mflatt@cs.utah.edu |