Here is a more complex example of
:optimize '(optimize (speed 2) (space 2) (inhibit-warnings 2) (debug 1) (safety 0)) :optimize-interface '(optimize-interface (safety 1) (debug 1)) :context-declarations '(((:or :external (:and (:match "@%") (:match "SET"))) (declare (optimize-interface (safety 2)))) ((:or (:and :external :macro) (:match "$PARSE-")) (declare (optimize (safety 2)))))
declarations (see optimize-declaration) set up the global
compilation policy. The bodies of functions are to be compiled
completely unsafe (
safety 0), but argument count and weakened
argument type checking is to be done when a function is called
speed 2 safety 1).
The first declaration specifies that all functions that are external
or whose names contain both “
@%” and “
SET” are to be
compiled compiled with completely safe interfaces (
The reason for this particular
:match rule is that
inverse functions in this system tend to have both strings in their
name somewhere. We want
setf inverses to be safe because they
are implicitly called by users even though their name is not exported.
The second declaration makes external macros or functions whose names
start with “
PARSE-” have safe bodies (as well as interfaces).
This is desirable because a syntax error in a macro may cause a type
error inside the body. The
:match rule is used because macros
often have auxiliary functions whose names begin with this string.
This particular example is used to build part of the standard CMUCL
system. Note however, that context declarations must be set up
according to the needs and coding conventions of a particular system;
different parts of CMUCL are compiled with different context
declarations, and your system will probably need its own declarations.
In particular, any use of the
:match option depends on naming
conventions used in coding.