2003lk入門

トップに戻る

をクリックすると非真理設定が非表示になります。ページを再読み込みすると戻ります。


ksi.2 基礎的な命令

lexn.7 f5と[指令](cersva)

ここまでにf0, f1, f2, f3, xxを使ってきましたが、まだ活用していない[メモ](firjal)としてf5があります。これは原理的には他の[メモ](firjal)と完全に対等ですが、慣用的に他のfirjalと異なった使い方をします。f5は通常[住所箱](setistafar)の番地を指し、「この番地より少し小さい番地は自由に使うことができるが、この番地以上は他人の支配下にある」という一種の縄張りを表します。

f5が23976であるとき

自由 自由 自由 使用中 使用中 使用中 使用中
23964番地 23968番地 23972番地 23976番地 23980番地 23988番地 23992番地

この仕組みは、様々に活用できます。例えば、今まで少し複雑な処理を書いていて「firjalの数が足りない」と思ったことがあるかと思いますが、そういうときに計算途中の値をf5より少し小さい番地の住所に退避させることで問題を解決することができます。

例えば、だいぶ先になるまで現在のf3の値は使わないな、と感じたときには、

nta  4 f5
kRz f3 f5@

と退避しておくことができます。こうすることで、2003fの状態は

f5は23972

自由 自由 退避したf3の値 使用中 使用中 使用中 使用中
23964番地 23968番地 23972番地 23976番地 23980番地 23988番地 23992番地

となるので、後になって必要になったら、

kRz f5@ f3
ata  4  f5 

としてやることで値を復活させられます。

f5は23976

自由 自由 退避したf3の値 使用中 使用中 使用中 使用中
23964番地 23968番地 23972番地 23976番地 23980番地 23988番地 23992番地

こうすると、操作をする前の元の状態に戻っていることを頭に入れましょう。厳密には23972番地の値が変わっていますが、なんせここは元から「自由」とされていたところなので、勝手に変更しても全く構わないのです。

このように、一時的な値の退避という面でf5はとても便利です。しかしながら、f5の一番のポイントは、[指令](cersva)という機構を実現するということにあります。

[指令](cersva)というのは、意味上ひとまとまりである処理に名前を付け、様々な場所から何回も使えるようにする仕組みです。[中央省](sysiten karmacist)が[国際協力院](kardzest ispien lefi'alir)に指令を出したとき、その指令を[国際協力院](kardzest ispien lefi'alir)が行う最中に[連邦外交院](kardzest fankasa'd iccesi'aviratust)にもう少し小さい指令を出す、ということは日常的にありますが、このようなことも2003fの[指令](cersva)では実現できます。

では、これを実現するのになぜf5が必要なのか、f5をどう使うのか、学んでいきましょう。

とても簡単な[指令](cersva)として、f0, f1, f2, f3をゼロにする処理である

kRz 0 f0
kRz 0 f1
kRz 0 f2
kRz 0 f3

という処理にiumesという名前を付けることを考えましょう。

まず、命令のまとまりに名前を付けるにはどうすればよいでしょう?これは既に学びました。

nll iumes
kRz 0 f0
kRz 0 f1
kRz 0 f2
kRz 0 f3

次に、主処理の中でiumesという指令を出すことを考えましょう。xxを明示的に変更しない限り命令列は上から実行されますから、主処理はiumesより上に書いて、

(ここに主処理がある)
kRz iumes xx

nll iumes
kRz 0 f0
kRz 0 f1
kRz 0 f2
kRz 0 f3

というふうに書きたいところです。

しかし、主処理からiumesという指令を出したら、指令が終わった後には主処理に復帰してそれを続行したいわけです。

では、次のようにすればよいのでしょうか?

(ここに主処理がある)
kRz iumes xx
nll snusnijal
(ここに主処理の続きがある)

nll iumes
kRz 0 f0
kRz 0 f1
kRz 0 f2
kRz 0 f3
kRz snusnijal xx

いいえ、これでは主処理が終わった後でもう一回iumesを実行してしまいます。ということでこうしましょう。

(ここに主処理がある)
kRz iumes xx
nll snusnijal
(ここに主処理の続きがある)
kRz lesback xx

nll iumes
kRz 0 f0
kRz 0 f1
kRz 0 f2
kRz 0 f3
kRz snusnijal xx

nll lesback
fen

これで完成でしょうか?

とりあえず、iumesというまとまりを作ってそれを分離することはできました。しかしこのままでは[指令](cersva)として使うには重大な欠陥があります。それは何でしょう?

答えは、「これでは再利用できない」ということです。たとえ他の場所で使いたいとしても、snusnijalは一つしかないのです。

つまり、iumesを2回使いたいとして、

(主処理その1)
kRz iumes xx
nll snusnijal
(主処理その2)
kRz iumes xx
nll snusnijal
(主処理その3)
kRz lesback xx

nll iumes
kRz 0 f0
kRz 0 f1
kRz 0 f2
kRz 0 f3
kRz snusnijal xx

nll lesback
fen

と書いたところでどちらのsnusnijalに行けばいいのか分からないのです。

これを解決するために、f5を使います。これを使って「戻るべき場所」を毎回退避しておくことで、iumesが終わった後に正しい場所に戻ることができるのです。

ということで、指令を出した側は「f5を4減らして場所を確保し、f5@に『指令から終わった後に戻るべき命令の場所』を入れておき、命令から戻ったらf5を4増やす」とすればよいでしょう。

それに対応して、指令を受けた側は「f5@には『戻るべき命令の場所』が入っているのだから、一連の処理が終わったらf5@xxに入れる」とだけすればよいのです。

さて、ではこれを2003lkで書いてみましょう。

例えば、こうなります。

(主処理その1)
nta 4 f5
kRz 1io f5@
kRz iumes xx
nll 1io
ata 4 f5
(主処理その2)
nta 4 f5
kRz 2io f5@
kRz iumes xx
nll 2io
ata 4 f5
(主処理その3)
kRz lesback xx

nll iumes
kRz 0 f0
kRz 0 f1
kRz 0 f2
kRz 0 f3
kRz f5@ xx

nll lesback
fen

さて、これで一応一件落着なのですが、毎回

nta 4 f5
kRz 1io f5@
kRz iumes xx
nll 1io
ata 4 f5

と書かねばならないのも面倒です。なんとか簡単に書けないでしょうか。

実は、次のように書けます。

nta 4 f5
inj iumes xx f5@
ata 4 f5

こうすると、短くなるだけでなく、毎回名前を付けなくてもよくなります。


前のページへ   次のページへ