GOAL's
syntax resembles the Lisp dialect
Scheme, though with many idiosyncratic
object-oriented programming features such as
classes,
inheritance, and
virtual functions. GOAL encourages an
imperative programming style: programs tend to consist of a sequence of events to be executed rather than the
functional programming style of
functions to be evaluated recursively. This is a diversion from Scheme, which allows such
side effects but does not encourage imperative style. GOAL does not run in an
interpreter, but instead is
compiled directly into
PlayStation 2 machine code to execute. It offers limited facilities for
garbage collection, relying extensively on
runtime support. It offers dynamic memory allocation primitives designed to make it well-suited to running in constant
memory on a video game console. GOAL has extensive support for
inlined assembly language code using a special rlet form, allowing programs to freely mix assembly and higher-level constructs within one function. The GOAL compiler is implemented in
Allegro Common Lisp. It supports a long term compiling listener session which gives the compiler knowledge about the state of the compiled and thus running program, including the symbol table. This, in addition to dynamic linking, allows a function to be edited, recompiled, uploaded, and inserted into a running game without having to restart. The process is similar to the
edit and continue feature offered by some
C++ compilers, but allows programs to replace arbitrary amounts of code (even up to entire object files), and does not interrupt the running game with the debugger. This feature was used to implement code and to enable level streaming in the
Jak and Daxter games. == Uses ==