Io 2日目

7つの言語 7つの世界 Io編 2日目。1日目の最後に書いてある「プロトタイプの動作を確実に理解してほしい」という部分をちゃんとやっておかないと読み進めることが難しい。そのためにIo プログラミングガイドラインをしっかり読もう。

メソッドとcallスロット

method() はローカル領域にオブジェクトを作り、そのprotoポインタをターゲットにセットする。作成されたローカル領域のオブジェクトはcallというメソッドを持っており、メッセージに関するメタ情報を参照できる。

postOffice := Object clone
postOffice packageSender := method(call sender) // ローカル領域に作成されたオブジェクトのprotoポインタをpostOfficeのpackageSenderスロットにセット
mailer := Object clone
mailer deliver := method(postOffice packageSender)
mailer deliver // mailerオブジェクトが返される

call sender はメッセージの送り主(関数を実行したオブジェクト)を参照でき、 call target でメッセージの送り先(この場合は postOffice)を参照できる。

call によるメッセージリフレクションを使って unless を実装する例が載っていて面白い。

セルフスタディ

長いので3つだけ

フィボナッチ数列でn番目の値

fib := method( n,
if(n == 1 or n == 2,
1,
fib(n-1) + fib(n-2)))

0 除算の結果を inf ではなく 0 にする

Number の除算演算子を div に移動させてから再定義する。

Number div := Number getSlot("/")
Number / := method(n,
if(n==0,
0,
call target div(n)))

90 / 2 //=> 45
100 / 0 //=> 0

二次元配列内の数値の合計

Number を汚染しないようにしたいけど、どうすれば良いの……