Read the lecture notes for background, and EOPL Chapter 7. Feel free to work from one of my solutions if you have trouble with yours.
You are to add an object system to an interpreter for a Scheme-like language. You might extend your first-order interpreter for part 1 of assignment 3, or the interpreter from assignment 7 (strip out the type checking). Environments should map variables to boxes. Other parts of the interpreter may be meta-circular or first-order as required. Support at least the following language:
e ::= n
| #t
| #f
| ()
| (quote x)
| x
| (if e e e)
| (begin e ...)
| (lambda (x ...) e)
| (let ((x e) ...) e)
| (letrec ((x f) ...) e)
| (set! x e)
| (e e ...)
| (class ((x e) ...) ((x e) ...) ((x (x ...) e) ...) e)
| (new e)
| (send e x e ...)
where n is a number, x is a
variable, f is a lambda expression,
and ... means zero or more of the previous
item.
The object facilities work as follows:
(class ((x e) ...) class variables and initial values
((x e) ...) instance variables and initial values
((x (y ...) e) ...) methods x with zero or more parameters y and body e
e) super class
(new e) create object of class e
(send e1 x e2 ...) send message x to object e1 with args e2 ...
Unlike the system presented in class, instance variables and
class variables from superclasses should be available for access or
mutation (via set!) in subclasses. You may wish to require that class
variables and instance variables have special names to distinguish
them from ordinary variables. Say, instance variable names start with
"$", and class variables with something else. (You'll find
symbol->string and string-ref to be useful procedures for this
purpose.) Declare the name noclass in your top-level
environment to be a class with no methods, so that classes without a
superclass can inherit from noclass. Methods should be
able to refer to this to access the current object.
Inheritance may be static or dynamic, your choice.
load's other than
cs441-load's and has no syntax errors. This file must
have three parts: