2 @comment node-name, next, previous, up
4 @cindex Packages, locked
6 None of the following sections apply to SBCL built without package
9 The interface described here is experimental: incompatible changes in
10 future SBCL releases are possible, even expected: the concept of
11 ``implementation packages'' and the associated operators may be renamed;
12 more operations (such as naming restarts or catch tags) may be added to
13 the list of operations violating package locks.
16 * Package Lock Concepts::
17 * Package Lock Dictionary::
20 @node Package Lock Concepts
21 @section Package Lock Concepts
24 * Package Lock Overview::
25 * Implementation Packages::
26 * Package Lock Violations::
27 * Package Locks in Compiled Code::
28 * Operations Violating Package Locks::
31 @node Package Lock Overview
32 @comment node-name, next, previous, up
33 @subsection Package Locking Overview
35 Package locks protect against unintentional modifications of a package:
36 they provide similar protection to user packages as is mandated to
37 @code{common-lisp} package by the ANSI specification. They are not, and
38 should not be used as, a security measure.
40 Newly created packages are by default unlocked (see the @code{:lock}
41 option to @code{defpackage}).
43 The package @code{common-lisp} and SBCL internal implementation
44 packages are locked by default, including @code{sb-ext}.
46 It may be beneficial to lock @code{common-lisp-user} as well, to
47 ensure that various libraries don't pollute it without asking,
48 but this is not currently done by default.
50 @node Implementation Packages
51 @subsection Implementation Packages
52 @vindex @cl{@earmuffs{package}}
53 @findex @cl{defpackage}
55 Each package has a list of associated implementation packages. A
56 locked package, and the symbols whose home package it is, can be
57 modified without violating package locks only when @code{*package*} is
58 bound to one of the implementation packages of the locked package.
60 Unless explicitly altered by @code{defpackage},
61 @code{sb-ext:add-implementation-package}, or
62 @code{sb-ext:remove-implementation-package} each package is its own
63 (only) implementation package.
65 @node Package Lock Violations
66 @subsection Package Lock Violations
67 @tindex @sbext{package-lock-violation}
68 @tindex @sbext{package-locked-error}
69 @tindex @sbext{symbol-package-locked-error}
70 @tindex @cl{package-error}
72 @subsubsection Lexical Bindings and Declarations
78 @findex @cl{symbol-macrolet}
81 @findex @sbext{disable-package-locks}
82 @findex @sbext{enable-package-locks}
84 Lexical bindings or declarations that violate package locks cause a
85 compile-time warning, and a runtime @code{program-error} when the form
86 that violates package locks would be executed.
88 A complete listing of operators affect by this is: @code{let},
89 @code{let*}, @code{flet}, @code{labels}, @code{macrolet}, and
90 @code{symbol-macrolet}, @code{declare}.
92 Package locks affecting both lexical bindings and declarations can be
93 disabled locally with @code{sb-ext:disable-package-locks} declaration,
94 and re-enabled with @code{sb-ext:enable-package-locks} declaration.
103 (defmacro with-foo (&body body)
104 `(locally (declare (disable-package-locks locked:foo))
106 (declare (enable-package-locks locked:foo)) ; re-enable for body
110 @subsubsection Other Operations
112 If an non-lexical operation violates a package lock, a continuable
113 error that is of a subtype of @code{sb-ext:package-lock-violation}
114 (subtype of @code{package-error}) is signalled when the operation is
117 Additional restarts may be established for continuable package lock
118 violations for interactive use.
120 The actual type of the error depends on circumstances that caused the
121 violation: operations on packages signal errors of type
122 @code{sb-ext:package-locked-error}, and operations on symbols signal
123 errors of type @code{sb-ext:symbol-package-locked-error}.
126 @node Package Locks in Compiled Code
127 @subsection Package Locks in Compiled Code
129 @subsubsection Interned Symbols
131 If file-compiled code contains interned symbols, then loading that code
132 into an image without the said symbols will not cause a package lock
133 violation, even if the packages in question are locked.
135 @subsubsection Other Limitations on Compiled Code
137 With the exception of interned symbols, behaviour is unspecified if
138 package locks affecting compiled code are not the same during loading
139 of the code or execution.
141 Specifically, code compiled with packages unlocked may or may not fail
142 to signal package-lock-violations even if the packages are locked at
143 runtime, and code compiled with packages locked may or may not signal
144 spurious package-lock-violations at runtime even if the packages are
147 In practice all this means that package-locks have a negligible
148 performance penalty in compiled code as long as they are not violated.
150 @node Operations Violating Package Locks
151 @subsection Operations Violating Package Locks
153 @subsubsection Operations on Packages
155 The following actions cause a package lock violation if the package
156 operated on is locked, and @code{*package*} is not an implementation
157 package of that package, and the action would cause a change in the
158 state of the package (so e.g. exporting already external symbols is
159 never a violation). Package lock violations caused by these operations
160 signal errors of type @code{sb-ext:package-locked-error}.
164 Shadowing a symbol in a package.
167 Importing a symbol to a package.
170 Uninterning a symbol from a package.
173 Exporting a symbol from a package.
176 Unexporting a symbol from a package.
179 Changing the packages used by a package.
189 @subsubsection Operations on Symbols
191 Following actions cause a package lock violation if the home package
192 of the symbol operated on is locked, and @code{*package*} is not an
193 implementation package of that package. Package lock violations caused
194 by these action signal errors of type
195 @code{sb-ext:symbol-package-locked-error}.
197 These actions cause only one package lock violation per lexically
198 apparent violated package.
203 ;;; Packages FOO and BAR are locked.
205 ;;; Two lexically apparent violated packages: exactly two
206 ;;; package-locked-errors will be signalled.
208 (defclass foo:point ()
210 (y :accessor bar:y)))
215 Binding or altering its value lexically or dynamically, or
216 establishing it as a symbol-macro.
222 If the symbol is not defined as a constant, global symbol-macro or a
223 global dynamic variable, it may be lexically bound or established as a
227 If the symbol is defined as a global dynamic variable, it may be
233 Defining, undefining, or binding it, or its setf name as a function.
239 If the symbol is not defined as a function, macro, or special operator
240 it and its setf name may be lexically bound as a function.
245 Defining, undefining, or binding it as a macro or compiler macro.
251 If the symbol is not defined as a function, macro, or special operator
252 it may be lexically bound as a macro.
257 Defining it as a type specifier or structure.
260 Defining it as a declaration with a declaration proclamation.
263 Declaring or proclaiming it special.
266 Declaring or proclaiming its type or ftype.
272 If the symbol may be lexically bound, the type of that binding may be
276 If the symbol may be lexically bound as a function, the ftype of that
277 binding may be declared.
282 Defining a setf expander for it.
285 Defining it as a method combination type.
288 Using it as the class-name argument to setf of find-class.
291 Defining it as a hash table test using @code{sb-ext:define-hash-table-test}.
295 @node Package Lock Dictionary
296 @section Package Lock Dictionary
298 @deffn {Declaration} @sbext{disable-package-locks}
300 Syntax: @code{(sb-ext:disable-package-locks symbol*)}
302 Disables package locks affecting the named symbols during compilation
303 in the lexical scope of the declaration. Disabling locks on symbols
304 whose home package is unlocked, or disabling an already disabled lock,
308 @deffn {Declaration} @sbext{enable-package-locks}
310 Syntax: @code{(sb-ext:enable-package-locks symbol*)}
312 Re-enables package locks affecting the named symbols during compilation
313 in the lexical scope of the declaration. Enabling locks that were not
314 first disabled with @code{sb-ext:disable-package-locks} declaration, or
315 enabling locks that are already enabled has no effect.
318 @include condition-sb-ext-package-lock-violation.texinfo
319 @include condition-sb-ext-package-locked-error.texinfo
320 @include condition-sb-ext-symbol-package-locked-error.texinfo
322 @defun @sbext{package-locked-error-symbol} symbol-package-locked-error
324 Returns the symbol that caused the @code{symbol-package-locked-error}
328 @include fun-sb-ext-package-locked-p.texinfo
329 @include fun-sb-ext-lock-package.texinfo
330 @include fun-sb-ext-unlock-package.texinfo
331 @include fun-sb-ext-package-implemented-by-list.texinfo
332 @include fun-sb-ext-package-implements-list.texinfo
333 @include fun-sb-ext-add-implementation-package.texinfo
334 @include fun-sb-ext-remove-implementation-package.texinfo
335 @include macro-sb-ext-without-package-locks.texinfo
336 @include macro-sb-ext-with-unlocked-packages.texinfo
338 @defmac @cl{defpackage} name [[option]]* @result{} package
340 Options are extended to include the following:
344 @code{:lock} @var{boolean}
346 If the argument to @code{:lock} is @code{t}, the package is initially
347 locked. If @code{:lock} is not provided it defaults to @code{nil}.
350 @code{:implement} @var{package-designator}*
352 The package is added as an implementation package to the packages
353 named. If @code{:implement} is not provided, it defaults to the
360 (defpackage "FOO" (:export "BAR") (:lock t) (:implement))
361 (defpackage "FOO-INT" (:use "FOO") (:implement "FOO" "FOO-INT"))
365 (defpackage "FOO") (:export "BAR"))
367 (remove-implementation-package "FOO" "FOO")
368 (defpackage "FOO-INT" (:use "BAR"))
369 (add-implementation-package "FOO-INT" "FOO")