summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
76b9a80)
Fix PFD "Setting + in the REPL when the form being evaluated aborts"
sbcl-devel 2004-12-12
... PFD's interpretation is both the most obvious and the most
useful (if three history variables is "useful"), but not
widely subscribed to. Let's see if SBCL can act as social
pressure!
(Also largely cosmetic updates to package-lock documentation)
locksing support.
The interface described here is experimental: incompatible changes in
locksing support.
The interface described here is experimental: incompatible changes in
-future SBCL releases are possible, even expected: most notably the
-consept of implementation packages and the associated operators may be
-renamed.
+future SBCL releases are possible, even expected: the concept of
+``implementation packages'' and the associated operators may be renamed;
+more operations (such as naming restarts or catch tags) may be added to
+the the list of operations violating package locks.
@menu
* Package Lock Concepts::
@menu
* Package Lock Concepts::
@comment node-name, next, previous, up
@subsection Package Locking Overview
@comment node-name, next, previous, up
@subsection Package Locking Overview
-Package locks protect against unintentional modifications of a
-package: they provide similar protection to user packages as is
-mandated to @code{common-lisp} package by the ANSI specification. They
-are not, and should not be used as a security measure.
+Package locks protect against unintentional modifications of a package:
+they provide similar protection to user packages as is mandated to
+@code{common-lisp} package by the ANSI specification. They are not, and
+should not be used as, a security measure.
Newly created packages are by default unlocked (see the @code{:lock}
option to @code{defpackage}).
Newly created packages are by default unlocked (see the @code{:lock}
option to @code{defpackage}).
@node Implementation Packages
@subsection Implementation Packages
@node Implementation Packages
@subsection Implementation Packages
+@vindex *package*
+@findex defpackage
Each package has a list of associated implementation packages. A
locked package, and the symbols whose home package it is, can be
Each package has a list of associated implementation packages. A
locked package, and the symbols whose home package it is, can be
@node Package Lock Violations
@subsection Package Lock Violations
@node Package Lock Violations
@subsection Package Lock Violations
+@tindex sb-ext:package-lock-violation
+@tindex sb-ext:package-locked-error
+@tindex sb-ext:symbol-package-locked-error
+@tindex package-lock-violation
+@tindex package-locked-error
+@tindex symbol-package-locked-error
+@tindex package-error
If an operation violates a package lock, a continuable error that is
of a subtype of @code{sb-ext:package-lock-violation} (subtype of
If an operation violates a package lock, a continuable error that is
of a subtype of @code{sb-ext:package-lock-violation} (subtype of
@subsection Package Locks in Compiled Code
@subsubsection Lexical bindings and declarations
@subsection Package Locks in Compiled Code
@subsubsection Lexical bindings and declarations
+@findex let
+@findex let*
+@findex flet
+@findex labels
+@findex macrolet
+@findex symbol-macrolet
+@findex declare
+@cindex Declarations
+@findex sb-ext:disable-package-locks
+@findex sb-ext:enable-package-locks
+@findex disable-package-locks
+@findex enable-package-locks
Compiling lexical binding constructs or lexical declarations that
violate package locks causes a compile-time package-lock violation. A
Compiling lexical binding constructs or lexical declarations that
violate package locks causes a compile-time package-lock violation. A
@subsubsection Interned symbols
@subsubsection Interned symbols
-If compiled code contains interned symbols, then loading that code
+If file-compiled code contains interned symbols, then loading that code
into an image without the said symbols will not cause a package lock
into an image without the said symbols will not cause a package lock
-violation even if the packages in question are locked.
+violation, even if the packages in question are locked.
@subsubsection Other limitations on compiled code
@subsubsection Other limitations on compiled code
spurious package-lock-violations at runtime even if the packages are
unlocked.
spurious package-lock-violations at runtime even if the packages are
unlocked.
-In practise all this means that package-locks have a neglible
+In practice all this means that package-locks have a neglible
performance penalty in compiled code as long as they are not violated.
@node Operations Violating Package Locks
performance penalty in compiled code as long as they are not violated.
@node Operations Violating Package Locks
@subsubsection Operations on Packages
@subsubsection Operations on Packages
-Following actions cause a package lock violation if the package
+The following actions cause a package lock violation if the package
operated on is locked, and @code{*package*} is not an implementation
package of that package, and the action would cause a change in the
operated on is locked, and @code{*package*} is not an implementation
package of that package, and the action would cause a change in the
-state of the package (eg. exporting already external symbols is
-allowed). Package lock violations caused by these operations signal
-errors of type @code{sb-ext:package-locked-error}.
+state of the package (so e.g. exporting already external symbols is
+never a violation). Package lock violations caused by these operations
+signal errors of type @code{sb-ext:package-locked-error}.
-;; Packages FOO and BAR are locked.
-;;
-;; Two lexically apparent violated packages: exactly two
-;; package-locked-errors will be signalled.
+;;; Packages FOO and BAR are locked.
+;;;
+;;; Two lexically apparent violated packages: exactly two
+;;; package-locked-errors will be signalled.
(defclass foo:point ()
((x :accessor bar:x)
(defclass foo:point ()
((x :accessor bar:x)
Syntax: @code{(sb-ext:enable-package-locks symbol*)}
Syntax: @code{(sb-ext:enable-package-locks symbol*)}
-Re-enables package locks affecting the named symbols during
-compilation in the lexical scope of the declaration. Enabling locks
-that were not first disabled with @code{sb-ext:disable-package-locks}
-declararion, or enabling locks that are already enabled has no effect.
+Re-enables package locks affecting the named symbols during compilation
+in the lexical scope of the declaration. Enabling locks that were not
+first disabled with @code{sb-ext:disable-package-locks} declararion, or
+enabling locks that are already enabled has no effect.
@end deftp
@include condition-sb-ext-package-lock-violation.texinfo
@include condition-sb-ext-package-locked-error.texinfo
@include condition-sb-ext-symbol-package-locked-error.texinfo
@end deftp
@include condition-sb-ext-package-lock-violation.texinfo
@include condition-sb-ext-package-locked-error.texinfo
@include condition-sb-ext-symbol-package-locked-error.texinfo
-@defun sb-ext:package-locked-error-symbol @var{symbol-package-locked-error}
+@defun sb-ext:package-locked-error-symbol symbol-package-locked-error
Returns the symbol that caused the @code{symbol-package-locked-error}
condition.
Returns the symbol that caused the @code{symbol-package-locked-error}
condition.
@include macro-sb-ext-without-package-locks.texinfo
@include macro-sb-ext-with-unlocked-packages.texinfo
@include macro-sb-ext-without-package-locks.texinfo
@include macro-sb-ext-with-unlocked-packages.texinfo
-@defmac defpackage name [[@var{option}]]* @result{} package
+@defmac defpackage name [[option]]* @result{} package
Options are extended to include the following:
Options are extended to include the following:
"Evaluate FORM, returning whatever it returns and adjusting ***, **, *,
+++, ++, +, ///, //, /, and -."
(setf - form)
"Evaluate FORM, returning whatever it returns and adjusting ***, **, *,
+++, ++, +, ///, //, /, and -."
(setf - form)
- (let ((results (multiple-value-list (eval form))))
- (setf /// //
- // /
- / results
- *** **
- ** *
- * (car results)))
- (setf +++ ++
- ++ +
- + -)
+ (unwind-protect
+ (let ((results (multiple-value-list (eval form))))
+ (setf /// //
+ // /
+ / results
+ *** **
+ ** *
+ * (car results)))
+ (setf +++ ++
+ ++ +
+ + -))
(unless (boundp '*)
;; The bogon returned an unbound marker.
;; FIXME: It would be safer to check every one of the values in RESULTS,
(unless (boundp '*)
;; The bogon returned an unbound marker.
;; FIXME: It would be safer to check every one of the values in RESULTS,
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)