7つの言語7つの世界 Ruby 3日目
試してみよう
感想等
3章はRubyのメタプログラミングの紹介、メタプログラミングとはプログラムを書くプログラム
Rubyの機能を使えばDSL(ドメイン固有言語)を構築することが簡単に出来る(らしい)
メタプログラミングRuby欲しくなった。
Rubyの3日分の「試してみよう」の他の人の解答見ると、奇麗なコード多すぎて嫉妬。
読んでる間ずっとリファレンスマニュアルと睨めっこだった。
もっとちゃんとした本を一冊かって頭に叩き込まれるまで勉強したいなぁ。
一番良いのは忘れないように毎日何か書く事だろうけど。書かないと何回も調べたことでも忘れちゃう気がする。
試してみようの3日目
元々定義されてるメソッドと同じheadersが設定されてたらmethod_missing呼ばれない。
なので定義されてるメソッドをundefしていく必要があるみたい。
メソッドをまっさらに消すのをブランクスレートと呼ぶらしい。
メタプログラミングに利用出来る機能
本見ながら書いたもの
7つの言語7つの世界 Io 1日目
探してみよう
- Ioの問題点
- 「"Io言語" 問題点」で探したら7つの言語7つの世界関連のものしか引っかからない
- 日本語の情報が少ない「"Io言語" 問題点」でググったら235件…
- 英語でも情報がすくない。Newest 'iolanguage' Questions - Stack Overflow
- 質問に答えてくれるIoコミュニティ
- Ioのイディオムに関するスタイルガイド
確認してみよう
- Ioは強く型付けされた言語か? 弱く型付けされた言語か?
- Ioは強く型付けされた言語。1 + "one"はエラー
- 0、空文字列、nilは真か偽か?
- プロトタイプのスロットの確認
- proto slotNames、protoでプロトタイプを取得してslotNamesメッセージ送る
- =、:=、::=の違い
- a = 1はupdateSlot("a", 1)、a := 1はsetSlot("a", 1)、 a ::= 1はnewSlot("a", 1)にコンパイルされる
- =はスロットに値を入れる。スロットが存在していない場合例外を投げる
- :=はスロットを作成して値を設定。
- ::=はスロットとセッター(fooだったらsetFoo)を作成して値を設定
試してみよう
- ファイルからIoのプログラムを実行
- $ io -hでヘルプ見れる。普通にファイル名渡せばいいみたい。
- $ echo '"Hello, Io!" println' > day1.io; io day1.io
- スロットの名前を指定して格納されているコードを実行
$ io Io 20090105 Io> a := Object clone ==> Object_0x10268e620: Io> a fuga := method("fuga" println) ==> method( "fuga" println ) Io> a fuga fuga ==> fuga Io>
これでいいかな?他の人の見たら
Io> a getSlot("fuga") call fuga ==> fuga Io>
でした。
感想等
「問題は何をするか」ではない、「何をしないか」だ
フェリスはある朝突然に - Wikipedia
に出て来る台詞らしい。
かっこいい。
JavaScriptと同じようなプロトタイプベースのオブジェクト指向言語。言語自体は凄くシンプル。
プログラミング言語の仕組みを勉強するために作ったらしい。なんかすごい。
JavaScriptは人気すぎるからIoにした、って本の最初の方で書いてたけど、Ioは日本語の情報少なくてちょっと困りそう。頑張って最後まで読む。
io languageに書かれてるfeatures見ると
とりあえずbrewで入れました。
$ brew install io
雑記
- Objectが一番てっぺん、Objectにcloneメッセージ送って新しいオブジェクトを作る。
- オブジェクトはスロットを持つ。slotNamesというメッセージを送ると持ってるスロットが確認出来る。
- 代入は=、スロットが存在しないのにFooObject = "foo"するとエラー
- 無かったら新しく作ってくれるのが:=
- 全てのオブジェクトはtypeに答える
- 5 typeするとNumberが帰って来る
- 大文字で始まる名前のオブジェクトはタイプ
- 送られてきたメッセージに答えらなかったらプロトタイプに転送する
- Ioではタイプも、タイプを元に作成されるオブジェクトも、どちらもオブジェクト。
- メソッドの定義はmethod()、methodのタイプはBlock。メソッドもオブジェクト。
- getSlotでスロットの値を取得出来る。スロットが無かったら親のスロットを辿る。
- protoメッセージを送ると自分のプロトタイプが取れる
- REPLも実はオブジェクトのメソッド内で実行してるのかprotoと打つと親が帰って来る
- Lobbyに全ての名前が入ってる
- コレクション
- List
- ObjectのlistメソッドでListタイプのデータが作れる
- Listにはaverage sum at append pop prependなどのメソッドがある。
- Map
- Mapはハッシュのようなもの、シンタックスシュガーはない。
- atPut at asObject asList keys sizeなどのメソッドがある
- List
- 真偽値
- true false
- どちらもシングルトンのオブジェクト、cloneを上書きして自身を返すようにする