フィボナッチ数をiokeで、3通り試す
関数に定義する:
iik> fib = method(n, if(n == 0, 0, if(n == 1, 1, fib(n-1) + fib(n-2)))) +> fib:method(n, if(n ==(0), 0, if(n ==(1), 1, fib(n -(1)) +(fib(n -(2)))))) iik> fib(10) +> 55
整数オブジェクトのメソッドとして定義する:
iik> Number Integer fib = method(if(self <= 1, self, ((self-1) fib) + ((self-2) fib))) +> fib:method(if(self <=(1), self, ((self -(1)) fib) +((self -(2)) fib))) iik> 10 fib +> 55
で、本当にやりたいのは下:
0 fib = 0 1 fib = 1 Number Integer fib = method(((self-1) fib) + ((self-2) fib))
固定値に対しては、その数値に対して直接値を突っ込む。とすると、一般式の中ではif文を排除できて蝶気持ちいい。
でも、iikでやると:
iik> 0 fib = 0 +> 0 iik> 0 fib *** - couldn't find cell 'fib' on 'Ground' (Condition Error NoSuchCell) 0 fib [<init>:1:2] The following restarts are available: 0: storeValue (Store value for: fib) 1: useValue (Use value for: fib) 2: abort (restart: abort) 3: quit (restart: quit) dbg:1> 0 dbg:1:newValue> 0 +> 0 +> 0 iik> 0 fib +> 0
- 「0」オブジェクトに対して、セル「fib」を作成。
- 「0」オブジェクトに対して、セル「fib」の内容を取得…しようとすると、「そんなセルはない」とおこられる。
- で、仕方がないからエラー処理内で「storeValue」を選択し、値「0」をセット。
- 「0」オブジェクトに対して、セル「fib」の内容を取得…しようとすると、今度は大丈夫らしい。
ところが、次に「1」オブジェクトに対して「fib = 1」をセットしようとすると、どうにも出来ない。リテラル上はセットできないし、怒られるタイミングでセットしようとしても、「0」オブジェクトのセル「fib」を取ってきてしまって、怒られなくなる。
数値オブジェクトに対して直接セルを作ること自体は大丈夫なんだけど、多分構文解析上、「数値リテラルオブジェクト」を使っているような扱いになって、「数値リテラルオブジェクトにセルfibをセット」みたいになるのかなー。と思いつつも、色々コネコネしてたらそうでもないらしい…。iolanguageでは問題なくできたところだけど。
んー、3番目のやり方が面白いと思うんだけどなー。