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

3.3.1 インタラクティブな multiply-by-seven

特殊形式 interactive の使い方を確認し、次に multiply-by-seven の対話型バージョンにおける関数 message を見てみましょう。関数の定義は次のようになっていることを思い出してください。

(defun multiply-by-seven (number)       ; Interactive version.
  "Multiply NUMBER by seven."
  (interactive "p")
  (message "The result is %d" (* 7 number)))

この関数では、式 (interactive "p") は2つの要素からなるリストです。"p" は、プレフィックス引数を関数に渡し、その値を関数の引数として使用するようにEmacsに指示します。

引数は数値となります。つまり、行内のシンボル number は数値にバインドされます:

(message "The result is %d" (* 7 number))

例えば、接頭辞引数が 5 の場合、Lisp インタプリタはその行を次のように評価します:

(message "The result is %d" (* 7 5))

(GNU Emacs でこれを読んでいるなら、この式を自分で評価できます。) まず、インタプリタは内側のリスト、つまり (* 7 5) を評価します。 これにより 35 という値が返されます。 次に、外側のリストを評価し、リストの2番目以降の要素の値を関数 message に渡します。

これまで見てきたように、message はユーザーに1行のメッセージを送信するために特別に設計された Emacs Lisp 関数です。(message 関数を参照してください。)まとめると、message 関数は、‘%d’ や ‘%s’(およびここでは言及しなかったその他のさまざまな %-シーケンス)が出現する場合を除き、第1引数をそのままエコーエリアに出力します。制御シーケンスを検出すると、この関数は第2引数以降を参照し、制御シーケンスが存在する文字列上の位置にその引数の値を出力します。

インタラクティブなmultiply-by-seven関数では、制御文字列は‘%d’であり、数値が必要で、(* 7 5)を評価して返される値は数値35です。したがって、‘%d’の代わりに数値35が出力され、メッセージは‘The result is 35’となります。

(なお、関数 multiply-by-seven を呼び出すとメッセージは引用符なしで出力されますが、message を呼び出すとテキストは二重引用符で囲まれて出力されます。これは、message が返す値が、第1要素が message である式を評価した際にエコー領域に表示される値であるためです。しかし、関数内に埋め込まれた場合、message は副作用としてテキストを引用符なしで出力します。)