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]