generated at
Io
Steve Dekorteが2002年に開発
インタプリタの動作方法を理解するための練習として書いた言語
言語自体はめっちゃシンプルで、ライブラリが豊富で複雑

Site

特徴
prototype言語
カスタマイズ可能なシンタックス
強力な並行性モデル
メッセージ解釈

インタプリタ
起動
$ io
実行
$ io hoge.io

メッセージ解釈
シンタックスはメッセージをチェーン接続
各メッセージはオブジェクトを返す
各メッセージにはカッコ付きで任意指定の引数を指定できる
すべてのものは別のレシーバを返すメッセージである
キーワードはないが、キーワードのように振る舞う文字がいくつかある
レシーバ メッセージ という文法
io
Io> "hello world" print ↑レシーバ ↑メッセージ
「プロトタイプ(レシーバ)」に「メッセージ」を「送信する」
よくある 関数 引数 とは見た目が逆になるんだな

レシーバ


メッセージ
引数を取ることもある
プロトタイプに対して行う操作


オブジェクト
既存のオブジェクトのことをプロトタイプと呼ぶ
オブジェクトはプロトタイプをcloneして作成する
一番最初はルートオブジェクトをクローンして作成する
オブジェクトとはスロットの集まり
スロットとは、キーと値の組み合わせ
ハッシュみたいなやつ
スロットに代入されるものもオブジェクト
valueのこと
スロットへの代入には := を使う
キーがない場合は、キーを作成してvalueを入れる
= もあり、こちらはキーがない場合は例外が発生する
ルートオブジェクトである Object にcloneメッセージを送信
新しいオブジェクトが返ってくるのでHogeに代入
io
Io> Hoge := Object clone Io> Hoge piyo := "kontiwa" // `piyo`というキーに"kontiwa"を入れる Io> Hoge piyo // 値を取得. Hogeにpiyoを送信している Io> Hoge piyo = "oyasumi" // `=`でも`:=`でも再代入できる Io> Hoge fuga = "hello" // keyがないものに`=`を使うと例外発生
clone直後のHogeはObjectと全く同じもの?
slotNames
オブジェクトの全スロットの名前を取得する
type
typeを確認
getSlot("keyName")
スロットの中身を取得

プロトタイプをcloneすると、スロットは受け継がれる
子のスロットを確認したときに、なければ親を辿って確認される
io
A := Object clone // 親を作成 A a := "a" // Aにaを追加 B := A clone // 子を作成 C := B clone // 孫を作成 C a // Cのaを確認。Cにはaはないので、Bが確認されるがないので、Aのaが見られる



インスタンス
インスタンスを生成したければ小文字始まりでプロトタイプをcloneすればいい


メソッド
メソッドもオブジェクト
io
method("hogehoge" println) Hoge m = method("hogehoge" println) // スロットに代入できる Hoge m // methodが呼ばれる

リスト
io
todo := list("hoge", "piyo") // リストを作成 todo size todo append("fuga") todo at(1) // アクセス
average , sum などのメッセージもある

Map
io
e := Map clone e atPut("key", "value") e at("key")



あとで読む