GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/eintr/Optional-Arguments.html ・ emacs-doc.conao3.com

5.3.1 オプション引数

特に指定がない限り、Lispは関数定義に引数を持つ関数が、その引数に値を渡されて呼び出されるものと想定します。そうでない場合はエラーが発生し、‘Wrong number of arguments’というメッセージが表示されます。

ただし、省略可能な引数はLispの機能であり、特定のキーワードを用いて、引数が省略可能であることをLispインタプリタに伝えます。このキーワードは&optionalです。(optionalの前にある‘&’もキーワードの一部です。)関数定義において、キーワード&optionalの後に引数が続く場合、関数を呼び出す際にその引数に値を渡す必要はありません。

したがって、beginning-of-bufferの関数定義の1行目は次のようになります。

(defun beginning-of-buffer (&optional arg)

概略としては、関数全体は次のようになります。

(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

この関数はsimplified-beginning-of-buffer関数と似ていますが、interactive式の引数が"P"である点と、goto-char関数の後に、引数がコンスセルでない場合にカーソルをどこに配置するかを決定するif-then-else式が続く点が異なります。

(以降、多くの章にわたって cons セルについての説明は行わないため、関数 consp は無視して構いません。The GNU Emacs Lisp Reference Manual の How Lists are Implemented および Cons Cell and List Types を参照してください。)

interactive 式内の "P" は、プレフィックス引数がある場合に、それをそのままの形式で関数に渡すよう Emacs に指示します。プレフィックス引数は、META キーを入力した後に数値を入力するか、あるいは C-u を入力してから数値を入力することで作成します。(数値を入力しない場合、C-u はデフォルトで 4 を含むコンスセルになります。interactive 式内で小文字の "p" を指定すると、関数がプレフィックス引数を数値に変換します。)

if 式の真偽判定は複雑に見えますが、実際はそうではありません。これは、arg が nil 以外の値を持ち、かつコンスセルであるかどうかを判定するものです。(consp も同様で、引数がコンスセルであるかどうかを判定します。)もし arg が nil 以外の値を持ち(かつコンスセルではない)――これは beginning-of-buffer が数値引数で呼び出された場合に当てはまります――、この真偽判定は true を返し、if 式の then 部分が評価されます。一方、beginning-of-buffer が引数なしで呼び出された場合、arg の値は nil となり、if 式の else 部分が評価されます。else 部分は単に point-min であり、この結果となった場合、goto-char 式全体は (goto-char (point-min)) となります。これが、簡略化された形式の beginning-of-buffer 関数の姿です。