DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T l

⟦5a9ebc31c⟧ TextFile

    Length: 53249 (0xd001)
    Types: TextFile
    Names: »lispref-7«

Derivation

└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89
    └─⟦c06c473ab⟧ »./UNRELEASED/lispref.tar.Z« 
        └─⟦1b57a2ffe⟧ 
            └─⟦this⟧ »lispref-7« 

TextFile

Info file: lispref,    -*-Text-*-
produced by texinfo-format-buffer
from file: lispref.texinfo









This file documents GNU Emacs Lisp.

This is Edition 0.1 Beta of the GNU Emacs Lisp Reference Manual, for
Emacs Version 18, with some references to Emacs Version 19.

Please read this document for review purposes.

Published by the Free Software Foundation, 675 Massachusetts Avenue,
Cambridge, MA 02139 USA

Copyright (C) 1989 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation
approved by the Foundation.



▶1f◀
File: lispref  Node: Function Forms, Prev: Classifying Lists, Up: Nonempty List Forms, Next: Macro Forms

Evaluation of Function Forms
----------------------------

  If the first element of a list being evaluated is a Lisp function
object or primitive function object, then that form is called a
"function call".  For example, this is a call to the function `+':

     (+ 1 x)

  When a function call is evaluated, first the elements of the rest of
the list are evaluated in the order they appear.  Then the function is
called with this list of arguments, effectively using the function
`apply' to do this (*Note Calling Functions::).  If the function is
written in Lisp, the arguments are used to bind the parameter variables
of the function (*Note Lambda Expressions::); then the forms in the
function body are evaluated in order, and the result of the last one is
used as the value of the function call.

▶1f◀
File: lispref  Node: Macro Forms, Prev: Function Forms, Up: Nonempty List Forms, Next: Special Forms

Lisp Macro Evaluation
---------------------

  If the first element of a list being evaluated is a macro object, then
that form is called a "macro call".

  When a macro call is evaluated, the elements of the rest of the list
are *not* initially evaluated; instead, these elements themselves are
used as the arguments of the macro.  The macro definition computes a
replacement form, called the "expansion" of the macro.  Then the
expansion is evaluated in place of the original form.  The expansion may
be any sort of form; a self-evaluating constant, a symbol or a list.  If
the expansion is itself a macro call, this process of expansion repeats
until some other sort of form results.

  Normally, the argument expressions are not evaluated as part of
computing the macro expansion, but instead appear as part of the
expansion.  So they are evaluated when the expansion is evaluated.

  For example, given a macro defined as follows:

     (defmacro cadr (x)
       (list 'car (list 'cdr x)))

an expression such as `(cadr (assq 'handler list))' is a macro call, and
its expansion is:

     (car (cdr (assq 'handler list)))

Note that the argument `(assq 'handler list)' appears in the expansion,
as usual.

*Note Macros::, for the complete description of Emacs Lisp macros.

▶1f◀
File: lispref  Node: Special Forms, Prev: Macro Forms, Up: Nonempty List Forms, Next: Autoloading

Special Forms
-------------

  A "special form" is a primitive function specially marked so that its
arguments are not all evaluated.  Special forms define control
structures or perform variable bindings---things which functions cannot
do.

  Each special form has its own rules for which arguments are evaluated
and which are used without evaluation.  Sometimes, whether a particular
argument is evaluated depends on the results of evaluating other
arguments.

  Here is a list, in alphabetical order, of all of the special forms in
Emacs Lisp with a reference to where each is described.

`and'
     *Note Combining Conditions::
`catch'
     *Note Catch and Throw::
`cond'
     *Note Conditionals::
`condition-case'
     *Note Errors::
`defvar'
     *Note Global Variables::
`defmacro'
     *Note Defining Macros::
`defun'
     *Note Defining Functions::
`defvar'
     *Note Defining Variables::
`if'
     *Note Conditionals::
`function'
     *Note Anonymous Functions::
`interactive'
     *Note Interactive Call::
`let'
     *Note Local Variables::
`let*'
     *Note Local Variables::
`or'
     *Note Combining Conditions::
`progn'
     *Note Sequencing::
`prog1'
     *Note Sequencing::
`prog2'
     *Note Sequencing::
`quote'
     *Note Quoting::
`save-excursion'
     *Note Excursions::
`save-restriction'
     *Note Clipping Restrictions::
`save-window-excursion'
     *Note Window Configurations::
`setq'
     *Note Setting Variables::
`setq-default'
     *Note Buffer Local Variables::
`unwind-protect'
     *Note Nonlocal Exits::
`while'
     *Note Iteration:: `with-output-to-temp-buffer' *Note Temporary
Displays:: Common Lisp Note: Here are some comparisons of special
     forms in GNU Emacs Lisp and Common Lisp: `setq', `if', and `catch'
     are special forms in both Emacs Lisp and Common Lisp.  `defun' is a
     special form in Emacs Lisp, but a macro in Common Lisp.
     `save-excursion' is a special form in Emacs Lisp, but doesn't exist
     in Common Lisp.  `throw' is a special form in Common Lisp (because
     it must be able to throw multiple values), but it is a function in
     Emacs Lisp (which doesn't have multiple values).

▶1f◀
File: lispref  Node: Autoloading, Prev: Special Forms, Up: Nonempty List Forms

Autoloading
-----------

  The "autoload" feature allows you to call a function or macro whose
function definition has not yet been loaded into Emacs.  When an
autoload object appears as a symbol's function definition and that
symbol is used as a function, Emacs will automatically install the real
definition and its other associated code, and then call that definition.
(*Note Autoload::.)

▶1f◀
File: lispref  Node: Quoting, Prev: Forms, Up: Evaluation

Quoting
=======

  The special form `quote' returns its single argument ``unchanged''.

* Special form: quote OBJECT

     This special form returns OBJECT, without evaluating it.  This
     allows symbols and lists, which would normally be evaluated, to be
     included literally in a program.  (It is not necessary to quote
     numbers, strings, and vectors since they are self-evaluating.)  Use
     `function' instead of `quote' when quoting lambda expressions
     (*Note Anonymous Functions::).

     Because `quote' is used so often in programs, a convenient read
     syntax is defined.  An apostrophe character (`'') followed by a
     form expands to a list whose first element is `quote', and whose
     second element is the form.

          (quote (+ 1 2))
               => (+ 1 2)
          (quote foo)
               => foo
          'foo
               => foo
          ''foo
               => (quote foo)
          '(quote foo)
               => (quote foo)
          ['foo]
               => [(quote foo)]


▶1f◀
File: lispref  Node: Loading, Prev: Evaluation, Up: Top, Next: Byte Compilation

Loading
*******

  Loading a file of Lisp code means bringing the program into the Lisp
environment in the form of Lisp objects.  Emacs finds and opens the
file, reads the contents of the file, evaluates each form within it, and
then closes the file.

  Thus, the load functions evaluate all the expressions in a file just
as the `eval-current-buffer' function evaluates all the expressions in a
buffer.  The difference is that the load functions read and evaluate the
text in the file as found on disk, not the text in an Emacs buffer.

  The loaded file must contain Lisp expressions, either as source code
or, optionally, as byte-compiled code.  Each form in the file is called
a "top-level form".  There is no special format for the forms in a
loadable file; any form in a file may equally well be typed directly
into a buffer and evaluated there.  (Indeed, most code is tested this
way.)  Most often, the forms in a load file are function and variable
definitions.

* Menu:

* Loading Libraries::		Files containing code are called libraries.
* How Programs do Loading::
* Autoload::    
* Features::    

▶1f◀
File: lispref  Node: Loading Libraries, Prev: Loading, Up: Loading, Next: How Programs do Loading

Lisp Libraries and Loading
==========================

  A file containing Lisp code is often called a "library".  Thus, the
`Rmail library' is a file containing code for reading mail.  Similarly,
a `Lisp library directory' is a directory of files containing Lisp code.

  You may load a file more than once in an Emacs session.  For example,
after you have rewritten and reinstalled a function definition by
editing it in a buffer, you may wish to return to the original version;
you can do this by reloading the file in which it is located.

  However, when you load or re-load files, bear in mind that the `load'
and `load-library' functions automatically load a byte-compiled file
rather than a non-compiled file of similar name.  If you rewrite a file
that you intend to save and reinstall, remember to byte-compile it if
necessary; otherwise you may find yourself inadvertently reloading the
older, byte-compiled file instead of your newer, non-compiled file!

  There are several interface functions for loading.  For example, the
`autoload' function creates a Lisp object that loads a file when it is
evaluated (*Note Autoload::).  `require' also causes automatic loading
(*Note Features::).  Ultimately, all these facilities call the `load'
function to do the work.

  Any errors that are encountered while loading a file cause `load' to
abort.  If the load was done for the sake of `autoload', certain kinds
of top-level forms, those which define functions, are undone.

  To learn how `load' is used to build Emacs, *Note Building Emacs::.

▶1f◀
File: lispref  Node: How Programs do Loading, Prev: Loading Libraries, Up: Loading, Next: Autoload

How Programs do Loading
=======================

* Function: load FILENAME &optional MISSING-OK NOMESSAGE NOSUFFIX

       This function finds and opens a file of Lisp code, executes all
     the forms in it, and closes the file.

       To find the file, 
       `load' first looks for a file named `FILENAME.elc', that is, for
     a file whose name has `.elc' appended.  If such a file exists, it
     is loaded.  But if there is no file by that name, then `load' looks
     for a file whose name has `.el' appended.  If that file exists, it
     is loaded.  Finally, if there is no file by either name, `load'
     looks for a file named FILENAME with nothing appended, and loads it
     if it exists.  (The `load' function is not clever about looking at
     FILENAME.  In the perverse case of a file named `foo.el.el',
     evaluation of `(load "foo.el")' will indeed find it.)

       If the optional argument NOSUFFIX is non-`nil', then the suffixes
     `.elc' and `.el' are not tried.  In this case, the filename must be
     specified precisely.

       If FILENAME is a relative path, such as `foo.bar' or
     `baz/foo.bar', Emacs searches for the file using the variable
     `load-path'.  Emacs does this by appending the relative path to
     each of the directories listed in `load-path', and loading the
     first file it finds whose name matches.  The current working
     directory is tried only if it is specified in `load-path', where it
     is represented as `nil'.

       When FILENAME is a relative file name, all three possible
     filenames are tried in the first directory in `load-path', then all
     three in the second directory in `load-path', etc.

       Messages like `Loading foo.el ...' and `Loading foo.el ...  done'
     are printed in the echo area while loading unless NOMESSAGE is
     non-`nil'.

       The error `file-error' is signaled (with `Cannot open load file
     FILENAME') if no file is found.  No error is signaled if MISSING-OK
     is non-`nil'---then `load' just returns `nil'.

       `load' returns `t' if the file loads successfully.


* User Option: load-path

       The value of this global variable is a list of directories to
     search when loading files with `load'.  Each element is a string
     (which must be a directory name) or `nil' (which stands for the
     current working directory).  The value of `load-path' is
     initialized from the environment variable `EMACSLOADPATH', if it
     exists; otherwise it is set to the default specified in
     `emacs/src/paths.h' when Emacs is built.

       The syntax of `EMACSLOADPATH' is the same as that of `PATH';
     fields are separated by `:', and `.' is used for the current
     working directory.  Here is an example of how to set your
     `EMACSLOADPATH' variable from a `.login' file:

          setenv EMACSLOADPATH .:/user/liberte/emacs:/usr/local/lib/emacs/lisp

       Here is an example of code you can place in a `.emacs' file to
     add several directories to the front of your default `load-path':

          (setq load-path
                (append
                 (list nil
                       "/user/liberte/emacs/"
                       "/usr/local/lib/emacs/local")
                 load-path))

     In this example, the current working directory is placed first,
     followed by `/user/liberte/emacs/' and
     `/usr/local/lib/emacs/local'.

* Variable: load-in-progress

       This global variable is non-`nil' if Emacs is in the process of
     loading a file, and it is `nil' otherwise.  This is how `autoload'
     determines whether a load is in progress.

▶1f◀
File: lispref  Node: Autoload, Prev: How Programs do Loading, Up: Loading, Next: Features

Autoload
========

  The "autoload" feature allows you to call a function or macro whose
function definition has not yet been loaded into Emacs.  An attempt to
call the symbol while its definition is an autoload-object will
automatically install the real definition and its other associated code,
and then call the real definition.

  To prepare a function or macro for autoloading, you must call
`autoload' on it, specifying the function name and the name of the file
to be loaded.  This is usually done when Emacs is first built, by files
such as `emacs/lisp/loaddefs.el'.

  The following example shows how `dired' is prepared for autoloading in
`loaddefs.el':

     (autoload 'dired "dired"
       "\                            ; (`loaddefs.el' uses special
     \"Edit\" directory DIRNAME.     ; formatting conventions.)
       ...
       t)

  Calling `autoload' creates an `autoload object' containing the name of
the file and some other information, and makes this the definition of
the specified symbol.  When you later try to call that symbol as a
function or macro, the file is loaded; the loading should redefine that
symbol with its proper definition.  After the file completes loading,
the function or macro is called as if it had been there originally.

  If a Lisp function or macro is not redefined by loading the file, the
error `error' is signaled (with data `"Autoloading failed to define
function FUNCTION-NAME"'.

  The autoloaded file may, of course, contain other definitions and may
require or provide one or more features.  If the file is not completely
loaded (due to some error in the evaluation of the contents) any
function definitions or `provide' calls that occurred during the load
are undone.  This is to ensure that another `autoload' attempt will
result from the next attempt to call the autoloading function.

* Function: autoload SYMBOL FILENAME &optional DOCSTRING INTERACTIVE MACRO

       This function defines the function (or macro) named SYMBOL so as
     to load automatically from FILENAME.  FILENAME is a file name which
     will be passed to `load' when the function is called.

       DOCSTRING is the documentation string for the function.
     Normally, this is the same string that is in the function
     definition itself.  This makes it possible for you to look at the
     documentation without loading the file.

       If INTERACTIVE is non-`nil', then the function can be called
     interactively.  This lets completion in `M-x' work without loading
     the symbol's definition.  The complete interactive specification
     need not be given here.  If MACRO is non-`nil', then the function
     is really a macro.

       If SYMBOL already has a non-`nil' function cell that is not an
     `autoload' definition, `autoload' does nothing and returns `nil'.
     If the function cell of SYMBOL is void, it is set to an `autoload'
     object that looks like this:

          (autoload FILENAME DOCSTRING INTERACTIVE MACRO)

       For example,

          (symbol-function 'run-prolog)
               => (autoload "prolog" 169681 t nil)

     In this case, `prolog' is the name of the file to load, 169681 is
     the reference to the documentation string in the `emacs/etc/DOC'
     file, `t' means the function is interactive, and `nil' that it is
     not a macro.

▶1f◀
File: lispref  Node: Features, Prev: Autoload, Up: Loading

Features
========

  `provide' and `require' are another way to load files automatically
besides `autoload', by named features.  While autoloading is tied to
particular functions, features are loaded whenever another program says
they are needed, but never more than once in a session.

  The use of named features simplifies the task of determining whether
required definitions have been defined.  A feature name stands for a
collection of functions, variables, etc.  A program that needs the
collection may ensure that they are defined by "requiring" the feature.
If the file that contains the feature has not yet been loaded, then it
will be loaded (or an error will be signaled if it cannot be loaded).
The file thus loaded must "provide" the required feature or an error
will be signaled.

  To require the presence of a feature, call `require' with the name of
the feature.  `require' looks in the global variable `features' to see
whether the desired feature has been provided already.  If not, it loads
the associated file.  The file that contains the feature should call
`provide' at the top-level to add the feature to `features' once it is
loaded.

  Features are normally named after the files they are provided in so
that `require' need not be given the file name.

  For example, in `emacs/lisp/prolog.el', the definition for
`run-prolog' includes the following code:

     (interactive)
     (require 'shell)
     (switch-to-buffer (make-shell "prolog" "prolog"))
     (inferior-prolog-mode))

The expression `(require 'shell)' means that if the `shell' file has not
yet been loaded, it will be loaded.  This ensures that `make-shell' is
defined.

Also, the `emacs/lisp/shell.el' file contains the following top-level
expression:

     (provide 'shell)

This adds `shell' to the global `features' list when the `shell' file is
loaded, so that `(require 'shell)' will know that nothing needs to be
done.  (The order of the elements in the `features' list is not
significant.)

  When `require' is used at top-level in a file, it takes effect if you
byte-compile that file (*Note Byte Compilation::).  This is in case the
required package required contains macros that the byte-compiler must
know about.

  Although top-level calls to `require' are evaluated during the
byte-compilation, `provide' calls are not.  Therefore, you can ensure
that a file of definitions is loaded before it is byte-compiled by
including a `provide' followed by a `require' for the same feature, as
in the following example.

     (provide 'my-feature)  ; ignored by byte compiler, evaluated by load
     (require 'my-feature)  ; evaluated by byte compiler

* Function: provide FEATURE

       This function announces that FEATURE is now loaded (or will be as
     soon as this load is done) in the current Emacs session.  This
     means that the facilities associated with FEATURE are available for
     other Lisp programs.

       The FEATURE is added to the front of the list `features' if it is
     not already in the list.  FEATURE must be a symbol.  `provide'
     returns FEATURE.

          features
               => (bar bish)

          (provide 'foo)
               => foo
          features
               => (foo bar bish)

* Function: require FEATURE &optional FILENAME

       This function looks to see if FEATURE is present in the current
     Emacs session (i.e., `(featurep FEATURE)' is true).  If it is not,
     then `require' loads FILENAME with `load'.  If FILENAME is not
     supplied, then FEATURE is used as the file name to load.

       If FEATURE is not provided after the file has been loaded, Emacs
     will signal the error `error' (with data `Required feature FEATURE
     was not provided').

* Function: featurep FEATURE

       This function returns `t' if FEATURE has been provided in the
     current Emacs session (i.e., FEATURE is a member of `features'.)

* Variable: features

       The value of this global variable is a list of symbols which are
     the features loaded in the current Emacs session.  Each symbol was
     put in this list with a call to `provide'.


▶1f◀
File: lispref  Node: Byte Compilation, Prev: Loading, Up: Top, Next: Debugging

Byte Compilation
****************

  GNU Emacs Lisp has a compiler which translates functions from
lambda-expressions into a special form called "byte code" which can be
executed more efficiently.  The compiler replaces each function
definition with byte code.  When a byte code file is called, its
definition is then evaluated by the "byte code interpreter".

  Because the byte compiled code is evaluated by the byte-code
interpreter, instead of being executed directly by the machine's
hardware (as true compiled code is), byte-code is completely
transportable from machine to machine without re-compilation.  But it is
not as fast as true compiled code.

* Menu:

* Compilation Functions::       Byte compilation functions.
* Disassembly::                 Disassembled byte code

▶1f◀
File: lispref  Node: Compilation Functions, Prev: Byte Compilation, Up: Byte Compilation, Next: Disassembly

The Compilation Functions
=========================

  An individual function or macro definition may be byte-compiled with
the `byte-compile' function.  A whole file may be byte-compiled with
`byte-compile-file' and several files may be byte-compiled with
`byte-recompile-directory' or `batch-byte-compile'.  Only `defun' and
`defmacro' forms in a file are byte-compiled; other top-level forms are
unaltered byte-compilation.

  Be careful when byte compiling code that uses macros since macro calls
are expanded when they are compiled and therefore the macros must
already be defined for proper compilation.  For more details, *Note
Macros::.

  While byte-compiling a file, any `require' calls at top-level are
executed.  This is one way to ensure that required macro definitions are
available during compilation: require the file that defines them.  *Note
Features::.

  A byte compiled function is not as efficient as a primitive function
written in C, but it will run much faster than the interpreted version.
As a rough comparison, consider the example below:

     (defun silly-loop (n)
       "Return time before and after N iterations of a loop."
       (let ((t1 (current-time-string)))
         (while (> (setq n (1- n)) 
                   0))
         (list t1 (current-time-string))
         ))
          => silly-loop

     (silly-loop 100000)
          => ("Thu Jan 12 20:18:38 1989" 
             "Thu Jan 12 20:19:29 1989")  ; 51 secconds

     (byte-compile 'silly-loop)
          => [Compiled code not shown]

     (silly-loop 100000)
          => ("Thu Jan 12 20:21:04 1989" 
         "Thu Jan 12 20:21:17 1989")  ; 13 seconds

  In this example, the interpreted code required 51 seconds to run,
whereas the byte compiled code required 13 seconds.  These results are
representative, but there will be great variability depending upon the
specific functions called.

* Function: byte-compile SYMBOL

       This function byte-compiles the function definition of SYMBOL,
     replacing the previous definition with the compiled one.  The
     function definition of SYMBOL must be the actual code for the
     function; i.e., the compiler will not follow indirection to another
     symbol.  `byte-compile' does not compile macros.

       The `byte-compile' function is not autoloaded as are
     `byte-compile-file' and `byte-recompile-directory'.

          (defun factorial (integer)
            "Compute factorial of INTEGER."
            (if (= 1 integer) 1
              (* integer (factorial (1- integer)))))
               => factorial

          (byte-compile 'factorial)
               => (lambda (integer) 
                           "Compute factorial of INTEGER." 
                           (byte-code "\301^HU\203
                           ^@\301\202^Q^@\302^H\303^HS!\"\207"
                                      [integer 1 * factorial] 4))

* Command: byte-compile-file FILENAME

       This function compiles a file of Lisp code named FILENAME into a
     file of byte code.  The output file's name is made by appending `c'
     to the end of FILENAME.

       Each form in the input file read.  If it returns a function or
     macro, the compiled function or macro definition is written out.
     Other forms are copied in unchanged.  All comments are discarded.

       When called interactively, this command prompts you for the
     filename.

          % ls -l push*
          -rw-r--r--  1 lewis    0             791 Oct  5 20:31 push.el

          (byte-compile-file "~/emacs/push.el")
               => t

          % ls -l push*
          -rw-r--r--  1 lewis    0             791 Oct  5 20:31 push.el
          -rw-rw-rw-  1 lewis    0             638 Oct  8 20:25 push.elc

* Command: byte-recompile-directory DIRECTORY FLAG

       This function recompiles every `.el' file in DIRECTORY that needs
     recompilation.  A file needs recompilation if a `.elc' file exists
     but is older than the `.el' file.

       If a `.el' file exists, but there is no corresponding `.elc'
     file, then FLAG is examined.  If it is `nil', the file is ignored.
     If it is non-`nil', the user is asked if the file should be
     compiled.

* Function: batch-byte-compile

       This function runs `byte-compile-file' on the files remaining on
     the command line.  This function must be used only in a batch
     execution of Emacs, as it kills Emacs on completion.  Each file
     will be processed, even if an error occurs while compiling a
     previous file.  (The file with the error will not produce any
     compiled code, of course.)

          % emacs -batch -f batch-byte-compile *.el

* Function: byte-code CODE-STRING DATA-VECTOR MAX-STACK

       This is the function that actually interprets the byte code.  A
     byte-compiled function is actually defined with a body that calls
     `byte-code'.  Don't call this function yourself!

▶1f◀
File: lispref  Node: Disassembly, Prev: Compilation Functions, Up: Byte Compilation

Dissassembled Byte Code
=======================

  People never write byte code; that job is left to the byte compiler.
But a disassembler has been provided to satisfy a cat-like curiosity.
The disassembler converts the byte-compiled code into a humanly readable
form.

  The byte code interpreter is implemented as a very simple stack
machine.  Values get stored by being pushed onto the stack, and are
popped off and manipulated, the results being pushed back onto the
stack.  When a function returns, the top of the stack is popped and
returned as the value of the fucntion.

  In addition to the stack, variables bound in the environment can also
hold values during execution.  The values of such variables can be
pushed onto the stack, or the variables can be set by popping the stack.

* Function: disassemble OBJECT &optional STREAM

       This function prints the disassembled code for OBJECT.  If STREAM
     is supplied, then output goes there.  Otherwise, the disassembled
     code is printed to the standard output.  OBJECT can be a function
     name or a lambda expression.

  Here are two examples of using the `disassemble' function.  The
comments added to the examples do not appear in the output of
`disassemble'.

     (defun factorial (integer)
       "Compute factorial of an integer."
       (if (= 1 integer) 1
         (* integer (factorial (1- integer)))))
          => factorial

     (factorial 4)
          => 24

     (disassemble 'factorial)
          => byte code for factorial:
      doc: Compute factorial of an integer.
      args: (integer)

     0   constant 1              ; push 1 onto stack

     1   varref   integer        ; get value of `integer' from the environment
                                 ;     and push the value onto the stack

     2   eqlsign                 ; pop top two values off stack,
                                 ;     compare them,
                                 ;     and push result onto stack

     3   goto-if-nil 10          ; pop and test top of stack;
                                 ;     if `nil', go to 10,
                                 ;     else continue

     6   constant 1              ; push 1 onto top of stack

     7   goto     17             ; go to 17 (in this case, 1 will be
                                 ;     returned by the function)

     10  constant *              ; push symbol `*' onto stack

     11  varref   integer        ; push value of `integer' onto stack

     12  constant factorial      ; push `factorial' onto stack

     13  varref   integer        ; push value of `integer' onto stack

     14  sub1                    ; pop `integer', decrement value,
                                 ;     push new value onto stack

                             ; stack now is:
                             ;     decremented value of `integer'
                             ;     `factorial' 
                             ;     value of `integer'
                             ;     `*'

     15  call     1              ; call function `factorial' using
                                 ;     the first (i.e., the top) element
                                 ;     of the stack as the argument;
                                 ;     push returned value onto stack

                             ; stack now is:
                             ;        result of result of recursive
                             ;             call to `factorial'
                             ;        value of `integer'
                             ;        `*'

     16  call     2              ; using the first two (i.e., the top two)
                                 ;     elements of the stack as arguments,
                                 ;     call the function `*',
                                 ;     pushing the result onto the stack

     17  return                  ; return the top element of the stack

          => nil

The `silly-loop' function is somewhat more complex:

     (defun silly-loop (n)
       "Return time before and after N iterations of a loop."
       (let ((t1 (current-time-string)))
         (while (> (setq n (1- n)) 
                   0))
         (list t1 (current-time-string))
         ))
          => silly-loop

     (disassemble 'silly-loop)
          => byte code for silly-loop:
      doc: Return time before and after N iterations of a loop.
      args: (n)

     0   constant current-time-string      ; push `current-time-string'
                                           ;     onto top of stack

     1   call     0              ; call `current-time-string' with no
                                 ;     argument, pushing result onto stack

     2   varbind  t1             ; pop stack and bind `t1' to popped value

     3   varref   n              ; get value of `n' from the environment
                                 ;     and push the value onto the stack

     4   sub1                    ; subtract 1 from top of stack

     5   dup                     ; duplicate the top of the stack;
                                 ;     i.e. copy the top of the stack
                                 ;     and push the copy onto the stack

     6   varset   n              ; pop the top of the stack,
                                 ;     and bind `n' to the value

                         ; in effect, the sequence `dup varset' copies
                         ; the top of the stack into the value of `n'
                         ; without popping it

     7   constant 0              ; push 0 onto stack

     8   gtr                     ; pop top two values off stack,
                                 ;     test if N is greater than 0
                                 ;     and push result onto stack

     9   goto-if-nil-else-pop 17     ; goto 17 if `n' > 0 else
                                     ;     pop top of stack and continue
                                     ;     (this exits the while loop)

     12  constant nil            ; push `nil' onto stack
                                 ;     (this is the body of the loop)

     13  discard                 ; discard result of the body of the loop
                                 ;     (a while loop is always evaluated
                                 ;     for its side effects)

     14  goto     3              ; jump back to beginning of while loop

     17  discard                 ; discard result of while loop
                                 ;     by popping top of stack

     18  varref   t1             ; push value of `t1' onto stack

     19  constant current-time-string      ; push `current-time-string'
                                           ;     onto top of stack

     20  call     0              ; call `current-time-string' again

     21  list2                   ; pop top two elements off stack,
                                 ;     create a list of them,
                                 ;     and push list onto stack

     22  unbind   1              ; unbind t1 in local environment

     23  return                  ; return value of the top of stack

          => nil


▶1f◀
File: lispref  Node: Debugging, Prev: Byte Compilation, Up: Top, Next: Streams

Debugging
*********

  The Lisp Debugger provides you with the ability to suspend evaluation
of a form and do a number of things that help in debugging Lisp code.
While evaluation is suspended (a state that is commonly known as a
"break"), you may examine the runtime stack, examine the values of local
or global variables and, optionally, change those values.  Since a break
is a recursive edit while in the middle of a function call, it is
possible to do anything, including calling the debugger again.  (*Note
Recursive Editing::, and also, (*Note Recursive Editing Levels:
(emacs)Recursive Edit..)

  The actions of the debugger are well documented in the GNU Emacs
Manual; and they will not be repeated here.  The rest of this section
assumes that you are familiar with that section in the manual.  (*Note
The Emacs-Lisp Debugger: (emacs)Lisp Debug.)


  The operation of the debugger is quite simple: it performs one basic
operation, which is to enter a break.  The debugger enters such a break
when one or other of the following conditions occur:

   * when a certain function specified by you is entered or exited;

   * when a error occurs; or

   * when a `quit' signal is not handled by user code.

After entering the break, the debugger displays information about the
status of the stack in a `*Backtrace*' buffer, and waits for you to type
a command.

  When you cause Emacs to continue evaluation, at a break for function
entry or exit, the debugger will arrange for the called function to
continue to a normal conclusion and return the same value that it would
return when evaluated without the debugger.  It will not produce an
abnormal termination unless you specifically request it.

  Another useful debugging tool is a dribble file.  When a dribble file
is open, Emacs copies all keyboard input characters to that file.  You
can examine it to find out what you did.  *Note Terminal Input::; also
see the `open-termscript' function in *Note Terminal Output::.

* Menu:

* Debug Functions::      

▶1f◀
File: lispref  Node: Debug Functions, Prev: Debugging, Up: Debugging

Debug Functions
===============

* Function: debug &rest DEBUGGER-ARGS

       This function enters the debugger.  It switches buffers to a
     buffer named `*Backtrace*' (or `*Backtrace*<2>' if it is the second
     recursive edit, etc.) and prints out information about the stack.
     Emacs then enters a recursive edit, leaving that buffer showing in
     the selected window, which is in Debugger Mode.

       One of the commands defined in Debugger mode is `continue', which
     causes Emacs to exit the recursive edit, switch back to the
     previous buffer, and continue evaluation normally.

       If the first of the DEBUGGER-ARGS passed to `debug' is `nil' (or
     if it is a non-`nil' value which is not one of the following
     special values), then the rest of the arguments to `debug' are
     printed at the top of the `*Backtrace*' buffer.  This mechanism is
     used to display a message to the user.

       However, if the first argument passed to `debug' is one of the
     following special values, then it has special significance.
     Normally, these values are passed to `debug' only by the internals
     of Emacs and the debugger, and not by programmers calling `debug'.

       The special values are:

     `lambda'
            When `lambda' is passed as the first of the DEBUGGER-ARGS,
          the debugger displays `Entering:' as a line of text at the top
          of the buffer.  This is used to indicate that a function that
          is being debugged is being entered.

     `debug'
            When `debug' is passed as the first of the DEBUGGER-ARGS,
          the debugger displays `Entering:' as a line of text at the top
          of the buffer, just as when `lambda' is passed as the first of
          the DEBUGGER-ARGS.  This is used to indicate that a function
          that is being debugged is being entered.

            In addition, use of `debug' causes the debugger to mark the
          function that called `debug' so that it will also break on
          exit.

     `error'
            When `error' is passed as the argument, the debugger
          indicates that it is being entered because an error or `quit'
          was signaled and not handled.  If an error was signaled,
          presumably the variable `debug-on-error' is non-`nil'.  If
          `quit' was signaled, then presumably the variable
          `debug-on-quit' is non-`nil'.

            When entering, the debugger displays `Signaling:' followed
          by the error signaled and any arguments to `signal'.

            For example,

               (let ((debug-on-error t))
                    (/ 1 0))

               ---------- Buffer: *Backtrace* ----------
               Signaling: (arith-error)
                 /(1 0)
               ...

     `t'
            When `t' is passed as the argument, the debuggerwill
          indicate that Emacs is beginning the evaluation of a function
          call.  The debugger displays `Beginning evaluation of function
          call form:' as the top line in the buffer.

     `exit'
            When `exit' is passed as the argument, it means that a a
          function that was being debugged is returning a value.  The
          debugger displays `Return value:' on the top line of the
          buffer, followed by the returned value.

     `nil'
            Use `nil' as the first of the DEBUGGER-ARGS when you want to
          enter the debugger directly.  The rest of the DEBUGGER-ARGS
          are printed on the top line of the buffer.  You can use this
          feature to display messages---for example, to remind yourself
          the conditions under which `debug' is called.

* Variable: debugger

       The value of this variable is the function to call in order to
     invoke the debugger.  Its value must be a function (or, more
     typically, the name of a function) of any number of arguments.
     Presumably this function will enter some kind of debugger.

       The first argument that Lisp hands to the function indicates how
     it was called.  The convention for arguments is detailed in the
     description of `debug'.

* Command: backtrace

       This function prints a trace of Lisp function calls currently
     active.  This is the function used by `debug' to fill up the
     `*Backtrace*' buffer.  It is written in C, as it must have access
     to the stack in order to determine which function calls are active.
     The return value is always `nil'.

       In the following example, `backtrace' is called explicitly in a
     Lisp expression.  When the expression is evaluated, the backtrace
     is printed to `standard-output': in this case, to the buffer
     `backtrace-output'.  Each line of the backtrace represents one
     function call.  If the arguments of the function call are all
     known, they are displayed; if they are being computed, that fact is
     displayed.  The arguments of special forms are elided.

          (with-output-to-temp-buffer "backtrace-output"
            (let ((var 1))
              (save-excursion
                (setq var (eval '(progn
                                   (1+ var)
                                   (list 'testing (backtrace))
                                   ))))))

               => nil
          ----------- Buffer: backtrace-output ------------
            backtrace()
            (list ...computing arguments...)
            (progn ...)
            eval((progn (1+ var) (list (quote testing) (backtrace))))
            (setq ...)
            (save-excursion ...)
            (let ...)
            (with-output-to-temp-buffer ...)
            eval-region(1973 2142 #<buffer *scratch*>)
            byte-code("...  for eval-print-last-sexp ...")
            eval-print-last-sexp(nil)
          * call-interactively(eval-print-last-sexp)
          ----------- Buffer: backtrace-output ------------

* Command: debug-on-entry FUNCTION-NAME

       This function requests FUNCTION-NAME to invoke the debugger each
     time it is called.  It works by inserting the form `(debug 'debug)'
     into the function definition as the first form.

       Any function defined as Lisp code may be debugged, regardless of
     whether it is interpreted code or compiled code.  Even functions
     which are commands may be debugged.  They will enter the debugger
     when called inside of a function, or when called interactively.
     Primitive functions (i.e., those written in C) may not be debugged.

       When `debug-on-entry' is called interactively, Emacs prompts you
     for FUNCTION-NAME in the minibuffer.

       `debug-on-entry' returns FUNCTION-NAME.  If `debug-on-entry' is
     called more than once on the same function, the second call does
     nothing.

          (defun fact (n)
            (if (zerop n) 1
                (* n (fact (1- n)))))
               => fact
          (debug-on-entry 'fact)
               => fact
          (fact 3)
               => 6

          ---------- Buffer: *Backtrace* ----------
          Entering:
          * fact(3)
            eval-region(4870 4878 t)
            byte-code("...")
            eval-last-sexp(nil)
            (let ...)
            eval-insert-last-sexp(nil)
          * call-interactively(eval-insert-last-sexp)
          ---------- Buffer: *Backtrace* ----------

          (symbol-function 'fact)
               => (lambda (n)
               (debug (quote debug))
               (if (zerop n) 1 (* n (fact (1- n)))))

* Command: cancel-debug-on-entry FUNCTION-NAME

       This function undoes the effect of `debug-on-entry' on
     FUNCTION-NAME.

       When `cancel-debug-on-entry' is called interactively, Emacs
     prompts you for FUNCTION-NAME in the minibuffer.

       If `cancel-debug-on-entry' is called more than once on the same
     function, the second call does nothing.  `cancel-debug-on-entry'
     returns FUNCTION-NAME.

* User Option: debug-on-error

       This variable determines whether the debugger is called when a
     error is signaled and not handled.  If the `debug-on-error'
     variable is non-`nil', then the debugger is called on every such
     error.  (Note that `quit' is not an error.).  If the
     `debug-on-error' variable is `nil', then the debugger is not
     called.

* User Option: debug-on-quit

       This variable determines whether the debugger is called when
     `quit' is signaled and not handled.  If the `debug-on-quit'
     variable it is non-`nil' then the debugger is called on every
     `quit' signal.  If the `debug-on-quit' variable is `nil', then the
     debugger is not called.  (`quit' is the signal that `C-g' causes.)

* User Option: stack-trace-on-error

       This obsolete variable determines whether Lisp shall
     automatically display a backtrace buffer after every error that is
     not handled.  A quit signal counts as an error for this variable.
     If it is non-`nil' then a backtrace is shown in a pop-up buffer
     named `*Backtrace*' on every error.  If it is `nil', then a
     backtrace is not shown.

       When a backtrace is shown, that buffer is not selected.  If
     either `debug-on-quit' or `debug-on-error' is also non-`nil', then
     a backtrace is shown in one buffer, and the debugger is popped up
     in another buffer with its own backtrace.

* Variable: debug-on-next-call

       This variable determines whether the debugger is called before
     the next `eval', `apply' or `funcall'.  It is automatically reset
     to `nil' when the debugger is entered.

     The `d' command in the debuffer works by setting this variable.


* Function: backtrace-debug LEVEL FLAG

       This function sets the debug-on-exit flag of the eval frame LEVEL
     levels down to FLAG, causing the debugger to be entered when that
     frame exits, assuming FLAG is non-`nil'.

       The `debug-on-exit' flag is an entry in the stack frame of a
     function call.  This flag is examined on every exit from a
     function.

       Normally this function is only called by the debugger.

▶1f◀
File: lispref  Node: Streams, Prev: Debugging, Up: Top, Next: Minibuffers

Reading and Printing Lisp Objects
*********************************

  "Printing" and "reading" are the operations of converting Lisp objects
to textual form and vice versa.  They use the printed representations
and syntax described in *Note Types of Lisp Object::.

  This chapter describes the Lisp functions for reading and printing.
It also describes "streams", which specify where to get the text (if
reading) or where to put it (if printing).

* Menu:

* Streams Intro::
* Input Streams::	
* Input Functions::
* Output Streams::	
* Output Functions::

▶1f◀
File: lispref  Node: Streams Intro, Prev: Streams, Up: Streams, Next: Input Streams

Introduction to Reading and Printing
====================================

  "Reading" a Lisp object means parsing a Lisp expression in textual
form and producing a corresponding Lisp object.  This is how Lisp
programs get into Lisp from files of Lisp code.  For example, reading
the text `(a . 5)' returns a cons cell whose CAR is `a' and whose CDR is
the number 5.

  "Printing" a Lisp object means producing the text which represents
that object.  Printing that cons cell produces the text `(a . 5)'.

  Generally speaking, reading and printing are inverse operations.
Printing the object that results from reading a given piece of text
usually produces the same text, and reading the text that results from
printing an object usually produces a similar-looking object.  For
example, printing the symbol `foo' produces the text `foo', and reading
that text returns the symbol `foo'.  Printing a list whose elements are
`a' and `b' produces the text `(a b)', and reading that text produces a
list (but not the same list) with elements are `a' and `b'.

  However, these two operations are not precisely inverses.  There are
two kinds of exceptions:

   * Printing can produce text that cannot be read.  For example,
     buffers, windows, subprocesses and markers print into text that
     starts with `#'; if you try to read this text, you get an error.
     There is no way to read those data types.

   * One object can have multiple textual representations.  For example,
     `1' and `01' represent the same integer, and `(a b)' and `(a .
     (b))' represent the same list.  Reading will accept any of the
     alternatives, but evidently printing must choose one of them.

▶1f◀
File: lispref  Node: Input Streams, Prev: Streams Intro, Up: Streams, Next: Input Functions

Input Streams
=============

  Most of the Lisp functions for reading text take an "input stream" as
argument.  The input stream specifies where or how to get the characters
of the text to be read.  Here are the possible types of input stream:

BUFFER
     The input characters are read from BUFFER, starting with the
     character directly after point.  Point advances as characters are
     read.

MARKER
     The input characters are read from the buffer that MARKER is in,
     starting with the character directly after the marker.  Its
     position advances as characters are read.  The value of point in
     the buffer has no effect when the stream is a marker.

STRING
     The input characters are taken from STRING, starting at the first
     character in the string and advancing through as many character as
     required.

FUNCTION
     The input characters are generated by FUNCTION, one per call.

     In version 18, FUNCTION is always called with no arguments and
     should return a character.


`t'
     `t' used as a stream means that the input is read from the
     minibuffer.  In fact, the minibuffer is invoked once and the text
     given by the user is made into a string which is then used as the
     input stream.

`nil'
     `nil' used as a stream means that the value of `standard-input'
     should be used instead; that value must be a non-`nil' input
     stream.

  Here is an example of reading from a stream which is a buffer.  We
show where point is before and after.

     ---------- Buffer: foo ----------
     This-!- is the contents of foo.
     ---------- Buffer: foo ----------

     (read (get-buffer "foo"))
     => is
     (read (get-buffer "foo"))
     => the

     ---------- Buffer: foo ----------
     This is the -!-contents of foo.
     ---------- Buffer: foo ----------

Note that the first read skips a space at the beginning.  Reading always
skips any amount of whitespace preceding the significant text.

Note also how the second read skips the space which terminates the
symbol `the'.  It has to read this space in order to know that no more
letters follow.

  Here is an example of reading from a stream which is a marker.  The
marker is initialized to point at the beginning of the buffer shown.
The value of the read is the symbol `This'.

     ---------- Buffer: foo ----------
     This is the contents of foo.
     ---------- Buffer: foo ----------

     (setq m (set-marker (make-marker) 1 (get-buffer "foo")))
     => #<marker at 1 in foo>
     (read m)
     => This
     m
     => #<marker at 6 in foo>   ;; After the first space.

  Here we read from the text of a string:

     (read "(When in) the course")
     => (When in)

  The following example reads from the minibuffer, prompting with `Lisp
expression: '.  (That is always the prompt used when you read from the
stream `t'.)  The user's input is shown following the prompt.

     (read t)
     => 23
     ---------- Buffer: Minibuffer ----------
     Lisp expression: 23 RET

  Finally, here is an example of a stream which is a function, named
`useless-stream'.  The variable `useless-list' is initialized to a list
of characters.  Each call to the function `useless-stream' produces the
next letter in the list.

     (setq useless-list (append "XY()" nil))
     => (88 89 40 41)

     (defun useless-stream ()
       (prog1 (car useless-list)
              (setq useless-list (cdr useless-list))))
     => useless-stream

  Now we read using this stream.

     (read 'useless-stream)
     => XY

     useless-list
     => (41)

Note that only the close-parenthesis remains in the list.  This is
because the open-parenthesis was read before the Lisp reader knew it had
found the end of the symbol.  A second attempt to read from the stream
at this point would get an error due to the unmatched close-parenthesis.


* Function: get-file-char

     This function is used internally as an input stream to read from
     the input file opened by the function `load'.  Don't use this
     function yourself.

▶1f◀