1 @node Beyond the ANSI Standard
2 @comment node-name, next, previous, up
3 @chapter Beyond the ANSI Standard
5 SBCL is derived from CMUCL, which implements many extensions to the
6 ANSI standard. SBCL doesn't support as many extensions as CMUCL, but
7 it still has quite a few. @xref{Contributed Modules}.
10 * Garbage Collection::
11 * Metaobject Protocol::
13 * Customization Hooks for Users::
14 * Tools To Help Developers::
15 * Resolution of Name Conflicts::
20 @node Garbage Collection
21 @comment node-name, next, previous, up
22 @section Garbage Collection
24 SBCL provides additional garbage collection functionality not
25 specified by ANSI. Weak pointers allow references to objects to be
26 maintained without keeping them from being garbage collected, and
27 ``finalization'' hooks are available to cause code to be executed when
28 an object has been garbage collected. Additionally users can specify
29 their own cleanup actions to be executed with garbage collection.
31 @include fun-sb-ext-finalize.texinfo
32 @include fun-sb-ext-cancel-finalization.texinfo
33 @include fun-sb-ext-make-weak-pointer.texinfo
34 @include fun-sb-ext-weak-pointer-value.texinfo
35 @include var-sb-ext-star-after-gc-hooks-star.texinfo
37 @node Metaobject Protocol
38 @comment node-name, next, previous, up
39 @section Metaobject Protocol
41 SBCL supports a metaobject protocol which is intended to be compatible
42 with AMOP; present exceptions to this (as distinct from current bugs)
49 the abstract @code{metaobject} class is not present in the class
53 @findex compute-effective-method
54 @findex sb-mop:compute-effective-method
55 @code{compute-effective-method} only returns one value, not two;
59 @findex sb-mop:compute-slots
60 @tindex funcallable-standard-class
61 the system-supplied @code{:around} method for @code{compute-slots}
62 specialized on @code{funcallable-standard-class} does not respect the
63 requested order from a user-supplied primary method.
66 @findex ensure-generic-function
67 @findex generic-function-declarations
68 @findex sb-mop:generic-function-declarations
69 the arguments @code{:declare} and @code{:declarations} to
70 @code{ensure-generic-function} are both accepted, with the leftmost
71 argument defining the declarations to be stored and returned by
72 @code{generic-function-declarations}.
76 @node Support For Unix
77 @comment node-name, next, previous, up
78 @section Support For Unix
80 The UNIX command line can be read from the variable
81 @code{sb-ext:*posix-argv*}. The UNIX environment can be queried with
82 the @code{sb-ext:posix-getenv} function.
84 @include fun-sb-ext-posix-getenv.texinfo
87 @node Customization Hooks for Users
88 @comment node-name, next, previous, up
89 @section Customization Hooks for Users
91 The toplevel repl prompt may be customized, and the function
92 that reads user input may be replaced completely.
93 @c <!-- FIXME but I don't currently remember how -->
95 The behaviour of @code{require} when called with only one argument is
96 implementation-defined. In SBCL, @code{require} behaves in the
99 @include fun-common-lisp-require.texinfo
100 @include var-sb-ext-star-module-provider-functions-star.texinfo
102 Although SBCL does not provide a resident editor, the @code{ed}
103 function can be customized to hook into user-provided editing
104 mechanisms as follows:
106 @include fun-common-lisp-ed.texinfo
107 @include var-sb-ext-star-ed-functions-star.texinfo
109 @node Tools To Help Developers
110 @comment node-name, next, previous, up
111 @section Tools To Help Developers
113 SBCL provides a profiler and other extensions to the ANSI @code{trace}
114 facility. For more information, see @ref{Macro common-lisp:trace}.
116 The debugger supports a number of options. Its documentation is
117 accessed by typing @kbd{help} at the debugger prompt. @xref{Debugger}.
119 Documentation for @code{inspect} is accessed by typing @kbd{help} at
120 the @code{inspect} prompt.
122 @node Resolution of Name Conflicts
123 @section Resolution of Name Conflicts
125 The ANSI standard (section 11.1.1.2.5) requires that name conflicts in
126 packages be resolvable in favour of any of the conflicting symbols. In
127 the interactive debugger, this is achieved by prompting for the symbol
128 in whose favour the conflict should be resolved; for programmatic use,
129 the @code{sb-ext:resolve-conflict} restart should be invoked with one
130 argument, which should be a member of the list returned by the condition
131 accessor @code{sb-ext:name-conflict-symbols}.
133 @node Stale Extensions
134 @comment node-name, next, previous, up
135 @section Stale Extensions
137 SBCL has inherited from CMUCL various hooks to allow the user to
138 tweak and monitor the garbage collection process. These are somewhat
139 stale code, and their interface might need to be cleaned up. If you
140 have urgent need of them, look at the code in @file{src/code/gc.lisp}
141 and bring it up on the developers' mailing list.
143 SBCL has various hooks inherited from CMUCL, like
144 @code{sb-ext:float-denormalized-p}, to allow a program to take
145 advantage of IEEE floating point arithmetic properties which aren't
146 conveniently or efficiently expressible using the ANSI standard. These
147 look good, and their interface looks good, but IEEE support is
148 slightly broken due to a stupid decision to remove some support for
149 infinities (because it wasn't in the ANSI spec and it didn't occur to
150 me that it was in the IEEE spec). If you need this stuff, take a look
151 at the code and bring it up on the developers' mailing
155 @node Efficiency Hacks
156 @comment node-name, next, previous, up
157 @section Efficiency Hacks
159 The @code{sb-ext:purify} function causes SBCL first to collect all
160 garbage, then to mark all uncollected objects as permanent, never again
161 attempting to collect them as garbage. This can cause a large increase
162 in efficiency when using a primitive garbage collector, or a more
163 moderate increase in efficiency when using a more sophisticated garbage
164 collector which is well suited to the program's memory usage pattern. It
165 also allows permanent code to be frozen at fixed addresses, a
166 precondition for using copy-on-write to share code between multiple Lisp
167 processes. This is less important with modern generational garbage
168 collectors, but not all SBCL platforms use such a garbage collector.
170 @include fun-sb-ext-purify.texinfo
172 The @code{sb-ext:truly-the} special form declares the type of the
173 result of the operations, producing its argument; the declaration is
174 not checked. In short: don't use it.
176 @include special-operator-sb-ext-truly-the.texinfo
178 The @code{sb-ext:freeze-type} declaration declares that a
179 type will never change, which can make type testing
180 (@code{typep}, etc.) more efficient for structure types.
182 The @code{sb-ext:constant-function} declaration specifies
183 that a function will always return the same value for the same
184 arguments, which may allow the compiler to optimize calls
185 to it. This is appropriate for functions like @code{sqrt}, but
186 is @emph{not} appropriate for functions like @code{aref},
187 which can change their return values when the underlying data are
189 @c <!-- FIXME: This declaration does not seem to be supported in the
190 @c current compiler. -->