-
numbers
-
Same as before.
-
binary arithmetic operators
-
In place of having separate rules for +
and
-
, define a single syntactic rule for binary arithmetic
operators. Parse these into a binop
datatype variant.
Define a table that maps operator names (symbols) to actual
functions (Scheme procedures) that perform the corresponding
operation. For now, define multiplication and division also (using
*
and /
to represent them in the source).
Having a single rule like this, accompanied by a table, makes your
language easier to extend: once you have modified your parser and
interpreter once to support binary operators, you won't need to
touch either one to add any number of new ones.
-
multi-armed
with
-
Implement a multi-armed with
. Each identifier bound by
the with
is bound only in the body of the
with
expression. There will be zero or more
identifiers bound by each with
. Syntax:
{with {{<id> <expr>}
{<id> <expr>}
...}
<expr>}
-
conditionals
-
Add if0
using the syntax described in class. This
saves the bother of adding boolean values and operators over them.
Note that if0
has three branches: a test expression, a
"then" expression which evaluates if the test expression evaluates
to 0
, and an "else" expression that evaluates
otherwise.
-
multi-argument
fun
-
Change the datatype so that a function has a list of arguments, not
just one. All arguments to the function evaluate in the same
environment. You may assume that the number of arguments in a
function invocation matches the number in the procedure definition.
-
multi-armed
rec
-
Using the datatype definition of environments, implement a
multi-armed rec
construct. Each named expression can
access all the identifiers bound by the rec
. The named
expressions must all syntactically be functions. There will be zero
or more identifiers bound by each rec
. Syntax:
{rec {{<id> {fun {<id>} <expr>}}
{<id> {fun {<id>} <expr>}}
...}
<expr>}
Example:
{with {{true 1}
{false 0}}
{rec {{odd? {fun {n}
{if0 n
false
{even? {- n 1}}}}}
{even? {fun {n}
{if0 n
true
{odd? {- n 1}}}}}}
{odd? 5}}}
should evaluate to
1
representing truth.