第3-10話 無限ループって、何だ!?
「『エンチャントウェポン』の術式の基本は3点。武器から刃の部分を見つけ、そこをほぼ等間隔の区間に分割し、各々を構成する分子に振動を与える。まず刃の検知だが、searchサブルーチンを使う。これは『ヒール』の術式の痛覚遮断の部分でも、『感覚を脳に伝える線』の位置を検知するのにも使っているが、今回は2つ目の引数の"position"に武器を、3つ目の引数に"edge"を入力する事で、最後に追加された引数"theta"…面どうしの成す角度がtheta以下の箇所を刃とみなしてるんだ。それを、指定した位置から、4つ目の引数…距離”d”の範囲内から刃を見つけ、代数aに代入して出力する。」
「つくづく私達の癒しの奇跡も、魔術師の呪文と同じなんですのね。同じさぶるーちん?を使っているなんて…」
キュリアが感心した様に言う。
「次に、サブルーチン"createmesh"で、刃を等間隔の区間…『要素』に分割する。」
「四大元素は無いのに、要素はあるのね…」
以前の話を思い出しながらアゲハが言う。
「まあ、用語の名づけは必要だからな…要素の集合体が、『メッシュ』だ。」
「網!?」
ヒサゴが聞きなれない言い回しに戸惑う。
「この言葉の意味は後で説明する。とにかくその各々の要素を1単位として、各々を構成する分子に振動を与える。これが術式のその後の部分だ。」
「なんか、振動部分がやたら長い上に、同じ様な部分が2つあるんだけど…」
アゲハが自身に構築された術式を見ながら言うと、
「それも後で説明する。分子ってのは、冷たいと静止しているが、熱を加えるとブルブル震えて、その振動は、温度が高ければ高いほど大きくなって、ついには分子間力を振り切って分離してしまうんだ。」
「分かってきたわ…」アゲハが得心した様に言う。「つまり、のこぎり引きを実現するために、分子にエネルギーを与えて振動させ、その振動で分子が分離…刃が壊れない様に、分子間力を補強するエネルギーを与える、それが、vibrationサブルーチンの2つ目と3つ目の引数、joulevとjoulebなのね…」
ロクスケはニヤリと笑い、
「やはりお前は賢いな!それで、ここからはさっきの質問への回答だが…まず、ヒサゴが言った『メッシュ』だが、"createmesh"サブルーチンは『プロテクト』…シールドやアーマーへの防御力強化の術式にも使っているんだ。防具の表面の分子結合を強化するために、まず防具の表面を検知して、そこを小さな多角形に分割して、各々に強化を与える形で…その有様が、『網』に似てるから、『メッシュ』と呼んでるんだ。たとえそれが二次元ではなく一次元…面状ではなく線状であっても…」
「はあ…」最後の難しい部分が分からず、曖昧な返事をするヒサゴ。
「そしてアゲハが言った、同じ様な部分が2つある理由だが、これは、対象の武器が自分の物か他人の物かでif文を分岐させている。」
「ああ、確かに…」
「それで、『エンチャントウェポン』の最後の引数はoptionは、対象武器が自分の物である場合は『真』が入り、他人の武器である場合は、振動させる時間…秒数が入る。」
「『真』………!?」
「ああ…こっちの方は少し応用がかかってるから、先に他人の武器である場合を読んで理解してみろ。」
言われてアゲハはelseの後の方を読み始める。
「え!?えーっと…"for next"のループの中に、"vibration"…さっき作った全ての要素一つ一つに振動を与える…"vibration"の最後の引数optionは振動させる時間。指定した時間だけ、振動させる…まあ、これは確かに分かりやすいわね。問題は"else"の前、自分の武器に対する場合よね。"vibration"の中の時間指定がdeltat…1秒に固定されてる上、"do while"って、何!?ファイヤーボールの術式にも、サブルーチンの中にあった様な無かった様な…最後に"loop"ってあるから、ループの一種なのかしら!?しかもこれが、二重に…」
「ああ、それも繰り返し…ループの一種だ。"for next"は決まった回数だけの繰り返しだが、"do loop"は、"while"の後の条件を満たす間ずっと繰り返す事になる。うっかり絶対に満たさない条件を与えちまったら、魔力が切れるまで止まらない無限ループに陥ってしまうが、そうならない様に気を付けて使いさえすれば有効だ。」
「えーっと、内側の"do loop"の中は、"input(option)"と、"t=nowtime"…"do loop"の前にもtとtstartにnowtimeを代入してて…"do loop"の中で毎回tをnowtime…現在時間で更新してて…tstartに開始時の時間を保存しといて、tstartからの経過時間がdeltat*0.999…約1秒を過ぎるまでループし続ける…それを外側の"do loop"でoptionがTrueの間ずっと続ける…」
「内側の"do loop"には"input(option)"も入っているだろう!?ここで入力を受け付けて、optionに"False"が入力されたらどうなる!?」
アゲハはハッとして、
「外側の"do loop"で"while"以下の条件が満たせなくなり、外側の"do loop"から出る!!つまり自分の武器に『エンチャントウェポン』をかけた場合、自分で"False"と念じるまでエンチャントが持続するって事!?」
「ご名答だ!!」
ロクスケは満足げに言った。
「…でも何で、内側の"do loop"も"for next"文にしないわけ!?これって1秒待つ間の時間稼ぎでもあるのよね!?"for next"ループの所要時間を測って、ちょうど1秒経過する回数だけ指定してfor文で繰り返してもいいんじゃない!?」
「ああ、それは俺も考えたんだが…人間の頭の回転の速さには個人差があるから、固定で何回って決められないんだ。お前なんか、術式で使える最大の数だけループしても1秒経たないだろうな。」
「ひっどーい!!あたしを化け物か何かだと思ってるわけ!?」
アゲハは唇を尖らせて拗ねてみせた。キュリアは側でため息をつき、
「全く…この様な話になると、アゲハさんの独壇場ですわね…」
「…いくつか質問、いいかな…!?」
ヒサゴが手を上げる。
「おう、何だ!?」
「話の最初の頃に言ってた、刃を一定長さのエレメントに分割して振動させるって話…つまりそれは、エレメントの数が多い程、魔力消費が高くなるからそうしてるって事!?」
「そうだ。だから、剣なんかの刃の長い武器へのエンチャントは、本職の魔術師じゃなきゃ出来んだろうな。」
「そう…じゃあもう一つ。この術式…『エンチャントウェポン』も、自分の武器にかけるより、他人の武器にかけた方が、魔力消費が大きいんだよね!?なんか、自分にかける方が色々何行も書かれてるけど…」
「そうだ。他人にかける魔力負荷の方が大きい。」
ロクスケは頷いた。
「…質問は以上だよ。ありがとね。」
ヒサゴがそう言うと、ロクスケは、
「他に質問は無いか!?…なら、俺の講義はここまでだ。」
おまけ
アゲハ「つまり、これは…
for i=1 to imax
:
next i
こう書き換えられるって事ね。
i=1
do while i<=imax
:
i=i+1
loop」
ロクスケ「そういう事だ。」




