→をクリックすると非真理設定が非表示になります。ページを再読み込みすると戻ります。
kRz
命令の別用途ここまで、kRz
・ata
・nta
と3種類の命令を学んできましたが、この3つの命令では今のところ数を複製したり足したりすることしかできません。また、足し算を何千回も繰り返すには、足し算命令を何千回を書くしかなさそうです。
…本当にそうでしょうか?なにか見落としはないでしょうか?もう一度2003fの基本動作を見ていきましょう。
ここで、「2. nxの指す命令を実行する」ことによってxx
の値を上書きしたらどうなるでしょうか?「3. xxの指す命令をnxも指すようにする」によりその値がnx
に伝播し、次の「1.」で新nx
の次をxx
が指すようになります。そうして新nx
の指す命令が実行されるので、結果としては「上書きされたxxの指す場所に飛んでいって実行することができる」ということになります。
しかし、「上書きされたxxの指す場所に飛んでいく」といっても、飛んでいくべき場所が具体的にどんな数値で表されるのでしょう?今の我々にはそれを知る手段がありません。そのために使うのが nll
という[擬似命令](xlaiso'd xalergerl)です。
擬似命令というのは、2003lkで記述されるけれど2003fが直接実行する[命令](xlaiso)ではないもののことでしたね。
nll
は「[次に述べるもの](ny la lex)」の略で、直後に名前を書き、その後に命令を書くことで、その命令に名前を付けることができます。
つまり、
kRz 3 f2 nll polta1 ata f3 f2 kRz f0 f3@
と書くことで、ata f3 f2
に対してpanqa
という名前を付けることができます。
なお、当然ながら、
kRz 3 f2 nll polta1 ata f3 f2 nll polta1 kRz f0 f3@
のように名前が重複することは禁止されていますし、
kRz 3 f2 nll f0 ata f3 f2 kRz f0 f3@
のように、既にfirjalの名前として使われているものをnll
で使うのも禁止されています。
名前を付けた場所に飛んでいくためには、その名前を直接xx
にkRz
することで実現できます。
kRz 3 f2 kRz polta1 xx kRz 5 f2 nll polta1 fen
とすると、最後までたどり着いたときのf2
の値は5ではなく3になります。
なお、ここではpolta1
という名前を定義する前にkRz polta1 xx
と書いていますが、これは許されます。
では、このように書くとどうなるでしょう?
nll polta1 ata 1 f0 kRz polta1 xx
お分かりですね、永遠にf0
に1を足し続け、いつまで経っても抜け出すことができません。
今まで実現できなかった「繰り返し」ができるようにはなったものの、決して抜け出せないのではそこまで役に立ちません。次は、そのような機構を実現するための方法について学んでいきましょう。