RHGを読みながらRuby1.9のソースコードを追いかける会 にいってきた
- 肉々しいバーベキュウから脱出して移動
- 最初は時間通りに来る人が多い訳ですよ
- 新しい名札を作った id:dominion525++
- 出席毎にシールを増やすとか?
- とりあえず,svn co http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_0 ruby-v1_9_1_0 とか?
- 参加者の半数くらいは,出版されたものを持ってきた
- 最初は,内部でオブジェクトをどう表現しているのかを見るよ
- 対象は,include/ruby/ruby.h, variable.c, object.c, class.c, (vm_method.c)
- VALUE がオブジェクトだよ
- VALUE の中身はstruct R* だったりする
- その場合,共通のstruct RBasic basic メンバーを持つ
- VALUE は値の場合もある->変換するマクロ (VALUE埋め込みオブジェクト)
- VALUE->basic.klass は,VALUE が所属するクラスオブジェクトを保持する
- VALUE->basic.flags にも,型情報が入ってたりするよ
- TYPE マクロで取り出せる
- struct RClass からRCLASS_M_TBL マクロで取り出せる m_tbl にはメソッドが入っている
- struct RClass からRCLASS_SUPER マクロでsuper が取り出すせるようになっている
- クラス階層として,super が NULL の場合そのクラスは最上位(Object)である
- 逆にObject 以外は全てがsuper を持っている
- VALUE->basic.flags にも,型情報が入ってたりするよ
- インスタンス変数
- struct RObject とかの struct st_table *iv_tbl に配置するかも
- variable.c:1005:rb_ivar_set を見る
- iv_tbl が無い型もあるので,その場合は,generic_ivar_set でstruct 外部に保存する.
- スーパーコンピュータプログラマな話をした
- Haskell を復習したいみたいな意見が出た
- ディスプレイを持ってきたのに使わないメソッド
- id:gabuchan からシリコンバリカンファの話を聞いた
- 色々聞いたけど食事の話しか覚えていない
- 続きはweb で
- 色々聞いたけど食事の話しか覚えていない
- sapid を紹介して頂いた
Ruby v1_9_1_0 より
$ egrep -n '^struct R' include/ruby/ruby.h 518:struct RBasic { 524:struct RObject { 554:struct RClass { 568:struct RFloat { 578:struct RString { 607:struct RArray { 635:struct RRegexp { 645:struct RHash { 658:struct RFile { 663:struct RRational { 669:struct RComplex { 675:struct RData { 706:struct RStruct { 729:struct RBignum { $ egrep -A3 -n '^struct RBa' include/ruby/ruby.h|head 518:struct RBasic { 519- VALUE flags; 520- VALUE klass; 521-}; $ egrep -A1 -n '^struct R[^B]' include/ruby/ruby.h|head 524:struct RObject { 525- struct RBasic basic; -- 554:struct RClass { 555- struct RBasic basic; -- 568:struct RFloat { 569- struct RBasic basic; -- 578:struct RString { $ perl -lne 'print "$.:$_" if /#define\s\w*2.*VALUE/' include/ruby/ruby.h 179:#define INT2FIX(i) ((VALUE)(((SIGNED_VALUE)(i))<<1 | FIXNUM_FLAG)) 250:#define FIX2LONG(x) RSHIFT((SIGNED_VALUE)x,1) 251:#define FIX2ULONG(x) ((((VALUE)(x))>>1)&LONG_MAX) 260:#define ID2SYM(x) (((VALUE)(x)<<RUBY_SPECIAL_SHIFT)|SYMBOL_FLAG) 405:#define NUM2ULONG(x) rb_num2ulong((VALUE)x) 409:#define FIX2INT(x) ((int)rb_fix2int((VALUE)x)) 452:#define NUM2DBL(x) rb_num2dbl((VALUE)(x)) 495:#define STR2CSTR(x) rb_str2cstr((VALUE)(x),0) 792:#define FL_USER2 (((VALUE)1)<<(FL_USHIFT+2)) 802:#define FL_USER12 (((VALUE)1)<<(FL_USHIFT+12)) $ egrep -n -A19 '^search_method' *.c vm_method.c:221:search_method(VALUE klass, ID id, VALUE *klassp) vm_method.c-222-{ vm_method.c-223- st_data_t body; vm_method.c-224- vm_method.c-225- if (!klass) { vm_method.c-226- return 0; vm_method.c-227- } vm_method.c-228- vm_method.c-229- while (!st_lookup(RCLASS_M_TBL(klass), id, &body)) { vm_method.c-230- klass = RCLASS_SUPER(klass); vm_method.c-231- if (!klass) vm_method.c-232- return 0; vm_method.c-233- } vm_method.c-234- vm_method.c-235- if (klassp) { vm_method.c-236- *klassp = klass; vm_method.c-237- } vm_method.c-238- vm_method.c-239- return (NODE *)body; vm_method.c-240-}
emacs 22.3 ソース
$ egrep -nH 'Qnil = ' *.c lread.c:3627: Qnil = Fmake_symbol (make_pure_string ("nil", 3, 3, 0)); $ egrep -A2 'DEFUN.*Fmake_symbol,' *.c alloc.c:DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0, alloc.c- doc: /* Return a newly allocated uninterned symbol whose name is NAME. alloc.c-Its value and function definition are void, and its property list is nil. */) $ egrep 'define EQ\(' *.[hc] lisp.h:#define EQ(x, y) ((x) == (y)) lisp.h:#define EQ(x, y) ((x).i == (y).i) $ egrep -A5 'union Lisp_Object' *.[ch]|head -7 lisp.h:union Lisp_Object lisp.h- { lisp.h- /* Used for comparing two Lisp_Objects; lisp.h- also, positive integers can be accessed fast this way. */ lisp.h- EMACS_INT i; lisp.h- --
DEFUN は,emacs 上の関数とC での関数をマッピングするマクロっぽい.*1
そんで,make-symbol は,なんか順番に連番を割り当ててるだけみたい.
emacs は,以下を参考にさせて頂きました.
- http://d.hatena.ne.jp/kunihiroishigur/20050407
- http://kzk9.net/column/emacs/elisp_datastructure.html
あと,自分がC 言語を学んだときの本
二番目に読んだ本
C言語入門 (ASCII SOFTWARE SCIENCE Language)
おもろいな.と思った本
C言語ポインタ完全制覇 (標準プログラマーズライブラリ)
*1:普通にetags とかで探したらみつからなくて焦ったのは秘密だ.