Lexical bindings or declarations that violate package locks cause
result in a program-error
being signalled at when the form that
violates package locks would be executed.
A complete listing of operators affect by this is: let
,
let*
, flet
, labels
, macrolet
, and
symbol-macrolet
, declare
.
Package locks affecting both lexical bindings and declarations can be
disabled locally with sb-ext:disable-package-locks
declaration,
and re-enabled with sb-ext:enable-package-locks
declaration.
Example:
(in-package :locked) (defun foo () ...) (defmacro with-foo (&body body) `(locally (declare (disable-package-locks locked:foo)) (flet ((foo () ...)) (declare (enable-package-locks locked:foo)) ; re-enable for body ,@body)))
If an non-lexical operation violates a package lock, a continuable
error that is of a subtype of sb-ext:package-lock-violation
(subtype of package-error
) is signalled when the operation is
attempted.
Additional restarts may be established for continuable package lock violations for interactive use.
The actual type of the error depends on circumstances that caused the
violation: operations on packages signal errors of type
sb-ext:package-locked-error
, and operations on symbols signal
errors of type sb-ext:symbol-package-locked-error
.