ab.xpo.p.a.pxepopopopopopopopopopopopopopopopopopopopopopopopopopopopopopo....まずabを逆順にpushし、xでa、bの順でpopします。a<bなのでループの処理内容po.pを実行します。.aで対応する.xに戻り、処理を繰り返します。Hello.s.c.pxeeelloまずHelloを逆順にpushします。.sで先頭のHが捨てられます。.cで次のeが増えます。スタックとは別で値を保存できる場所のことです。保存できる値は1つで、新しい値が古い値を上書きします。Hello.t.p.m.pxeelloHまずHelloを逆順にpushします。.tで先頭のHがpopされ一時領域に保存されます。.pでelloが出力されます。.mでHがスタックにpushされ、出力されます。実行を終了するFizzBuzzさて、プログラミング言語を始めたらまず書いてみるのがFizzBuzzということで、100までのFizzBuzzを考えてみましょう。ここまで紹介したコマンドでできます。はい、わかりませんね。答えはこれらしい[2]です。ak.-akbuzz.-ak4.-akfizz.-ak2.-1.p05.-.tab.z01.-.c.m.+.c.t05.-.%.w.s01.-.m03.-.%.W.s.m.nak.-.p00.-.c.c.c.a.wak.-fizz.p00.-.c.c.a.a.w01.-.m03.-.%.w.sak.-buzz.p00.-.c.c.a.wak.-fizzbuzz.p00.-.c.a.a.md2.-02.-.!.a.d.pxe解説していこうと思います。先頭から見ていきます。ak.-は先程の通り改行\nです。aとk、buzzがpushされます。ak.-akbuzz時点:a|k|b|u|z|z|\n(前が先にpopされる)次の.-では、先頭の2つaとkからまた\nがpushされます。a、k、'4'がpushされます。ak.-akbuzz.-ak4時点:a|k|'4'|\n|b|u|z|z|\n次の.-でも2つpopして\nがpushされ、fizzがpushされます。ak.-akbuzz.-ak4.-akfizz時点:a|k|f|i|z|z|\n|'4'|\n|b|u|z|z|\n次の.-でも2つpopして\nがpushされ、2がpushされます。ak.-akbuzz.-ak4.-akfizz.-ak2時点:a|k|'2'|\n|f|i|z|z|\n|'4'|\n|b|u|z|z|\n次の.-でも2つpopして\nがpushされ、'1'がpushされます。ak.-akbuzz.-ak4.-akfizz.-ak2.-1.p時点:|'1'|\n|'2'|\n|f|i|z|z|\n|'4'|\n|b|u|z|z|\nここまでで実行してみると以下のようになります。ak.-akbuzz.-ak4.-akfizz.-ak2.-1.pxe12fizz4buzzお、1~5までのFizzBuzzが出来てますね!確かに前から見た通り出力されています。.pで出力してスタックの中身が一旦空になるので、その先だけを考えましょう。05.-で5がpushされます。.tで5を一時領域に格納します。a、bをpushします。05.-.tab時点:a|b(一時領域:5)さて、.zでループが始まります。このループは最後まで続くループです。ループの深さを可視化してみましょう。.a.md2.-02.-.!.a.d.pxeいやわからんが......はい、まず.zで先頭2つが等しくなるまで処理を行います。最初aとbは等しくないので進みます。01.-で1をpushします。これを.cで複製し、.mで一時領域の5をスタックにpushします。05.-.tab.z01.-.c.m時点:5|1|1(一時領域:5)次に.+で前2つを足して6をpushします。この6が、現在判定しようとしている値です。.cで複製し、.tで1つを一時領域に格納します。05.-で5をpushします。.%で6を5で割った余り1をpushします。05.-.tab.z01.-.c.m.+.c.t05.-.%時点:1|1(一時領域:6).wで先頭が0でない限り処理を行います。現在判定しようとしている数が5で割り切れない場合は以降の処理を行うということです。.sでスタックを空にします。01.-で1をpushし、.mで一時領域の6をpushし、03-で3をpush、.%で6を3で割った余り0をpushします。05.-.tab.z01.-.c.m.+.c.t05.-.%.w.s01.-.m03.-.%時点:0|1(一時領域:6).W(大文字と小文字で特に違いはない)で同じく先頭が0でない限り処理を行います。現在判定しようとしている数が3で割り切れない場合は以降の処理を行うということです。5でも3でも割り切れない数値は、そのまま出力します。いうわけで、.sでスタックを空にし、.mで一時領域の値を持ってきて、.nで数値として出力します。ak.-.pで\nを出力し、00.-で0をpush、.cを3回行います。この04つで4つの.wから脱出します。その結果、.mで一時領域の値6をスタックにpushし、d2.-で50、02.-で2をpushし、.!で掛けて100をpushします。この100がFizzBuzzの上限となります。数値そのままではなくFizzやBuzz、FizzBuzzを出力するときも場合分けに従って行います。FizzBuzzの流れは大体こんな感じです。ak.-akbuzz.-ak4.-akfizz.-ak2.-1.p05.-.tab.z01.-.c.m.+.c.t05.-.%.w.s01.-.m03.-.%.W.s.m.nak.-.p00.-.c.c.c.a.wak.-fizz.p00.-.c.c.a.a.w01.-.m03.-.%.w.sak.-buzz.p00.-.c.c.a.wak.-fizzbuzz.p00.-.c.a.a.md2.-02.-.!.a.d.pxe12fizz4buzzfizz78fizzbuzz11fizz1314fizzbuzz1617fizz19buzzfizz2223fizzbuzz26fizz2829fizzbuzz(中略)8283fizzbuzz86fizz8889fizzbuzz9192fizz94buzzfizz9798fizzbuzz確かにFizzBuzzが100まで動きました!これで0バイトでFizzBuzzが書けるようになりましたね!おわり自分でもこういう面白いものを作りたいですね〜明日はYataka_MLくんの記事です。多重スリーブの世界と,各種進捗報告。