protect against read-time package-lock circumvention from LOCKED::(BAR)
[sbcl.git] / doc / manual / beyond-ansi.texinfo
1 @node  Beyond the ANSI Standard
2 @comment  node-name,  next,  previous,  up
3 @chapter Beyond the ANSI Standard
4
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}.
8
9 @menu
10 * Reader Extensions::
11 * Garbage Collection::
12 * Metaobject Protocol::
13 * Support For Unix::
14 * Customization Hooks for Users::
15 * Tools To Help Developers::
16 * Resolution of Name Conflicts::
17 * Hash Table Extensions::
18 * Miscellaneous Extensions::
19 * Stale Extensions::
20 * Efficiency Hacks::
21 @end menu
22
23 @node Reader Extensions
24 @comment  node-name,  next,  previous,  up
25 @section Reader Extensions
26 @cindex Reader Extensions
27
28 SBCL supports extended package prefix syntax, which allows specifying
29 an alternate package instead of @code{*package*} for the reader to use
30 as the default package for interning symbols:
31
32 @lisp
33 <package-name>::<form-with-interning-into-package>
34 @end lisp
35
36 Example:
37
38 @lisp
39   'foo::(bar quux zot) == '(foo::bar foo::quux foo::zot)
40 @end lisp
41
42 Doesn't alter @code{*package*}: if @code{foo::bar} would cause a
43 read-time package lock violation, so does @code{foo::(bar)}.
44
45 @node  Garbage Collection
46 @comment  node-name,  next,  previous,  up
47 @section Garbage Collection
48 @cindex Garbage collection
49
50 SBCL provides additional garbage collection functionality not
51 specified by ANSI.
52
53 @include var-sb-ext-star-after-gc-hooks-star.texinfo
54 @include fun-sb-ext-gc.texinfo
55
56 @subsection Finalization
57 @cindex Finalization
58
59 Finalization allows code to be executed after an object has been
60 garbage collected. This is useful for example for releasing foreign
61 memory associated with a Lisp object.
62
63 @include fun-sb-ext-finalize.texinfo
64 @include fun-sb-ext-cancel-finalization.texinfo
65
66 @subsection Weak Pointers
67 @cindex Weak pointers
68
69 Weak pointers allow references to objects to be maintained without
70 keeping them from being garbage collected: useful for building caches
71 among other things.
72
73 Hash tables can also have weak keys and values: @pxref{Hash Table
74 Extensions}.
75
76 @include fun-sb-ext-make-weak-pointer.texinfo
77 @include fun-sb-ext-weak-pointer-value.texinfo
78
79 @subsection Introspection and Tuning
80
81 @include var-sb-ext-star-gc-run-time-star.texinfo
82 @include fun-sb-ext-bytes-consed-between-gcs.texinfo
83 @include fun-sb-ext-dynamic-space-size.texinfo
84 @include fun-sb-ext-get-bytes-consed.texinfo
85 @include fun-sb-ext-gc-logfile.texinfo
86 @include fun-sb-ext-generation-average-age.texinfo
87 @include fun-sb-ext-generation-bytes-allocated.texinfo
88 @include fun-sb-ext-generation-bytes-consed-between-gcs.texinfo
89 @include fun-sb-ext-generation-minimum-age-before-gc.texinfo
90 @include fun-sb-ext-generation-number-of-gcs-before-promotion.texinfo
91 @include fun-sb-ext-generation-number-of-gcs.texinfo
92
93 @node Metaobject Protocol
94 @comment  node-name,  next,  previous,  up
95 @section Metaobject Protocol
96
97 @subsection AMOP Compatibility of Metaobject Protocol
98
99 SBCL supports a metaobject protocol which is intended to be compatible
100 with AMOP; present exceptions to this (as distinct from current bugs)
101 are:
102
103 @itemize
104
105 @item
106 @findex @sbmop{compute-effective-method}
107 @code{compute-effective-method} only returns one value, not two.
108
109 There is no record of what the second return value was meant to
110 indicate, and apparently no clients for it.
111
112 @item
113 @tindex @cl{generic-function}
114 @tindex @cl{standard-generic-function}
115 @tindex @sbmop{funcallable-standard-object}
116 @tindex @cl{standard-object}
117 @tindex @cl{function}
118 The direct superclasses of @code{sb-mop:funcallable-standard-object} are
119 @code{(function standard-object)}, not @code{(standard-object function)}.
120
121 This is to ensure that the @code{standard-object} class is the last of
122 the standardized classes before @code{t} appearing in the class
123 precedence list of @code{generic-function} and
124 @code{standard-generic-function}, as required by section 1.4.4.5 of the
125 ANSI specification.
126
127 @item
128 @findex @cl{ensure-generic-function}
129 @findex @sbmop{generic-function-declarations}
130 the arguments @code{:declare} and @code{:declarations} to
131 @code{ensure-generic-function} are both accepted, with the leftmost
132 argument defining the declarations to be stored and returned by
133 @code{generic-function-declarations}.
134
135 Where AMOP specifies @code{:declarations} as the keyword argument to
136 @code{ensure-generic-function}, the Common Lisp standard specifies
137 @code{:declare}.  Portable code should use @code{:declare}.
138
139 @item
140 @findex @sbmop{validate-superclass}
141 @findex @sbmop{finalize-inheritance}
142 @tindex @cl{standard-class}
143 @tindex @sbmop{funcallable-standard-class}
144 @tindex @cl{function}
145 @findex @sbmop{class-prototype}
146 although SBCL obeys the requirement in AMOP that
147 @code{validate-superclass} should treat @code{standard-class} and
148 @code{funcallable-standard-class} as compatible metaclasses, we
149 impose an additional requirement at class finalization time: a class
150 of metaclass @code{funcallable-standard-class} must have
151 @code{function} in its superclasses, and a class of metaclass
152 @code{standard-class} must not.
153
154 @findex @cl{typep}
155 @findex @cl{class-of}
156 @findex @cl{subtypep}
157 After a class has been finalized, it is associated with a class
158 prototype which is accessible by a standard mop function
159 @code{sb-mop:class-prototype}.  The user can then ask whether this
160 object is a @code{function} or not in several different ways: whether it
161 is a function according to @code{typep}; whether its @code{class-of} is
162 @code{subtypep} @code{function}, or whether @code{function} appears in
163 the superclasses of the class.  The additional consistency requirement
164 comes from the desire to make all of these answers the same.
165
166 The following class definitions are bad, and will lead to errors
167 either immediately or if an instance is created:
168 @lisp
169 (defclass bad-object (funcallable-standard-object)
170   ()
171   (:metaclass standard-class))
172 @end lisp
173 @lisp
174 (defclass bad-funcallable-object (standard-object)
175   ()
176   (:metaclass funcallable-standard-class))
177 @end lisp
178 The following definition is acceptable:
179 @lisp
180 (defclass mixin ()
181   ((slot :initarg slot)))
182 (defclass funcallable-object (funcallable-standard-object mixin)
183   ()
184   (:metaclass funcallable-standard-class))
185 @end lisp
186 and leads to a class whose instances are funcallable and have one slot.
187
188 @tindex @sbmop{funcallable-standard-object}
189 Note that this requirement also applies to the class
190 @code{sb-mop:funcallable-standard-object}, which has metaclass
191 @code{sb-mop:funcallable-standard-class} rather than
192 @code{standard-class} as AMOP specifies.
193
194 @item
195 the requirement that ``No portable class @math{C_p} may inherit, by
196 virtue of being a direct or indirect subclass of a specified class, any
197 slot for which the name is a symbol accessible in the
198 @code{common-lisp-user} package or exported by any package defined in
199 the ANSI Common Lisp standard.'' is interpreted to mean that the
200 standardized classes themselves should not have slots named by external
201 symbols of public packages.
202
203 The rationale behind the restriction is likely to be similar to the ANSI
204 Common Lisp restriction on defining functions, variables and types named
205 by symbols in the Common Lisp package: preventing two independent pieces
206 of software from colliding with each other.
207
208 @item
209 @findex @sbmop{slot-value-using-class}
210 @findex @setf{@sbmop{slot-value-using-class}}
211 @findex @sbmop{slot-boundp-using-class}
212 specializations of the @code{new-value} argument to @code{(setf
213 sb-mop:slot-value-using-class)} are not allowed: all user-defined
214 methods must have a specializer of the class @code{t}.
215
216 This prohibition is motivated by a separation of layers: the
217 @code{slot-value-using-class} family of functions is intended for use in
218 implementing different and new slot allocation strategies, rather than
219 in performing application-level dispatching.  Additionally, with this
220 requirement, there is a one-to-one mapping between metaclass, class and
221 slot-definition-class tuples and effective methods of @code{(setf
222 slot-value-using-class)}, which permits optimization of @code{(setf
223 slot-value-using-class)}'s discriminating function in the same manner as
224 for @code{slot-value-using-class} and @code{slot-boundp-using-class}.
225
226 Note that application code may specialize on the @code{new-value}
227 argument of slot accessors.
228
229 @item
230 @findex @cl{defclass}
231 @findex @sbmop{ensure-class}
232 @findex @sbmop{ensure-class-using-class}
233 @findex @cl{find-class}
234 @findex @cl{class-name}
235 the class named by the @code{name} argument to @code{ensure-class}, if
236 any, is only redefined if it is the proper name of that class;
237 otherwise, a new class is created.
238
239 This is consistent with the description of @code{ensure-class} in AMOP
240 as the functional version of @code{defclass}, which has this behaviour;
241 however, it is not consistent with the weaker requirement in AMOP, which
242 states that any class found by @code{find-class}, no matter what its
243 @code{class-name}, is redefined.
244
245 @end itemize
246
247 @subsection Metaobject Protocol Extensions
248
249 In addition, SBCL supports extensions to the Metaobject protocol from
250 AMOP; at present, they are:
251
252 @itemize
253
254 @item
255 @findex @cl{defmethod}
256 @findex @cl{find-class}
257 @findex @sbmop{intern-eql-specializer}
258 @findex @sbpcl{make-method-specializers-form}
259 @findex @sbmop{make-method-lambda}
260 compile-time support for generating specializer metaobjects from
261 specializer names in @code{defmethod} forms is provided by the
262 @code{make-method-specializers-form} function, which returns a form
263 which, when evaluated in the lexical environment of the
264 @code{defmethod}, returns a list of specializer metaobjects.  This
265 operator suffers from similar restrictions to those affecting
266 @code{make-method-lambda}, namely that the generic function must be
267 defined when the @code{defmethod} form is expanded, so that the
268 correct method of @code{make-method-specializers-form} is invoked.
269 The system-provided method on @code{make-method-specializers-form}
270 generates a call to @code{find-class} for each symbol specializer
271 name, and a call to @code{intern-eql-specializer} for each @code{(eql
272 @var{x})} specializer name.
273
274 @item
275 @findex @cl{find-method}
276 @findex @sbpcl{parse-specializer-using-class}
277 @findex @sbpcl{unparse-specializer-using-class}
278 run-time support for converting between specializer names and
279 specializer metaobjects, mostly for the purposes of
280 @code{find-method}, is provided by
281 @code{parse-specializer-using-class} and
282 @code{unparse-specializer-using-class}, which dispatch on their first
283 argument, the generic function associated with a method with the given
284 specializer.  The system-provided methods on those methods convert
285 between classes and proper names and between lists of the form
286 @code{(eql @var{x})} and interned eql specializer objects.
287
288 @item
289 @vindex @sbpcl{+slot-unbound+}
290 @findex @sbmop{standard-instance-access}
291 @findex @sbmop{funcallable-standard-instance-access}
292 distinguising unbound instance allocated slots from bound ones when
293 using @code{standard-instance-access} and
294 @code{funcallable-standard-instance-access} is possible by comparison
295 to the constant @code{+slot-unbound+}.
296
297 @end itemize
298
299 @node  Support For Unix
300 @comment  node-name,  next,  previous,  up
301 @section Support For Unix
302
303 @menu
304 * Command-line arguments::
305 * Querying the process environment::
306 * Running external programs::
307 @end menu
308
309 @node Command-line arguments
310 @subsection Command-line arguments
311 @vindex @sbext{@earmuffs{posix-argv}}
312
313 The UNIX command line can be read from the variable
314 @code{sb-ext:*posix-argv*}.
315
316 @node Querying the process environment
317 @subsection Querying the process environment
318
319 The UNIX environment can be queried with the
320 @code{sb-ext:posix-getenv} function.
321
322 @include fun-sb-ext-posix-getenv.texinfo
323
324 @node Running external programs
325 @subsection Running external programs
326
327 External programs can be run with @code{sb-ext:run-program}.
328 @footnote{In SBCL versions prior to 1.0.13, @code{sb-ext:run-program}
329 searched for executables in a manner somewhat incompatible with other
330 languages.  As of this version, SBCL uses the system library routine
331 @code{execvp(3)}, and no longer contains the function,
332 @code{find-executable-in-search-path}, which implemented the old
333 search.  Users who need this function may find it
334 in @file{run-program.lisp} versions 1.67 and earlier in SBCL's CVS
335 repository here
336 @url{http://sbcl.cvs.sourceforge.net/sbcl/sbcl/src/code/run-program.lisp?view=log}. However,
337 we caution such users that this search routine finds executables that
338 system library routines do not.}
339
340 @include fun-sb-ext-run-program.texinfo
341
342 When @code{sb-ext:run-program} is called with @code{wait} equal to
343 NIL, an instance of class @var{sb-ext:process} is returned.  The
344 following functions are available for use with processes:
345
346 @include fun-sb-ext-process-p.texinfo
347
348 @include fun-sb-ext-process-input.texinfo
349
350 @include fun-sb-ext-process-output.texinfo
351
352 @include fun-sb-ext-process-error.texinfo
353
354 @include fun-sb-ext-process-alive-p.texinfo
355
356 @include fun-sb-ext-process-status.texinfo
357
358 @include fun-sb-ext-process-wait.texinfo
359
360 @include fun-sb-ext-process-exit-code.texinfo
361
362 @include fun-sb-ext-process-core-dumped.texinfo
363
364 @include fun-sb-ext-process-close.texinfo
365
366 @include fun-sb-ext-process-kill.texinfo
367
368 @node  Customization Hooks for Users
369 @comment  node-name,  next,  previous,  up
370 @section Customization Hooks for Users
371
372 The toplevel repl prompt may be customized, and the function
373 that reads user input may be replaced completely.
374 @c <!-- FIXME but I don't currently remember how -->
375
376 The behaviour of @code{require} when called with only one argument is
377 implementation-defined.  In SBCL, @code{require} behaves in the
378 following way:
379
380 @include fun-common-lisp-require.texinfo
381 @include var-sb-ext-star-module-provider-functions-star.texinfo
382
383 Although SBCL does not provide a resident editor, the @code{ed}
384 function can be customized to hook into user-provided editing
385 mechanisms as follows:
386
387 @include fun-common-lisp-ed.texinfo
388 @include var-sb-ext-star-ed-functions-star.texinfo
389
390 Conditions of type @code{warning} and @code{style-warning} are
391 sometimes signaled at runtime, especially during execution of Common
392 Lisp defining forms such as @code{defun}, @code{defmethod}, etc.  To
393 muffle these warnings at runtime, SBCL provides a variable
394 @code{sb-ext:*muffled-warnings*}:
395
396 @include var-sb-ext-star-muffled-warnings-star.texinfo
397
398 @node Tools To Help Developers
399 @comment  node-name,  next,  previous,  up
400 @section Tools To Help Developers
401 @findex @cl{trace}
402 @findex @cl{inspect}
403
404 SBCL provides a profiler and other extensions to the ANSI @code{trace}
405 facility.  For more information, see @ref{Macro common-lisp:trace}.
406
407 The debugger supports a number of options. Its documentation is
408 accessed by typing @kbd{help} at the debugger prompt. @xref{Debugger}.
409
410 Documentation for @code{inspect} is accessed by typing @kbd{help} at
411 the @code{inspect} prompt.
412
413 @node Resolution of Name Conflicts
414 @section Resolution of Name Conflicts
415 @tindex @sbext{name-conflict}
416 @findex @sbext{name-conflict-symbols}
417
418 The ANSI standard (section 11.1.1.2.5) requires that name conflicts in
419 packages be resolvable in favour of any of the conflicting symbols.  In
420 the interactive debugger, this is achieved by prompting for the symbol
421 in whose favour the conflict should be resolved; for programmatic use,
422 the @code{sb-ext:resolve-conflict} restart should be invoked with one
423 argument, which should be a member of the list returned by the condition
424 accessor @code{sb-ext:name-conflict-symbols}.
425
426 @node    Hash Table Extensions
427 @comment  node-name,  next,  previous,  up
428 @section Hash Table Extensions
429 @cindex Hash tables
430
431 Hash table extensions supported by SBCL are all controlled by keyword
432 arguments to @code{make-hash-table}.
433
434 @include fun-common-lisp-make-hash-table.texinfo
435
436 @include macro-sb-ext-define-hash-table-test.texinfo
437
438 @include macro-sb-ext-with-locked-hash-table.texinfo
439
440 @include fun-sb-ext-hash-table-synchronized-p.texinfo
441
442 @include fun-sb-ext-hash-table-weakness.texinfo
443
444 @node    Miscellaneous Extensions
445 @comment  node-name,  next,  previous,  up
446 @section Miscellaneous Extensions
447
448 @include fun-sb-ext-array-storage-vector.texinfo
449 @include fun-sb-ext-delete-directory.texinfo
450 @include fun-sb-ext-get-time-of-day.texinfo
451 @include fun-sb-ext-seed-random-state.texinfo
452 @include macro-sb-ext-wait-for.texinfo
453
454 @node Stale Extensions
455 @comment  node-name,  next,  previous,  up
456 @section Stale Extensions
457
458 SBCL has inherited from CMUCL various hooks to allow the user to
459 tweak and monitor the garbage collection process. These are somewhat
460 stale code, and their interface might need to be cleaned up. If you
461 have urgent need of them, look at the code in @file{src/code/gc.lisp}
462 and bring it up on the developers' mailing list.
463
464 SBCL has various hooks inherited from CMUCL, like
465 @code{sb-ext:float-denormalized-p}, to allow a program to take
466 advantage of IEEE floating point arithmetic properties which aren't
467 conveniently or efficiently expressible using the ANSI standard. These
468 look good, and their interface looks good, but IEEE support is
469 slightly broken due to a stupid decision to remove some support for
470 infinities (because it wasn't in the ANSI spec and it didn't occur to
471 me that it was in the IEEE spec). If you need this stuff, take a look
472 at the code and bring it up on the developers' mailing
473 list.
474
475
476 @node  Efficiency Hacks
477 @comment  node-name,  next,  previous,  up
478 @section Efficiency Hacks
479
480 The @code{sb-ext:purify} function causes SBCL first to collect all
481 garbage, then to mark all uncollected objects as permanent, never again
482 attempting to collect them as garbage. This can cause a large increase
483 in efficiency when using a primitive garbage collector, or a more
484 moderate increase in efficiency when using a more sophisticated garbage
485 collector which is well suited to the program's memory usage pattern. It
486 also allows permanent code to be frozen at fixed addresses, a
487 precondition for using copy-on-write to share code between multiple Lisp
488 processes.  This is less important with modern generational garbage
489 collectors, but not all SBCL platforms use such a garbage collector.
490
491 @include fun-sb-ext-purify.texinfo
492
493 The @code{sb-ext:truly-the} special form declares the type of the
494 result of the operations, producing its argument; the declaration is
495 not checked. In short: don't use it.
496
497 @include special-operator-sb-ext-truly-the.texinfo
498
499 The @code{sb-ext:freeze-type} declaration declares that a
500 type will never change, which can make type testing
501 (@code{typep}, etc.) more efficient for structure types.