| Allegro CL version 8.2 Minimal update since 8.2 release. |
As with all compiler switch variables, the value of this variable
can be t
, nil
, or a
function object that accepts five arguments and returns t
or nil
. The arguments
passed to the function will be the values of the safety, space, speed,
debug, and compilation-speed optimization qualities, in that order. nil
is equivalent to a function that always returns
nil
and t
to a
function that always returns t
. When the
value is a function and we say t
(or true) or
nil
(or false) in the text below, we mean
that the function returns, respectively, t
or
nil
.
Code compiled with this switch true will have additional runtime type checking done of any lambda or let bindings of a declared variable and any setqs to that variable to ensure that the value is of the correct type. If the variable is bound to an inappropriate value, a continuable type-error is generated.
The declared types are checked in the following three places:
Further:
comp:verify-type-declarations-switch
must return true at the point of the binding or set. Like
comp:trust-declarations-switch
, a
declaration at the beginning of a lambda or let form has a
scope which includes the bindings of the lambda/let variables
to be bound.
As we note below, in the default this switch is true when safety is greater than 1. Speed 3/Safety 2, used in this example, makes this switch and the various trust-* switches true in the default.
cl-user(1): (compile (defun foo (x y) (declare (optimize (speed 3) (safety 2)) (integer x)) (setq x y) (let ((z x)) (declare (fixnum z)) z))) foo nil nil cl-user(2): (foo 10 20) 20 cl-user(3): (foo 10 (1+ most-positive-fixnum)) Error: about to bind z to 536870912, which is not of type (integer -536870912 536870911). [condition type: type-error] Restart actions (select using :continue): 0: store the value anyway. 1: Return to Top Level (an "abort" restart). 2: Abort entirely from this (lisp) process. [1] cl-user(4): :cont 536870912 cl-user(5): (foo 10 20.0) Error: about to setq x to 20.0, which is not of type (integer * *). [condition type: type-error] Restart actions (select using :continue): 0: store the value anyway. 1: Return to Top Level (an "abort" restart). 2: Abort entirely from this (lisp) process. [1] cl-user(6): :res cl-user(7): (foo 10.0 20) Error: about to bind function argument x to 10.0, which is not of type (integer * *). [condition type: type-error] Restart actions (select using :continue): 0: store the value anyway. 1: Return to Top Level (an "abort" restart). 2: Abort entirely from this (lisp) process. [1] cl-user(8):
Initially true if safety is greater than 1. This means that (optimize
(speed 3) (safety 2)) is (with default values) the only safety/speed
combination that turns on both this switch and trust-declarations-switch
and trust-dynamic-extent-declarations-switch
.
See compiling.htm for information on the compiler.
Copyright (c) 1998-2016, Franz Inc. Oakland, CA., USA. All rights reserved.
This page is new in the 8.2 release.
Created 2016.6.21.
| Allegro CL version 8.2 Minimal update since 8.2 release. |