Next: beginning-of-buffer opt arg, Up: beginning-of-buffer [Contents][Index]
Unless told otherwise, Lisp expects that a function with an argument in its function definition will be called with a value for that argument. If that does not happen, you get an error and a message that says ‘Wrong number of arguments’.
However, optional arguments are a feature of Lisp: a particular
keyword is used to tell the Lisp interpreter that an argument is
optional. The keyword is &optional
. (The ‘&’ in front of
‘optional’ is part of the keyword.) In a function definition, if an
argument follows the keyword &optional
, no value need be passed to
that argument when the function is called.
The first line of the function definition of beginning-of-buffer
therefore looks like this:
(defun beginning-of-buffer (&optional arg)
In outline, the whole function looks like this:
(defun beginning-of-buffer (&optional arg) "documentation…" (interactive "P") (or (is-the-argument-a-cons-cell arg) (and are-both-transient-mark-mode-and-mark-active-true) (push-mark)) (let (determine-size-and-set-it) (goto-char (if-there-is-an-argument figure-out-where-to-go else-go-to (point-min)))) do-nicety
The function is similar to the simplified-beginning-of-buffer
function except that the interactive
expression has "P"
as an
argument and the goto-char
function is followed by an if-then-else
expression that figures out where to put the cursor if there is an argument
that is not a cons cell.
(Since I do not explain a cons cell for many more chapters, please consider
ignoring the function consp
. See How Lists
are Implemented, and Cons Cell and List Types in The GNU Emacs Lisp Reference Manual.)
The "P"
in the interactive
expression tells Emacs to pass a
prefix argument, if there is one, to the function in raw form. A prefix
argument is made by typing the META key followed by a number, or by
typing C-u and then a number. (If you don’t type a number, C-u
defaults to a cons cell with a 4. A lowercase "p"
in the
interactive
expression causes the function to convert a prefix arg to
a number.)
The true-or-false-test of the if
expression looks complex, but it is
not: it checks whether arg
has a value that is not nil
and
whether it is a cons cell. (That is what consp
does; it checks
whether its argument is a cons cell.) If arg
has a value that is not
nil
(and is not a cons cell), which will be the case if
beginning-of-buffer
is called with a numeric argument, then this
true-or-false-test will return true and the then-part of the if
expression will be evaluated. On the other hand, if
beginning-of-buffer
is not called with an argument, the value of
arg
will be nil
and the else-part of the if
expression
will be evaluated. The else-part is simply point-min
, and when this
is the outcome, the whole goto-char
expression is (goto-char
(point-min))
, which is how we saw the beginning-of-buffer
function
in its simplified form.
Next: beginning-of-buffer opt arg, Up: beginning-of-buffer [Contents][Index]