Previous: Interactive multiply-by-seven, Up: Interactive [Contents][Index]
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
はEmacs
Lispにおいてユーザーに1行メッセージを送信するために特化してデザインされた関数です(The
message
functionを参照)。要約するとmessage
関数は1つ目の引数の‘%d’と‘%s’の箇所を除いた部分をエコーエリアにプリントします(ここでは記載していないその他の%シーケンスも除外される)。この関数は%による制御シーケンスを発見すると2つ目以降の引数を調べて、その引数の値を文字列内で制御シーケンスが配置された箇所にプリントするのです。
インタラクティブなmultiply-by-seven
関数における制御文字列は数値を要求する‘%d’であり、その値は(*
7 5)
を評価してリターンされた数値である35です。その結果として‘%d’の箇所に35がプリントされてメッセージは‘The
result is 35’になります。
(あなたがmultiply-by-seven
関数を呼び出すとメッセージは引用符なしでプリントされますが、message
を呼び出した際には二重引用符でクォートされたテキストがプリントされることに注意してください。1つ目の要素がmessage
であるような式を評価した際にはmessage
がリターンした値がエコーエリアに表示されますが、関数に埋め込まれた場合には副作用としてmessage
が引用符なしでプリントを行いためです。)