DrRacket

profileReham123
homework_3.pdf

Homework 3

Functions that Accept Multiple Arguments

Start with the F1WAE interpreter (WITHOUT deferred substitution), 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. Yourinterp 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, yourparse-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.

If the list of definitions contains multiple definitions for the same function, use just the first one (ignoring the others).

Remember that the PLAI language provides the following useful function:

• map—takes a function and a list, and applies the function to each element in the list, returning a list of results. For example, if sexps is a list of S- expressions to parse, (map parse sexps) produces a list ofFnWAEs by parsing each S-expression.

-­‐  Test  cases  for  every  possible  right  solution  are  required