Next: , Previous: Implementation Packages, Up: Package Lock Concepts


11.1.3 Package Lock Violations

11.1.3.1 Lexical Bindings and Declarations

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)))
11.1.3.2 Other Operations

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.