Io
インタプリタの動作方法を理解するための練習として書いた言語
言語自体はめっちゃシンプルで、ライブラリが豊富で複雑
Site
特徴
カスタマイズ可能なシンタックス
強力な並行性モデル
メッセージ解釈
インタプリタ
起動
$ io
実行
$ io hoge.io
メッセージ解釈
シンタックスはメッセージをチェーン接続
各メッセージはオブジェクトを返す
各メッセージにはカッコ付きで任意指定の引数を指定できる
すべてのものは別のレシーバを返すメッセージである
キーワードはないが、キーワードのように振る舞う文字がいくつかある
レシーバ メッセージという文法
code:io
Io> "hello world" print
↑レシーバ ↑メッセージ
「プロトタイプ(レシーバ)」に「メッセージ」を「送信する」
よくある関数 引数とは見た目が逆になるんだな
レシーバ
メッセージ
引数を取ることもある
プロトタイプに対して行う操作
オブジェクト
既存のオブジェクトのことをプロトタイプと呼ぶ
オブジェクトはプロトタイプをcloneして作成する
一番最初はルートオブジェクトをクローンして作成する
オブジェクトとはスロットの集まり
スロットとは、キーと値の組み合わせ
ハッシュみたいなやつ
スロットに代入されるものもオブジェクト
valueのこと
スロットへの代入には:=を使う
キーがない場合は、キーを作成してvalueを入れる
=もあり、こちらはキーがない場合は例外が発生する
ルートオブジェクトであるObjectにcloneメッセージを送信
新しいオブジェクトが返ってくるのでHogeに代入
code: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すると、スロットは受け継がれる
子のスロットを確認したときに、なければ親を辿って確認される
code: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すればいい
メソッド
メソッドもオブジェクト
code:io
method("hogehoge" println)
Hoge m = method("hogehoge" println) // スロットに代入できる
Hoge m // methodが呼ばれる
リスト
code:io
todo := list("hoge", "piyo") // リストを作成
todo size
todo append("fuga")
todo at(1) // アクセス
average, sumなどのメッセージもある
Map
code:io
e := Map clone
e atPut("key", "value")
e at("key")
あとで読む