info

書籍「7つの言語7つの世界」Io言語2日目セルフスタディ

http://github.com/yppp/sevenlang

二次元配列の総和

dim2sum := method(n, n flatten sum)
dim2sum := method(n, n prepend(0) reduce(x, y, x = x + y sum))

Listに自分で定義した平均を求めるメソッドを追加、数字以外が混ざっていたら例外を投げるように

List myAvg := method(reduce(x, y, if(y proto != Number, Exception raise("二度と数字以外を入れるんじゃねーぞ、バーカ!"), x + y))  / size)

二次元配列を現わすプロトタイプを書くdimはxとyの大きさのリストを確保、ゲッターとセッター、transposeは行列で言う所の転置をするメソッド

Dim2list := Object clone do(
dim := method(x, y, result := list(); y repeat(nl := list(); x repeat(nl append(nil)); result append(nl)); self lis := result);
set := method(x, y, val, self lis at(y) atPut(x, val); self lis);
get := method(x, y, self lis at(y) at(x));
transpose := method(
                        result := Dim2list clone;
                        write(self lis at(0) size, self lis size, "\n");
                        result dim(self lis size, self lis at(0) size);
                        self lis at(0) size repeat(i,
                        self lis size repeat(j,
                        write(i,j,"\n");
                        result set(j, i, self get(i, j)))));
)

ファイルから二次元配列を読んだり書いたりする

maread := method(path, lis := list(); File open(path) readLines foreach(line, lis append(line split(" ") select(v, v != "") map(v, v asNumber))); File open(path) close; lis);
mawrite := method(path, lis, f := File open(path); lis foreach(v, f write(v join(" ") append("\n" at(0)))); File open(path) close;  lis);

数当てゲーム、前の答えより近づいたか遠くなったか答えるたび表示する

hitandblow := method(
           f := File standardInput
           num := (Random value(99) + 1) floor;
           prev := 0;
           10 repeat(i,
           in := f readLine asNumber;
           if(num == in, "hit!" println; break);
           if(prev != 0, if(prev > ((num - in) abs), "near" println, "far" println));
           prev = (num - in) abs;
           if(i == 9, write("fail ", "atarinumber ", num));
           );
)