date
と time
キーワードの
書式をそのまま使っていました。
これを例えば
yy年mm月dd日(D曜日) hh時mm分ss秒↓ |
5.1 コメント |
// 最初に日付・時刻を挿入↓ |
//
から
改行(↓)まで
(空色の文字になっている部分)はコメントです。
コメントはマクロファイル中に説明を書きこむために入れるもので、
(必要のない)区切り文字と同じく、
あってもなくてもマクロの動作には何も影響を与えません。
今まではコメントを書く必要もないほど簡単なマクロばかりでしたが、
これからもっと複雑なマクロがでてくるので
適宜コメントを入れるようにします。left
、right
コマンドで動かしながら文字を消したり入力しているだけです。
別の言い方をすると5.2 関数 |
date
や time
キーワードの内容の
一部分だけを取り出すにはどうすればよいか?
midstr
という名前の関数です。
これは例えば以下のようにして使います。
insert midstr("Hello",2,2); // "ll" を挿入する↓
|
midstr
関数には3つの引数、
"Hello"
、
2
、
2
が与えられています。
2番目と3番目の引数は二重引用符で括られていないので、
これらは数値(リテラル)です。midstr
関数の場合は、0
として数えたものを与えます。
または、取り出したい文字列の部分が始まるまでに、
先頭から(半角文字で)数えて何文字スキップするか を与えている、
と言ってもよいです。
insert midstr("こんにちは",2,2); // "ん" を挿入する↓ |
midstr
関数が書かれている場所は、
本来 insert
コマンドの引数がある場所、
すなわちそこには文字列があるべき場所なのです。
これは間違いではなく、
キーワードがそのキーワードの内容に置き換えられたように、
関数が書かれている部分が
その関数の処理の結果に置き換えられるために、
コマンドに正しく引数を渡していることになります。
具体的にはinsert midstr("Hello",2,2); |
(関数が処理される) | |
→ |
insert "ll"; |
(関数がその処理結果に置き換えられた!) |
→ |
insert "ll"; |
(コマンドの実行) |
→ |
「ll」 |
(文字列の挿入) |
insert midstr(date,0,2) + // date の先頭から2文字分(yy)↓ |
insert
コマンドの引数が
実際にどう処理されるかをもう少し詳しく説明しましょう。midstr(date,0,2)+"年"+midstr(date,3,2)+...; |
(最初の midstr 関数の引数の キーワードが文字列に置き換えられる) | |
→ |
midstr("99/08/02(月)",0,2)+"年"+midstr(date,3,2)+...; |
(置き換えられた!) |
→ |
midstr("99/08/02(月)",0,2)+"年"+midstr(date,3,2)+...; |
(最初の midstr 関数が処理される) |
→ |
"99"+"年"+midstr(date,3,2)+...; |
(処理された!) |
→ |
"99"+"年"+midstr(date,3,2)+...; |
(1番目と2番目の文字列が連結される) |
→ |
"99年"+midstr(date,3,2)+...; |
(連結された!) |
→ |
"99年"+midstr(date,3,2)+...; |
(続いて2番目の midstr 関数の引数 (キーワード)が処理される) |
→ |
... |
(以下最後まで) |
midstr
関数の引数のキーワードの処理と
2番目のそれの処理の間に、
ほんの僅かですがタイムラグがあることに注意しましょう。
普通、関数の処理時間は数ミリ秒、長くても数十ミリ秒ですから
大抵の場合はこれでも正しい動作をする、
つまり
全ての date
, time
キーワードが
同じ文字列に置き換えられる
ことでしょう。
しかし、例えばこのマクロがmidstr
関数の第1引数に
必ず同じ文字列を与える
5.3 文字列型変数 |
$a = "Hello";↓
|
$a
が変数の名前です。
先頭に "$" がついていますが、
これはこの変数が 文字列を入れるための変数(文字列型変数)
であることを表しています。
今の例では単純な名前を使いましたが、
"$" で始まって30文字程度の英数字からなる
好きな名前をつけることができます。
ちなみに、アルファベットの大文字・小文字は区別されるので、
$a
と $A
は
別の変数になります。
"Hello" = $a;↓
|
$a
に別の文字列を代入するまで…後述)
$a
という名前で
"Hello" という文字列を表すことができます。
例えば
$a = "Hello"; // 変数 $a に "Hello" という文字列を代入↓ |
Hello
」を挿入します。
(文字列型の)キーワードと同じように、
その中に入っている文字列が
insert
コマンドに引数として渡されるわけです。
ただ、変数はキーワードと異なり
マクロ中で中身(文字列)を入れ替えることができます。
$a = "Hello"; // 変数 $a に "Hello" という文字列を代入↓ |
World
」を挿入します。
なぜなら、変数 $a
には
1行目に代入した「Hello
」ではなく、
2行目で代入した「World
」が入っているからです。
$a = "Hello";↓ |
Hello World
」を挿入します。
ここで、
上のマクロは最終的に挿入する文字列(= "Hello World"
)を
$c
という変数に代入した後、
それをあらためて insert
コマンドに渡していますが、
キーワードの説明で登場したマクロのように
$a = "Hello";↓ |
$a = date + " " + time;↓ |
insert
コマンドに渡すように書き換えることもできます。
ただしこの場合、
$a
には代入文が実行された時の日付と時刻が
単なる文字列として代入されるだけで、
そのあといくら時間が経過しても
(別の文字列を代入しない限り)
中身は変更されないことに注意して下さい。
つまり、関数の節の最後の問題は
以下のように一度日付・時刻を変数に代入してから、
その変数(に入っている文字列)に対して
midstr
関数を使えばよいことになります。
$date = date; // 現在の日付を変数 $date に保存↓ |
(*1) |
C言語とは異なり、
「insert ($a = "Hello");」や
「$a = $b = "Hello";」
という書き方はできません。 (代入式それ自体が値を持たないため。) |
5.4 変数に文字列を追加する |
$a = "Hello";↓ |
$a = "Hello";↓ |
$a = $a + " World"; |
($a を文字列に置き換える) | |
→ |
$a = "Hello" + " World"; |
(置き換えられた!) |
→ |
$a = "Hello" + " World"; |
(文字列を連結する) |
→ |
$a = "Hello World"; |
(連結された!) |
→ |
$a = "Hello World"; |
(変数 $a への代入) |
$a
には
"Hello World"
という文字列が代入されているわけです。
この代入が一番最後に行われるというルールを知っていれば、
例えば
$a = "た";↓ |
演習問題 |
$a = rightstr("World",3); // "rld" を代入する↓ |
midstr("C:\\文書",3,2)
leftstr("C:\\文書",5)
rightstr("C:\\文書",2)
rightstr(leftstr("C:\\文書",5),2)