第2回 RHGの逆襲(at 新橋某所)
- 発表候補者枠で参加は無謀だった
- ぜんぜん理解できてなかったので、発表が当たったら大惨事になるところだった。そのときは開き直ってわかんないところを聞きまくるつもりだったけど
- 無理やり予習できたという意味ではよかった。でもそれでみんなに迷惑かけるってのはなあ
- ハッシュオブジェクトはst_tableのラッパーとのこと
- do_hashはマクロなのに小文字なのはなぜ?
- st_table構造体
- *typeはC++でいうところの仮想関数テーブル
- entries_packedは値埋め込みかどうかを判断するフラグ
- ST_INDEX_BITS-1の値は31
- *headは、要素を追加した順序を保持するために新たに追加された
- st_table_entry構造体
- *foreと*backで、要素を追加した順序を保持する双方向リンクリストを実現
- 初期化コンストラクタ
- C++で書けば楽なのに(yuguiさん)
- 実際の処理はst_init_table_with_size
- new_sizeは必ず素数を返す。約数があると使うスロットが偏るから
- キーが数字でかつあるサイズ以下ならentries_packedのビットが立つ
- FIND_ENTRYマクロ
- PTR_NOT_EQUALという名前はおかしくね?(yuguiさん)
- st_lookup
- ADD_DIRECTマクロ
- 最初はheadのforeもbackもhead(自分自身)
- headが0でなければ、entryのforeがhead、entryのbackがhead、headのforeがentry、headのbackがentryに
- st_insertは値がすでにあったときに1、新規に値を入れたときに0を返す
- strcasehashはASCIIコードをハードコーディングしてる
- 1.9のrb_intern()はマルチリンガライゼーションの処理がごちゃごちゃしていてよくわからないらしい
- 拡張ライブラリが(rb_hashではなく)stを使う場合の話(artonさん)
- Ruby側からはフリーズしてライブラリ側からは自由にいじれるようにするとか
- Cのインタフェースとしては覚えておいたほうがよいとのこと
- ハッシュの実装をいくつも覚えてもしょうがないし
- yuguiさんの三つの疑問
- M17N
- intのなぞ。strhashの実態はunsigned、numhashの実態はunsigned longなのになぜintにしてるのか
- strhashに素数をかけているのはなぜ?
- 第4章の全体を概観(yuguiさん)
- オブジェクト/クラスの階層図
- 図4.10
- 1.9のobject.cの2300行あたり
- Object、Class、Moduleの三つは最初からないと困るのでブートストラップ
- コードを読むときは、そのコードの意図を知っているのと知ってないのとでは難易度がぜんぜん違ってくることを実感した