PCホビイズムメーリングリストには、既にいくつかの文書を送信しています。
この文書は、一般性のある読み物なので、オータムマガジンにも掲載しておきます。
PCホビイズム(メーリングリスト含む)に関しては、PCホビイズム暫定ポータルをご覧ください。
ちなみに、Cでもこうやればスマートになるとか、他の言語ならこうだ!といった話題で盛り上がれば、PCホビイズム的には大成功です。
以下本文 §
以下は、PCホビイズムにおける「面白さのお裾分け」の実践テストとして書かれた文書です。
こういう文章が、日常的に多数のPCホビイストからファンに向けて送られるようになれば、なかなか楽しい日々が過ごせそうですね。
計算型goto文・複雑な条件判断と分岐をたった1行にまとめられる超効率構文!!
概要:
初期の小型BASIC言語等に備わっていた計算型goto文という機能を使うと、僅かなコードで複雑な機能を書けて面白いっす。
対象読者:
プログラミングに興味のある人
書いた人:
川俣晶 (autumn@piedey.co.jp)
● 初期の小型BASIC言語とは
初期の小型BASIC言語のTiny BASIC等は、基本的に行番号を付けてプログラムを記述します。
以下は典型的なハローワールドです。
10 print "Hello Wolrd!"
20 end
プログラムは、行番号の少ない行から多い行に向かって実行されます。
この流れを変更する機能がgoto文です。
たとえば、20行目でプログラムを終了させず、処理を10行目に戻すには以下のよう書き直します。
10 print "Hello Wolrd!"
20 goto 10
このプログラムは、強制的に停止させるまでHello Wolrd!の出力を続けます。
ここで、goto文が飛ぶ先となる行番号は数式にできます。(小型ではない本格BASICでは定数しか書けない。あくまで小型のBASICのみ)
つまり、以下のように書いてもOK!
10 a=4
20 goto a*10
30 print "私を飛ばさないで~"
40 print "Hello Wolrd!"
このプログラムは、変数aに4という値を入れた後、goto文の飛び先としてa*10という式を指定しています。計算の結果、これは40ですから、40行目からプログラムの続きを実行します。つまり30行目を飛ばしてしまいます。
これが計算型goto文です。
● Cのswitchよりもスマートだよ!
計算型goto文を使うと、Cのswitchよりもスマートに書けるケースがあります。(Cに似た構文の他の言語であるJavaやC#等でも同様)
たとえば、「じゃんけんプログラム」を作っているとき、変数aの値が1ならグーの処理を、2ならチョキの処理を、3ならパーの処理を書くとします。
Cのswitchを使うと以下のようになります。
switch(a)
{
case 1:
グーの処理
case 2:
チョキの処理
case 3:
パーの処理
}
計算型goto文を使うと以下のように記述できます。
10 goto a*100
100 グーの処理
200 チョキの処理
300 パーの処理
Cで9行だったものが、計算型goto文を使うとたった4行になってしまいました。
● 込み入った条件を数式で処理
でも、単純に番号が揃っていない場合には使えないだろう……と考えるのは甘い!
たとえば、1のときは100行目、2のときは270行目、3のときは310行目……のような不揃いな飛び先でも大丈夫。
こういう数式もありだからです。
goto (a=1)*-100 + (a=2)*-270 + (a=3)*-310
ちなみに、条件式は成立しているとき-1に、していないときは0になります。たとえばaが1の時、この式の値が100になることを確かめてみてください。
別のやり方として、飛び先行番号を配列に入れおくという方法もあります。
@(1)=100
@(2)=270
@(3)=310
goto @(a)
ここで、@(……)は括弧内の式を添え字として配列にアクセスする構文とします。配列の値を入れるのは最初の1回だけでOKです。あとはgoto @(a)だけ書けば飛びます。
さて、値が一定の範囲ではないときにはエラーを処理する行に飛ばしたいときも簡単。たとえば、変数aが1~3の場合はa*100に飛ばし、それ以外の場合は900に飛ばす場合は以下のように書けます。
goto (a>=1 and a<=3)*(a*100) + (a<1 or a>3)*900
実はこの手のテクニックを多用すると、他のプログラム言語で複数の行を要する条件判断を1行で書けることが珍しくありません。つまり、条件のロジックを解析し、それを数式に置き換えることができれば、複数条件の場合分けを1行にまとめられます。
● 計算型goto文の弱点
・計算式が行番号に依存するので、うかつに行番号を変えられない。行を挿入して行番号が詰まってきたときにも、容易に振り直しができない。
・直感的にどのような条件の時、どの行に飛ぶのかが分かりにくい。
いずれも、生産性を気にするなら、致命的な弱点と言えます。滅んで当然です。
しかし、極限まで効率を上げたい場合には有効な手法です。低レベルのプログラミングでは、計算型goto文と似た技術が使われることは珍しくありません。たとえば、アセンブラの世界では、計算型goto文に相当する「間接ジャンプ」という機能が常識的に使われています。
● ここが面白いよ、計算型goto文!
やはり、複雑な条件が1行で書けるといういのが面白いですね。
10行ぐらいかな……と思ったコードが1行でできてしまうと、書いた本人にも驚きです。
更に、「この条件判断がソースに見あたらないよ。どこでやってるの?」「この1行だよ!」「えっっっ!?」といった驚きを引き出せればしてやったり……という感じですね。
下記のワンべぇを作成した理由の1割ぐらいは、計算型goto文を再度実現するためだったのは事実です。
● 補足
世の中には、サブルーチン呼び出しを行う計算型gosub文も存在しますが、同様のテクニックが使用できます。
● 計算型goto文が今すぐ試せるソフト
(他にあればご一報を)
・ワンべぇ: WONBE, WonderWitch BASIC Environment
WonderWitch用の簡易BASIC言語『ワンべぇ』
http://www.piedey.co.jp/wonbe/
WonderWitch用とWin32用のソースとバイナリを含みます。
手っ取り早く試すには、これに含まれるWin32バイナリーを実行するのが早道かも。
・ワンべぇWM: An Tiny BASIC for Windows Mobile 5.0
Windows Mobile 5.0用超小型BASICインタプリタ
http://www.piedey.co.jp/softs/wonbeWM.html
W-ZERO3があればすぐに動きます。W-ZERO3だけで全ての機能が動作します。
終わり