Due: Friday, January 27th, 2012, noon
Start with the F1WAE interpreter, and extend the implementation to support any number of arguments to a function (including zero), and any number of arguments (including zero) in a function application:
<FunDef> = {deffun {<id> <id>*} <FnWAE>} <FnWAE> = <number> | {+ <FnWAE> <FnWAE>} | {- <FnWAE> <FnWAE>} | {with {<id> <FnWAE>} <FnWAE>} | <id> | {<id> <FnWAE>*}
Since you must change the F1WAE datatype, and since different people may change it in different ways, you must provide a parse function this time, which accepts a quoted expression and produces an FnWAE value. For parsing, assume that any symbol other than '+, '-, or 'with can be a function name for a function call. Also, you must provide a parse-defn function that takes one (quoted) deffun form and produces a FunDef value.
At run-time, a new error is now possible: function application with the wrong number of arguments. Your interp function should detect the mismatch and report an error that includes the words "wrong arity".
Some examples:
(test (interp (parse '{f 1 2}) (list (parse-defn '{deffun {f x y} {+ x y}}))) 3) (test (interp (parse '{+ {f} {f}}) (list (parse-defn '{deffun {f} 5}))) 10) (test/exn (interp (parse '{f 1}) (list (parse-defn '{deffun {f x y} {+ x y}}))) "wrong arity")
A function would be ill-defined if two of its argument <id>s were the same. To prevent this problem, your parse-defn function should detect this problem and reports a "bad syntax" error. For example, (parse-defn '{deffun {f x x} x}) should report a "bad syntax" error, while (parse-defn '{deffun {f x y} x}) should produce a FunDef value.
Remember that the PLAI language provides the following useful function:
Last update: Friday, February 17th, 2012robby@eecs.northwestern.edu |