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 を汚染しないようにしたいけど、どうすれば良いの……