7つの言語7つの世界 Ruby 3日目

試してみよう

感想等

3章はRubyメタプログラミングの紹介、メタプログラミングとはプログラムを書くプログラム
Rubyの機能を使えばDSL(ドメイン固有言語)を構築することが簡単に出来る(らしい)
メタプログラミングRuby欲しくなった。
Rubyの3日分の「試してみよう」の他の人の解答見ると、奇麗なコード多すぎて嫉妬。
読んでる間ずっとリファレンスマニュアルと睨めっこだった。
もっとちゃんとした本を一冊かって頭に叩き込まれるまで勉強したいなぁ。
一番良いのは忘れないように毎日何か書く事だろうけど。書かないと何回も調べたことでも忘れちゃう気がする。

試してみようの3日目

元々定義されてるメソッドと同じheadersが設定されてたらmethod_missing呼ばれない。
なので定義されてるメソッドをundefしていく必要があるみたい。
メソッドをまっさらに消すのをブランクスレートと呼ぶらしい。

メタプログラミングに利用出来る機能
  • オープンクラス
    • クラスを定義した後からでも変更出来る
    • 普通はメソッドを追加する時に変更する
    • メソッドを追加する前に作成したオブジェクトからでも追加したメソッドを呼び出せる
    • DSLを作成する時に便利
  • method_missing
    • phpの__callとか__getのようなものか。
    • 例として出ているローマ字がすごい。
  • モジュール
    • 最も人気のあるスタイル
    • 「マクロと呼ばれるモジュールメソッドを使う」
    • acts_as_csvマクロでdefine_methodを使ってCSVファイルに関する全ての動作を定義(acts_as_csv.rb)
本見ながら書いたもの







7つの言語7つの世界 Io 1日目

探してみよう

確認してみよう

  • Ioは強く型付けされた言語か? 弱く型付けされた言語か?
    • Ioは強く型付けされた言語。1 + "one"はエラー
  • 0、空文字列、nilは真か偽か?
    • 0、空文字列はtrue、nilはfalse
    • (true and 0) println; (true and "") println; (true and nil) println
  • プロトタイプのスロットの確認
    • 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見ると

  • small vm(1万行以下)
  • 複数のVMが同じプロセスで動く
  • ガベコレ、弱い参照
  • アクターベースの並列モデル、コルーチン
  • 64bit C99での実装
  • 組み込み言語
  • 例外

とりあえず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などのメソッドがある
  • 真偽値
    • true false
    • どちらもシングルトンのオブジェクト、cloneを上書きして自身を返すようにする