Previous: Wrong Type of Argument, Up: Arguments [Contents][Index]
message
Functionmessage
関数は+
のように可変個の引数を受け取ります。これはユーザーにメッセージを送信されるために関数で、とても便利な関数なのでここで説明しておきます。
メッセージがプリントされるのはエコーエリアです。たとえば以下のリストを評価すれば、エコーエリアにメッセージをプリントできます:
(message "This message appears in the echo area!")
二重引用符の間にある文字列全体で単一の引数であり、それがそっくりそのままプリントされます。(この例において、エコーエリアにプリントされるメッセージ自体が二重引用符に括られていることに注意してください。なぜならあなたが目にしているのは、message
関数がリターンした値だからです。あなたが記述するプログラム内でmessage
を使用するほとんどの場合においては、副作用のためにテキストは引用符で括られずにエコーエリアにプリントされるでしょう。これの例についての詳細はSee multiply-by-seven
in detailを参照してください。)
ただし括られた文字列の中に‘%s’が存在する場合には、message
関数は‘%s’をそのままプリントせずに、括られた文字列の後続する引数を調べます。そして2つ目の引数を評価した値を、文字列内の‘%s’がある位置にプリントします。
以下の式の後にカーソルを置いてC-x C-eをタイプすれば、これを確認することができます:
(message "The name of this buffer is: %s." (buffer-name))
Infoモードではエコーエリアに"The name of this buffer is:
*info*."
がプリントされるはずです。buffer-name
はバッファーの名前を文字列としてリターンする関数であり、message
関数がそれを%s
の場所に挿入したのです。
値を整数としてプリントするには、‘%s’と同じ方法で‘%d’を使います。たとえば以下の式を評価すれば、fill-column
の値を示すメッセージがエコーエリアにプリントされます:
(message "The value of fill-column is %d." fill-column)
わたしのシステムでこのリストを評価した際には、エコーエリアに"The value of fill-column is
72."
が表示されました5。
引用符に括られた文字列に‘%s’が2つ以上ある場合には、引用された文字列の1つ後ろにある引数の値が1つ目の‘%s’の場所n、2つ後の引数の値が2つ目の‘%s’の場所に、といった具合にプリントされます。
たとえば以下を評価してください
(message "There are %d %s in the office!" (- fill-column 14) "pink elephants")
少々奇妙なメッセージがエコーエリアに表示されるでしょう。わたしのシステムでは"There are 58 pink elephants in
the office!"
でした(訳注: ピンクの象はアルコールや麻薬による幻覚症状に使用される動物)。
(- fill-column
14)
が評価された結果の数値が‘%d’の場所に挿入されます。そして二重引用符に括られた"pink
elephants"
という文字列は単一の引数として扱われて、‘%s’の場所に挿入されます(つまり二重引用符に括られた文字列が、数値の場合のように文字列自体に評価されるのです)。
最後に数値計算だけではなく、‘%s’に置換されるテキストを生成するような式も利用できることを示す若干複雑な例を説明しておきます:
(message "He saw %d %s" (- fill-column 32) (concat "red " (substring "The quick brown foxes jumped." 16 21) " leaping."))
この例のmessage
には"He saw %d %s"
という文字列、(- fill-column
32)
という式、そして関数concat
で始まる式という3つの引数があります。(- fill-column
32)
を評価した結果の値は‘%d’、concat
で始まる式がリターンした値は‘%s’の場所に挿入されます(訳注:
完全に余談ですが、"The quick brown fox ..."は英語版のいろはにほへと ...)。
この式を評価するとあなたのfill-columnの値が70の場合には、エコーエリアに"He saw 38 red foxes
leaping."
というメッセージが表示されることでしょう。