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 は副作用としてテキストを引用符なしで出力します。)