The process of evaluation in XLISP:
Strings, integers, characters, floats, objects, arrays, streams, subrs [built-in functions], fsubrs [special forms] and closures [user defined functions] evaluate to themselves.
Symbols act as variables and are evaluated by retrieving the value associated with their current binding.
Lists are evaluated by examining the first element of the list and then taking one of the following actions:
If it is a symbol, the functional binding of the symbol is retrieved.
If it is a lambda expression, a closure is constructed for the function described by the lambda expression.
If it is a subr [built-in function], fsubr [special form] or closure [user defined function], it stands for itself.
Any other value is an error.
Then, the value produced by the previous step is examined:
If it is a subr [built-in function] or closure [user defined function], the remaining list elements are evaluated and the subr [built-in function] or closure [user defined function] is called with these evaluated expressions as arguments.
If it is an fsubr [special form], the fsubr is called using the remaining list elements as arguments [unevaluated].
If it is a macro, the macro is expanded using the remaining list elements as arguments [unevaluated]. The macro expansion is then evaluated in place of the original macro call.