The declaration (
is
ignored.DYNAMIC-EXTENT
variable
...)
The type declarations (
and TYPE
type
variable
...)(
are ignored by both the interpreter and the compiler.
Use FTYPE
type
function
...)CHECK-TYPE
to force type checks.
Rationale. When these declarations lie and a compiler respects them, the generated code often results in a hard crash (segmentation fault).
SPECIAL
Declaration EXT:NOTSPECIAL
. Declarations (
and PROCLAIM
'(SPECIAL
variable
))DEFCONSTANT
are undone by the (
declaration. This declaration can be used only in
global PROCLAIM
'(EXT:NOTSPECIAL
variable
))PROCLAIM
and DECLAIM
forms, not in local DECLARE
forms.
You cannot expect miracles: functions compiled before
the EXT:NOTSPECIAL
proclamation was issued will still be treating variable
as
special even after the EXT:NOTSPECIAL
proclamation. See also
Section 3.2.2.3, “Semantic Constraints sec_3-2-2-3”.
Function EXT:SPECIAL-VARIABLE-P
. You can use the function (
to check whether the EXT:SPECIAL-VARIABLE-P
symbol
&OPTIONAL
environment
)symbol
is a
dynamic variable. environment
of NIL
or omitted means use the global environment.
You can also obtain the current lexical environment using the macro
EXT:THE-ENVIRONMENT
(interpreted code only).
This function will always return T
for global special
variables and constant variables.
EXT:CONSTANT-NOTINLINE
Constants defined by DEFCONSTANT
but proclaimed EXT:CONSTANT-NOTINLINE
will not be inlined by the compiler. This is useful for variables
which remain constant within an a single Lisp process but may vary
between processes and machines (such as endianness or word size) thus
they should be written to #P".fas"
s as symbols, not values.
CONSTANTP
Function CONSTANTP
fully complies with [ANSI CL standard].
Additionally, some non-trivial forms are identified as constants, e.g.,
(
returns CONSTANTP
'(+
1 2 3))T
.
Since DEFCONSTANT
initial value forms are not
evaluated at compile time, CONSTANTP
will not report T
of their
name within the same compilation unit for the null lexical environment.
This is consistent and matches questionable code using the pattern
(
.
Use IF
(CONSTANTP
form
) (EVAL
form
))EVAL-WHEN
if you need recognition and the value during
compile-time. See also Section 31.11.5, “Macro EXT:COMPILE-TIME-VALUE
”.
SAFETY
Declaration (
results in “safe” compiled code: function calls are never
eliminated. This guarantees the semantics described in
[sec_3-5].
OPTIMIZE
(SAFETY
3))
(COMPILE)
The declaration (COMPILE)
has the effect that the current
form is compiled prior to execution. Examples:
(LOCALLY
(DECLARE
(compile))form
)
executes the compiled version of form
.
(LET
((x 0)) (FLET
((inc () (DECLARE
(compile)) (INCF
x)) (dec () (DECF
x))) (VALUES
#'inc #'dec)))
returns two functions. The first is compiled and increments x
, the
second is interpreted (slower) and decrements the same x
.
This declaration can also be used to name the resulting compiled closure:
(LAMBDA
(x) (DECLARE
(compile ident)) x) ⇒(
#<
COMPILED-FUNCTION
IDENT>FUNCTION-LAMBDA-EXPRESSION
*
) ⇒; source is not preserved ⇒
NIL
⇒
T
IDENT
(FBOUNDP
'ident) ⇒; sic!
NIL
SPACE
The declaration determines what metadata is recorded in the function object:
These notes document CLISP version 2.49.93+ | Last modified: 2018-02-19 |