You may have guessed it: The whole set_pers_context business in the
first part of this mini-series
was actually a red herring. I promise I won't mislead you this time -
and I'll even reveal the reason why the series is titled "And...Action!"
No, we don't need contrived constructs like
(print extrude) to show that
extrude
is somehow... different from all the other kids. All we need is a simple experiment.
First, enter
extrude
in
CoCreate Modeling's user input line: The
Extrude dialog
unfolds in all its glory, and patiently awaits your input.
Now try the same with
print
: All you get is an uncooperative
"Lisp error: The variable PRINT is unbound". How disappointing.
But then, the behavior for
print
is expected, considering the usual
evaluation rules for Common Lisp,
particularly for symbols. As a quick reminder:
- If the symbol refers to a variable, the value of the variable is returned.
- If the symbol refers to a function and occurs in the first position of a list,
the function is executed.
extrude
& friends belong to the symbol jet-set in CoCreate Modeling. For them,
the usual evaluation rules for functions don't apply (pun intended).
Using
symbol properties
as markers, they carry a backstage pass and can party anywhere.
For members of the
extrude
posse, it doesn't really matter if you use them as an
atom, in the first position of a list, or anywhere else: In all cases, the function which
they refer to will be executed right away - by virtue of an extension to the evaluator
which is unique to CoCreate Modeling's implementation of Common Lisp.
You can create such upper-class symbols yourself - using a macro called
defaction
.
This macro is also unique to CoCreate Modeling. Functions
defined by
defaction
are called, you guessed it,
action routines.
But why, you ask, would I want such a feature, particularly if I know that it breaks with
established conventions for Lisp evaluation?
Well, precisely
because this feature breaks with the established rules.
To be continued...?