この解説は文系のプログラムなんて知らないユーザー向け、ではあるのですが、有名な『プログラム言語 C』という本の最初から2つめ(1つめはこの解説の (1) みたいなものです)の例をQXマクロで書いてみました。
'華氏と摂氏の対照表を出力 1| proc main 2| if @hwnd = 0 then exit proc 3| dim fahr, celsius 4| dim lower, upper, stepsize 5| lower = 0 '表の華氏温度の最低の値 6| upper = 300 '同じく、最高の値 7| stepsize = 20 '1段階で上げる温度の幅 8| fahr = lower 'まず、最低に設定した温度から 9| do while fahr <= upper 10| celsius = 5 * (fahr - 32) / 9 11| @Insert cformat$("%6d%6d", fahr, celsius) 12| @CharReturn2 13| fahr = fahr + stepsize 14| loop 15| end proc
このマクロも、「マクロをつくろう (1)」の例と同じく「@Insert」を使っていますので、直接編集中のファイルに文字を書込みます。ですから2行目の「編集中のファイルがないときは中止」の命令はあったほうがいいですね。
3行目と4行目は変数の宣言です。すべて数値変数で「整数」です。まとめて1行で書いても同じです。(QXマクロには浮動小数点の変数はないので、小数点以下がつく数値をあつかうには、10を何個かかけて整数にして扱う必要があります。)
5行目から7行目は数値の設定です。その数値を使って9行目から14行目までで実際の作業をしています。いちど設定してずっとそのままなので、「dim」ではなく「const」を使って「const lower = 0」のように宣言することもできます。
9行目の「do while 〜」と14行目の「loop」はペアで、ある条件が満たされているあいだは繰り返す、という作業をします。「マクロをつくろう (4)」では繰り返しの最初の数値と終わりの数値がきっちり決まっていましたが、こちらは「条件があっているかぎり」ということなので、いろいろ応用できる繰り返しです。ここでは「fahr の数値が upper 以下の場合」繰り返しが実行されます。
10行目では華氏の数値を摂氏に変換しています。「*」は「かける」、「/」は「前のものを後ろのものでわる」ですね。このへんは文系には目新しいですが、プログラム関係では共通みたいです。それから、「fahr - 32」という引き算はカッコでくくってありますが、これは学校で習った優先順位の問題のためですね。カッコのなかが先、です。さらに上記の本では、どうしてここで「わり算は最後」なのかという理由も解説されています。すなわち、整数のわり算は「小数点以下切り捨て」になるので、途中で切り捨てになってあとがぜんぶ狂ってこないように、最後に持ってくるのですね。
で、計算して変数 celsius に受け取った数値を11行目で編集画面に書き込みます。「@Insert」、「cformat$」ともに、「マクロをつくろう (4)」ですでに出てきています。「%6d」というのは6桁の幅をとってそのなかで、10進数で表記する、という意味です。ひとつめの「%6d」のところに fahr の数値が、ふたつめのところに celsius の数値が、順に入ります。
ここで、dim で宣言した fahr と celsius は、とくにどの型の変数という宣言をしていませんので、デフォルトの「長整数型数値変数」になります。ですから「小数点以下切り捨て」で計算結果が入ります。
13行目で fahr の数値を stepsize ぶんだけ増やして、繰り返します。
出力結果はこんなふうになります。
0 -17 20 -6 40 4 60 15 80 26 100 37 120 48 140 60 160 71 180 82 200 93 220 104 240 115 260 126 280 137 300 148
わ〜い、本と同じだ。と、単純にうれしかったりします。(うれしくなかった場合……、う〜ん、楽しみとか趣味ではなく、純粋に必要でマクロをつくる、ということもありますよね。そっち路線の、これは準備ってことで。)
さて、Cの本ではこのあと小数点以下まで計算するより正確なバージョンの説明となり、浮動小数点変数が出てくるのですが、QXではこれはできません。というわけで、100倍の数字でぜんぶ計算して、最後の表記のところで小数にしてみましょう。
'華氏と摂氏の対照表を出力(小数点以下も) 1| proc main 2| if @hwnd = 0 then exit proc 3| dim fahr, celsius, temp$ 4| dim lower, upper, stepsize 5| lower = 0 '表の華氏温度の最低の値 6| upper = 300 '同じく、最高の値 7| stepsize = 20 '1段階で上げる温度の幅 8| fahr = lower 'まず、最低に設定した温度から 9| do while fahr <= upper 10| celsius = 500 * (fahr - 32) / 9 11| temp$ = cformat$("%6d", celsius) 12| temp$ = left$(temp$, 4) + "." + right$(temp$, 2) 13| @Insert cformat$("%6d%7s", fahr, temp$) 14| @CharReturn2 15| fahr = fahr + stepsize 16| loop 17| end proc
10行目で計算した結果を11行目で6桁の「文字列」に変換し、12行目でこの6桁を最初の4桁とあとの2桁にわけてあいだに「.」をはさんでいます。そしてそれを13行目で出力。「%7s」というのは7桁の「文字列」ということです。
また、ここで出てきた繰り返し部分の、
do while fahr <= upper (命令) fahr = fahr + stepsize loop
のところは、
for fahr = lower to upper step stepsize (命令) next
と書いても結果は同じです。