三流プログラマの戯言

プログラミング初心者が気になったことを書き綴るだけ。主にc#

brainfuck 入門:非破壊 if

概要

今回は非破壊の if の説明をします。
コード的には重要ではないですが、考え方は重要なので記事を一個使って説明します。 本当は大小比較を説明したかったんですけど、そのためには非破壊 if の説明とその考え方を説明しないといけないことに気が付いたので先に説明しておきます。


目次


非破壊の if

構造の説明

以前の記事if の紹介を行いましたが、その時紹介したコードでは、判断に用いられた値は破壊されてしまいます。位置を変えないように [] を抜けるためには、値を 0 にしなければならないためです。 そこで、if 句の中で別のポインタに移動するというコードを書くことで非破壊な if を書くことができます。

[ code >]

ここで、これを実行してもらうとわかると思いますが、if 句が実行されるか否かで終了時のポインタの位置が変わってしまいます。 しかし、brainfuck にはメモリの絶対位置を知ることはできません。 そこで、相対位置によって現在の位置を検出します。 例えば

{0}{0}{1}

このような 0,1 番地が 02 番地が 1 となっているとします。 この時、現在位置が、0 番地か 1 番地のどちらかであるときに、 一つ右のメモリが 0 かどうかで現在位置を判断することができます。 具体的には 先のコードを利用して

>[<]

とすることで、開始位置が 0 番地か 1 番地かにかかわらず、終了位置は 1 番地となります。

非破壊 if のコード

以上を踏まえて非破壊 if のコードを書くと

>>+<<
[> code ]
>[<]<

となります。
1 行目は終了時のポインタ位置補正のために true にしています。
2 行目は if 文の本体で終了時に一つ右のポインタに移動していることに気を付けてください。
3 行目は if 句に入ったか否かで変わるポインタの位置を修正しています。

非破壊 if の応用

今回は非破壊の if を簡単に説明しましたが、かなり応用ができる構文です。
今回の非破壊の if 文では if 句の中でポインタは 1 しか移動させませんでしたが、大幅に移動させることもあります。 また、終了位置の修正を行わず、そのあとの挙動を大きく変えるといったこともできます。
ポインタの位置を変えることにより挙動を変えるという技術は、使えるようになると書けるコードの幅が大きく広がります。


次回

次回こそは、大小比較書きたいです。


記事一覧

brainfuck 入門:リンクまとめ - 三流プログラマの戯言