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);