]> code.delx.au - gnu-emacs/blobdiff - lispref/functions.texi
(Killing Buffers): kill-buffer-hook is perm local.
[gnu-emacs] / lispref / functions.texi
index b770ac39f7ca1d68ccd9bffaf4434ad7af8185f2..9ffb6561b239ed23ae878e084d9a870d9ca68b03 100644 (file)
@@ -1,6 +1,7 @@
 @c -*-texinfo-*-
 @c This is part of the GNU Emacs Lisp Reference Manual.
-@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998 Free Software Foundation, Inc. 
+@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999
+@c   Free Software Foundation, Inc.
 @c See the file elisp.texi for copying conditions.
 @setfilename ../info/functions
 @node Functions, Macros, Variables, Top
@@ -17,10 +18,11 @@ define them.
 * Defining Functions::    Lisp expressions for defining functions.
 * Calling Functions::     How to use an existing function.
 * Mapping Functions::     Applying a function to each element of a list, etc.
-* Anonymous Functions::   Lambda expressions are functions with no names.    
+* Anonymous Functions::   Lambda expressions are functions with no names.
 * Function Cells::        Accessing or setting the function definition
                             of a symbol.
 * Inline Functions::     Defining functions that the compiler will open code.
+* Function Safety::       Determining whether a function is safe to call.
 * Related Topics::        Cross-references to specific Lisp primitives
                             that have a special bearing on how functions work.
 @end menu
@@ -54,18 +56,18 @@ such as @code{car} or @code{append}.  These functions are also called
 @dfn{built-in} functions or @dfn{subrs}.  (Special forms are also
 considered primitives.)
 
-Usually the reason we implement a function as a primitive is because it
-is fundamental, because it provides a low-level interface to operating
-system services, or because it needs to run fast.  Primitives can be
-modified or added only by changing the C sources and recompiling the
-editor.  See @ref{Writing Emacs Primitives}.
+Usually the reason we implement a function as a primitive is either
+because it is fundamental, because it provides a low-level interface
+to operating system services, or because it needs to run fast.
+Primitives can be modified or added only by changing the C sources and
+recompiling the editor.  See @ref{Writing Emacs Primitives}.
 
 @item lambda expression
 A @dfn{lambda expression} is a function written in Lisp.
 These are described in the following section.
-@ifinfo
+@ifnottex
 @xref{Lambda Expressions}.
-@end ifinfo
+@end ifnottex
 
 @item special form
 A @dfn{special form} is a primitive that is like a function but does not
@@ -110,7 +112,6 @@ A @dfn{byte-code function} is a function that has been compiled by the
 byte compiler.  @xref{Byte-Code Type}.
 @end table
 
-@tindex functionp
 @defun functionp object
 This function returns @code{t} if @var{object} is any kind of function,
 or a special form or macro.
@@ -144,6 +145,16 @@ function.  For example:
 @end example
 @end defun
 
+@defun subr-arity subr
+@tindex subr-arity
+This function provides information about the argument list of a
+primitive, @var{subr}.  The returned value is a pair
+@code{(@var{min} . @var{max})}.  @var{min} is the minimum number of
+args.  @var{max} is the maximum number or the symbol @code{many}, for a
+function with @code{&rest} arguments, or the symbol @code{unevalled} if
+@var{subr} is a special form.
+@end defun
+
 @node Lambda Expressions
 @section Lambda Expressions
 @cindex lambda expression
@@ -174,7 +185,7 @@ expression, but to be called as a function.
 @node Lambda Components
 @subsection Components of a Lambda Expression
 
-@ifinfo
+@ifnottex
 
   A function written in Lisp (a ``lambda expression'') is a list that
 looks like this:
@@ -185,7 +196,7 @@ looks like this:
   [@var{interactive-declaration}]
   @var{body-forms}@dots{})
 @end example
-@end ifinfo
+@end ifnottex
 
 @cindex lambda list
   The first element of a lambda expression is always the symbol
@@ -354,9 +365,11 @@ is @code{nil}.
   There is no way to have required arguments following optional
 ones---it would not make sense.  To see why this must be so, suppose
 that @code{c} in the example were optional and @code{d} were required.
-Suppose three actual arguments are given; which variable would the third
-argument be for?  Similarly, it makes no sense to have any more
-arguments (either required or optional) after a @code{&rest} argument.
+Suppose three actual arguments are given; which variable would the
+third argument be for?  Would it be used for the @var{c}, or for
+@var{d}?  One can argue for both possibilities.  Similarly, it makes
+no sense to have any more arguments (either required or optional)
+after a @code{&rest} argument.
 
   Here are some examples of argument lists and proper calls:
 
@@ -458,11 +471,13 @@ one symbol, this is just a matter of convenience.  It is easy to store
 it in several symbols using @code{fset}; then each of the symbols is
 equally well a name for the same function.
 
-  A symbol used as a function name may also be used as a variable;
-these two uses of a symbol are independent and do not conflict.
-(Some Lisp dialects, such as Scheme, do not distinguish between a
-symbol's value and its function definition; a symbol's value as a variable
-is also its function definition.)
+  A symbol used as a function name may also be used as a variable; these
+two uses of a symbol are independent and do not conflict.  (Some Lisp
+dialects, such as Scheme, do not distinguish between a symbol's value
+and its function definition; a symbol's value as a variable is also its
+function definition.)  If you have not given a symbol a function
+definition, you cannot use it as a function; whether the symbol has a
+value as a variable makes no difference to this.
 
 @node Defining Functions
 @section Defining Functions
@@ -558,6 +573,17 @@ purposes, it is better to use @code{fset}, which does not keep such
 records.
 @end defun
 
+  You cannot create a new primitive function with @code{defun} or
+@code{defalias}, but you use them to change the function definition of
+any symbol, even one such as @code{car} or @code{x-popup-menu} whose
+normal definition is a primitive.  However, this is risky: for
+instance, it is next to impossible to redefine @code{car} without
+breaking Lisp completely.  Redefining an obscure function such as
+@code{x-popup-menu} is less dangerous, but it still may not work as
+you expect.  If there are calls to the primitive from C code, they
+call the primitive's C definition directly, so changing the symbol's
+definition will have no effect on them.
+
   See also @code{defsubst}, which defines a function like @code{defun}
 and tells the Lisp compiler to open-code it.  @xref{Inline Functions}.
 
@@ -581,7 +607,7 @@ which function to call, and how many arguments to give it, when you
 write the program.  Usually that's just what you want.  Occasionally you
 need to compute at run time which function to call.  To do that, use the
 function @code{funcall}.  When you also need to determine at run time
-how may arguments to pass, use @code{apply}.
+how many arguments to pass, use @code{apply}.
 
 @defun funcall function &rest arguments
 @code{funcall} calls @var{function} with @var{arguments}, and returns
@@ -621,7 +647,7 @@ above, it never knows them in the first place.
 @end group
 @end example
 
-Compare these example with the examples of @code{apply}.
+Compare these examples with the examples of @code{apply}.
 @end defun
 
 @defun apply function &rest arguments
@@ -691,7 +717,9 @@ This function ignores any arguments and returns @code{nil}.
 list or other collection.  Emacs Lisp has several such functions;
 @code{mapcar} and @code{mapconcat}, which scan a list, are described
 here.  @xref{Creating Symbols}, for the function @code{mapatoms} which
-maps over the symbols in an obarray.
+maps over the symbols in an obarray.  @xref{Hash Access}, for the
+function @code{maphash} which maps over key/value associations in a
+hash table.
 
   These mapping functions do not allow char-tables because a char-table
 is a sparse array whose nominal range of indices is very large.  To map
@@ -729,10 +757,10 @@ length of @var{sequence}.
   "Apply FUNCTION to successive cars of all ARGS.
 Return the list of results."
   ;; @r{If no list is exhausted,}
-  (if (not (memq 'nil args))              
+  (if (not (memq 'nil args))
       ;; @r{apply function to @sc{car}s.}
-      (cons (apply function (mapcar 'car args))  
-            (apply 'mapcar* function             
+      (cons (apply function (mapcar 'car args))
+            (apply 'mapcar* function
                    ;; @r{Recurse for rest of elements.}
                    (mapcar 'cdr args)))))
 @end group
@@ -744,6 +772,13 @@ Return the list of results."
 @end smallexample
 @end defun
 
+@defun mapc function sequence
+@tindex mapc
+@code{mapc} is like @code{mapcar} except that @var{function} is used for
+side-effects only---the values it returns are ignored, not collected
+into a list.  @code{mapc} always returns @var{sequence}.
+@end defun
+
 @defun mapconcat function sequence separator
 @code{mapconcat} applies @var{function} to each element of
 @var{sequence}: the results, which must be strings, are concatenated.
@@ -755,7 +790,7 @@ The argument @var{function} must be a function that can take one
 argument and return a string.  The argument @var{sequence} can be any
 kind of sequence except a char-table; that is, a list, a vector, a
 bool-vector, or a string.
-  
+
 @smallexample
 @group
 (mapconcat 'symbol-name
@@ -817,7 +852,7 @@ your program.  For example, you might want to pass one as an argument to
 the function @code{mapcar}, which applies any given function to each
 element of a list.
 
-  Here we define a function @code{change-property} which 
+  Here we define a function @code{change-property} which
 uses a function as its third argument:
 
 @example
@@ -846,7 +881,8 @@ of simple quotation to quote the anonymous function, like this:
 @example
 @group
 (defun double-property (symbol prop)
-  (change-property symbol prop (function (lambda (x) (* 2 x)))))
+  (change-property symbol prop
+                   (function (lambda (x) (* 2 x)))))
 @end group
 @end example
 
@@ -864,10 +900,22 @@ definition which uses ordinary @code{quote}, the argument passed to
 @noindent
 The Lisp compiler cannot assume this list is a function, even though it
 looks like one, since it does not know what @code{change-property} will
-do with the list.  Perhaps will check whether the @sc{car} of the third
+do with the list.  Perhaps it will check whether the @sc{car} of the third
 element is the symbol @code{*}!  Using @code{function} tells the
 compiler it is safe to go ahead and compile the constant function.
 
+  Nowadays it is possible to omit @code{function} entirely, like this:
+
+@example
+@group
+(defun double-property (symbol prop)
+  (change-property symbol prop (lambda (x) (* 2 x))))
+@end group
+@end example
+
+@noindent
+This is because @code{lambda} itself implies @code{function}.
+
   We sometimes write @code{function} instead of @code{quote} when
 quoting the name of a function, but this usage is just a sort of
 comment:
@@ -876,6 +924,21 @@ comment:
 (function @var{symbol}) @equiv{} (quote @var{symbol}) @equiv{} '@var{symbol}
 @end example
 
+@cindex @samp{#'} syntax
+  The read syntax @code{#'} is a short-hand for using @code{function}.
+For example,
+
+@example
+#'(lambda (x) (* x x))
+@end example
+
+@noindent
+is equivalent to
+
+@example
+(function (lambda (x) (* x x)))
+@end example
+
 @defspec function function-object
 @cindex function quoting
 This special form returns @var{function-object} without evaluating it.
@@ -952,7 +1015,7 @@ is a legitimate function.
 @defun fmakunbound symbol
 This function makes @var{symbol}'s function cell void, so that a
 subsequent attempt to access this cell will cause a @code{void-function}
-error.  (See also @code{makunbound}, in @ref{Local Variables}.)
+error.  (See also @code{makunbound}, in @ref{Void Variables}.)
 
 @example
 @group
@@ -1106,7 +1169,92 @@ do for macros.  (@xref{Argument Evaluation}.)
 Inline functions can be used and open-coded later on in the same file,
 following the definition, just like macros.
 
-@c Emacs versions prior to 19 did not have inline functions.
+@node Function Safety
+@section Determining whether a function is safe to call
+@cindex function safety
+@cindex safety of functions
+
+Some major modes such as SES (@pxref{Top,,,ses}) call functions that
+are stored in user files.  User files sometimes have poor
+pedigrees---you can get a spreadsheet from someone you've just met, or
+you can get one through email from someone you've never met.  So it is
+risky to call a function whose source code is stored in a user file
+until you have determined that it is safe.
+
+@defun unsafep form &optional unsafep-vars
+Returns @code{nil} if @var{form} is a @dfn{safe} lisp expression, or
+returns a list that describes why it might be unsafe.  The argument
+@var{unsafep-vars} is a list of symbols known to have temporary
+bindings at this point; it is mainly used for internal recursive
+calls.  The current buffer is an implicit argument, which provides a
+list of buffer-local bindings.
+@end defun
+
+Being quick and simple, @code{unsafep} does a very light analysis and
+rejects many Lisp expressions that are actually safe.  There are no
+known cases where @code{unsafep} returns @code{nil} for an unsafe
+expression.  However, a ``safe'' Lisp expression can return a string
+with a @code{display} property, containing an associated Lisp
+expression to be executed after the string is inserted into a buffer.
+This associated expression can be a virus.  In order to be safe, you
+must delete properties from all strings calculated by user code before
+inserting them into buffers.
+
+@ignore
+What is a safe Lisp expression?  Basically, it's an expression that
+calls only built-in functions with no side effects (or only innocuous
+ones).  Innocuous side effects include displaying messages and
+altering non-risky buffer-local variables (but not global variables).
+
+@table @dfn
+@item Safe expression
+@itemize
+@item
+An atom or quoted thing.
+@item
+A call to a safe function (see below), if all its arguments are
+safe expressions.
+@item
+One of the special forms @code{and}, @code{catch}, @code{cond},
+@code{if}, @code{or}, @code{prog1}, @code{prog2}, @code{progn},
+@code{while}, and @code{unwind-protect}], if all its arguments are
+safe.
+@item
+A form that creates temporary bindings (@code{condition-case},
+@code{dolist}, @code{dotimes}, @code{lambda}, @code{let}, or
+@code{let*}), if all args are safe and the symbols to be bound are not
+explicitly risky (see @pxref{File Local Variables}).
+@item
+An assignment using @code{add-to-list}, @code{setq}, @code{push}, or
+@code{pop}, if all args are safe and the symbols to be assigned are
+not explicitly risky and they already have temporary or buffer-local
+bindings.
+@item
+One of [apply, mapc, mapcar, mapconcat] if the first argument is a
+safe explicit lambda and the other args are safe expressions.
+@end itemize
+
+@item Safe function
+@itemize
+@item
+A lambda containing safe expressions.
+@item
+A symbol on the list @code{safe-functions}, so the user says it's safe.
+@item
+A symbol with a non-@code{nil} @code{side-effect-free} property.
+@item
+A symbol with a non-@code{nil} @code{safe-function} property.  Value t
+indicates a function that is safe but has innocuous side effects.
+Other values will someday indicate functions with classes of side
+effects that are not always safe.
+@end itemize
+
+The @code{side-effect-free} and @code{safe-function} properties are
+provided for built-in functions and for low-level functions and macros
+defined in @file{subr.el}.  You can assign these properties for the
+functions you write.
+@end table
+@end ignore
 
 @node Related Topics
 @section Other Topics Related to Functions