The abstract Expression class represents partially processed expressions.
These are in principle independent of the source language,
though there are still some Scheme assumptions wired in.
class Expression
{ ...;
public abstract Object eval
(Environment e);
public abstract void compile
(Compilation comp, Target targ);
}
The eval method evaluates the
Expression in the given
Environment.
The compile method is called when we are compiling
the body of a procedure. It is responsible for generating bytecodes
that evaluate the expression, and leave the result in a result
specified by the Target parameter.
This is usually the Java evaluation stack,
but we will go into more detail later.
class QuoteExp extends Expression
{ ...;
Object value;
public QuoteExp(Object val)
{ value = val; }
public Object eval(Environment env)
{ return value; }
public void compile
(Compilation comp, Target target)
{ comp.compileConstant (value, target); }
}
A QuoteExp represents a literal (self-evaluating form),
or a quoted form.
class ReferenceExp extends Expression
{ ...;
Symbol symbol;
Declaration binding;
}
A ReferenceExp is a reference to a named variable.
The symbol is the source form identifier.
If binding is non-null, it is the lexical
binding of the identifier.
class ApplyExp extends Expression
{ ...;
Expression func;
Expression[] args;
}
An ApplyExp is an application of a procedure func
to an argument list args.
class ScopeExp extends Expression
{ ...;
ScopeExp outer; // Surrounding scope.
public Declaration add_decl(Symbol name)
{ ...Create new local variable... }
}
A ScopeExp is a abstract class that represents a lexical
scoping construct. Concrete sub-classes are LetExp
(used for a let binding form) and LambdaExp.
class LambdaExp extends ScopeExp
{ ...;
Symbol name; // Optional.
Expression body;
int min_args;
int max_args;
}
The Scheme primitive syntax lambda is translated
into a LambdaExp, which represents anonymous procedures.
Each LambdaExp is compiled into a different bytecoded class.
Invoking eval causes the LambdaExp to be compiled
into a class, the class to be loaded, an instance of the
class to be created, and the result coerced to a Procedure.
Other sub-classes of Expression are
IfExp (used for conditional expressions);
BeginExp (used for compound expressions);
SetExp (used for assignments); and
ErrorExp (used where a syntax error was found);