Another option is to have a class for Symbol that includes a slot for the global value. That would make lookup faster, but note that then we'd need a symbol table. Actually, we'd need one symbol table for each instance of the Scheme interpreter, and we'd need separate copies of every symbol in each instance. Because Vector is more powerful than is needed. Primitive is a Scheme primitive.
Closure is a user-defined function.
Macro is a subclass of Closure for doing macros. It has an expand method. JavaMethod encapsulates a Java Method. It would have been simpler to use Reader , but I wanted someplace to put the code for read , so I created a class. PrintWriter We could have had a class to hold the stringify method, but its not really necessary to have another class.