場合分け(IF文)

場合分けなんて出来たっけ!?っていう人も少なくないと思います.
具体例を挙げましょう.まず次のように書きます:

a(X):s

Xは数値引数です.これは,次のように解釈できます:

Xが1以上ならばsを実行,0以下ならば何もしない.

つまり,この3bytesで既に場合分けのようなものを書いていることになります.
数値引数が0以下ならば何もしないという取り決めが,既に場合分けそのものなのです.


さて,もう少し意味のありそうなものを書いてみましょう.
例えば次のようにします:

a(X):s
b(X,Y):a(10-X)Yrb(X+1,sY)
b(1,)

実行してみると,平凡なうずと見せかけて少し変わっていますね.
a(10-X)はXが1以上9以下ならばs,そうでないならば何もしない
となるためです.また,a(2-X)とすると,「X=1のときだけs」ということも
可能になります.もちろん"s"の部分に何でも入れられる

a(X,Y):Y

なんていうコードも便利なことがあります.


Herbertは,数値引数に頼るとbytes数が膨らみやすいです.
特に,場合分けは多くのbytes数を必要とします.
大半の問題では,場合分けなしに乗り切る方法を考えた方がよいでしょう.
なお,「目の前が壁なら…,そうでないなら…」のような場合分けは恐らくできません.


次のようなコードが重要な問題もあります.コードの意味は皆さんが考えてみてください.

a(X,Y):Y
b(X,Y,Z):a(2-X,Z)b(X-Y,Y,Z)


最後に細かい注意です.次の4bytesコードを実行しようとするとエラーになります.

a(X):s
s

a(X)を定義して使っていません.「定義したものを使っていない」という理由で
動作しないことはないのですが,この場合はXが数値引数を表すのか,命令引数を
表すのか判断できないため,エラーとなるようです.
以前どこかで,「a(数値)とa()で両立できて縮まる!」と思ったことが
ありましたがダメでした(笑)


戻る inserted by FC2 system