diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-09-04 12:22:46 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-09-04 12:22:46 +0000 |
commit | 60c8455253682cbda20a90950be3777f2d819ead (patch) | |
tree | aee645c69ff06c7687214d511c1fadaef96a07ad /README.EXT.ja | |
parent | a17fd731c9cab021f3e40f63f10ac13c0e0ca516 (diff) | |
download | bundler-60c8455253682cbda20a90950be3777f2d819ead.tar.gz |
Change encoding from EUC-JP to UTF-8. [Feature #5128]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33181 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'README.EXT.ja')
-rw-r--r-- | README.EXT.ja | 1669 |
1 files changed, 905 insertions, 764 deletions
diff --git a/README.EXT.ja b/README.EXT.ja index 9e0a7a2cb0..d061f16ff2 100644 --- a/README.EXT.ja +++ b/README.EXT.ja @@ -1,53 +1,53 @@ .\" README.EXT.ja - -*- Text -*- created at: Mon Aug 7 16:45:54 JST 1995 -Rubyγĥ饤֥κޤ +Rubyの拡張ライブラリの作り方を説明します. -1μ +1.基礎知識 -CѿˤϷꡤǡˤϷޤǤ顤 -ȤХݥintѿȡͤȤƼ -갷ޤդRubyѿˤϷʤǡ˷ -ΰ㤤ΤᡤCRubyߤѴʤСߤ -ǡǤޤ +Cの変数には型があり,データには型がありません.ですから,た +とえばポインタをintの変数に代入すると,その値は整数として取 +り扱われます.逆にRubyの変数には型がなく,データに型がありま +す.この違いのため,CとRubyは相互に変換しなければ,お互いの +データをアクセスできません. -RubyΥǡVALUEȤCηɽޤVALUEΥǡ -ϤΥǡפʬΤäƤޤΥǡפ -Τϥǡ(֥)μºݤι¤̣ƤơRuby -Υ饹ȤϤޤäΤǤ +RubyのデータはVALUEというCの型で表現されます.VALUE型のデー +タはそのデータタイプを自分で知っています.このデータタイプと +いうのはデータ(オブジェクト)の実際の構造を意味していて,Ruby +のクラスとはまた違ったものです. -VALUECˤȤäựΤǡФˤ +VALUEからCにとって意味のあるデータを取り出すためには - (1) VALUEΥǡפΤ - (2) VALUECΥǡѴ + (1) VALUEのデータタイプを知る + (2) VALUEをCのデータに変換する -ξɬפǤ(1)˺ȴְäǡѴԤ -ơǰץबcore dumpޤ +の両方が必要です.(1)を忘れると間違ったデータの変換が行われ +て,最悪プログラムがcore dumpします. -1.1 ǡ +1.1 データタイプ -Rubyˤϥ桼ȤǽΤʲΥפޤ +Rubyにはユーザが使う可能性のある以下のタイプがあります. T_NIL nil - T_OBJECT ̾Υ֥ - T_CLASS 饹 - T_MODULE ⥸塼 - T_FLOAT ư - T_STRING ʸ - T_REGEXP ɽ - T_ARRAY - T_HASH Ϣ - T_STRUCT (Ruby)¤ - T_BIGNUM ¿Ĺ - T_FIXNUM Fixnum(31bitޤ63bitĹ) - T_COMPLEX ʣǿ - T_RATIONAL ͭ - T_FILE - T_TRUE - T_FALSE - T_DATA ǡ - T_SYMBOL ܥ - -¾ѤƤʲΥפޤ + T_OBJECT 通常のオブジェクト + T_CLASS クラス + T_MODULE モジュール + T_FLOAT 浮動小数点数 + T_STRING 文字列 + T_REGEXP 正規表現 + T_ARRAY 配列 + T_HASH 連想配列 + T_STRUCT (Rubyの)構造体 + T_BIGNUM 多倍長整数 + T_FIXNUM Fixnum(31bitまたは63bit長整数) + T_COMPLEX 複素数 + T_RATIONAL 有理数 + T_FILE 入出力 + T_TRUE 真 + T_FALSE 偽 + T_DATA データ + T_SYMBOL シンボル + +その他に内部で利用されている以下のタイプがあります. T_ICLASS T_MATCH @@ -55,249 +55,360 @@ Rubyˤϥ桼ȤǽΤʲΥפޤ T_NODE T_ZOMBIE -ۤȤɤΥפCι¤ΤǼƤޤ +ほとんどのタイプはCの構造体で実装されています. -1.2 VALUEΥǡפå +1.2 VALUEのデータタイプをチェックする -ruby.hǤTYPE()ȤޥƤơVALUEΥǡ -פΤ뤳ȤޤTYPE()ޥϾǾҲ𤷤T_XXXX -η֤ޤVALUEΥǡפ˱ƽ -ˤϡTYPE()ͤʬ뤳Ȥˤʤޤ +ruby.hではTYPE()というマクロが定義されていて,VALUEのデータ +タイプを知ることが出来ます.TYPE()マクロは上で紹介したT_XXXX +の形式の定数を返します.VALUEのデータタイプに応じて処理する +場合には,TYPE()の値で分岐することになります. switch (TYPE(obj)) { case T_FIXNUM: - /* FIXNUMν */ + /* FIXNUMの処理 */ break; case T_STRING: - /* ʸν */ + /* 文字列の処理 */ break; case T_ARRAY: - /* ν */ + /* 配列の処理 */ break; default: - /* 㳰ȯ */ + /* 例外を発生させる */ rb_raise(rb_eTypeError, "not valid value"); break; } -ȥǡפåơʤ㳰ȯ -ؿѰդƤޤ +それとデータタイプをチェックして,正しくなければ例外を発生す +る関数が用意されています. void Check_Type(VALUE value, int type) -δؿvaluetype̵С㳰ȯޤ -Ϳ줿VALUEΥǡפɤå -뤿ˤϡδؿȤޤ +この関数はvalueがtypeで無ければ,例外を発生させます.引数と +して与えられたVALUEのデータタイプが正しいかどうかチェックす +るためには,この関数を使います. -FIXNUMNIL˴ؤƤϤ®Ƚ̥ޥѰդƤޤ +FIXNUMとNILに関してはより高速な判別マクロが用意されています. FIXNUM_P(obj) NIL_P(obj) -1.3 VALUECΥǡѴ - -ǡפT_NILT_FALSET_TRUEǤǡϤ줾 -nilfalsetrueǤΥǡפΥ֥ȤϤҤ -ĤĤ¸ߤޤ - -ǡפT_FIXNUMλ31bitޤ63bitΥ -ǤlongΥ32bitΥץåȥեǤ -31bitˡlongΥ64bitΥץåȥեǤ63bit -ˤʤޤ. FIXNUM C Ѵ뤿ˤϥޥ -FIX2INT()פޤϡFIX2LONG()פȤޤΥޥ -Ѥݤˤϻ˥ǡפFIXNUMǤ뤳Ȥǧ -ɬפޤŪ®ѴԤȤǤޤ -FIX2LONG()פ㳰ȯޤFIX2INT()פ -̤intΥ˼ޤʤˤ㳰ȯޤ -줫顤FIXNUM˸¤餺RubyΥǡѴ -NUM2INT()פӡNUM2LONG()פȤޥޤ -ΥޥϥޥϥǡפΥå̵ǻȤޤ -(ѴǤʤˤ㳰ȯ)Ʊͤ˥å̵ -ǻȤѴޥdoubleФNUM2DBL()פޤ - -char* Ф硤 StringValue() StringValuePtr() -Ȥޤ -StringValue(var) var String -Ǥв⤻Ǥʤ var var.to_str() η -֤ޥStringValuePtr(var) Ʊͤ var -String ֤Ƥ var ΥХɽФ char* -֤ޥǤvar Ƥľ֤Τǡ -var lvalue Ǥɬפޤ -ޤStringValuePtr() StringValueCStr() Ȥ -⤢ޤStringValueCStr(var) var String ֤ -Ƥ var ʸɽФ char* ֤ޤ֤ -ʸˤ nul ʸղäޤʤ nul -ʸޤޤ ArgumentError ȯޤ -StringValuePtr() Ǥϡ nul ʸݾڤϤʤ - nul ʸޤޤƤǽ⤢ޤ - -ʳΥǡפбCι¤Τޤб -빽¤ΤΤVALUEϤΤޤޥ㥹(Ѵ)й¤Τ -ݥѴǤޤ - -¤Τϡstruct RXxxxxפȤ̾ruby.hƤ -㤨ʸϡstruct RStringפǤºݤ˻Ȥǽ -Τʸ餤Ȼפޤ - -ruby.hǤϹ¤Τإ㥹ȤޥRXXXXX()(ʸ -ˤ)Ȥ̾Ƥޤ(: RSTRING()) - -¤ΤǡФޥƤޤʸ -strĹ뤿ˤϡRSTRING_LEN(str)פȤʸstr -char*Ȥ뤿ˤϡRSTRING_PTR(str)פȤޤ -ˤϡ줾RARRAY_LEN(ary)סRARRAY_PTR(ary)פ -ʤޤ - -Rubyι¤Τľܥ˵ĤʤФʤʤ -Ȥϡʸι¤ΤȤϻȤǡľѹ -ʤȤǤľѹ硤֥ȤƤ -Ȥʤʤäơפ̥Хθˤʤޤ - -1.4 CΥǡVALUEѴ - -VALUEμºݤι¤ - - * FIXNUMξ - - 1bitեȤơLSBΩƤ롥 - - * ¾Υݥξ - - ΤޤVALUE˥㥹Ȥ롥 - -ȤʤäƤޤäơLSBåVALUEFIXNUM -狼櫓Ǥ(ݥLSBΩäƤʤȤꤷ -) - -Ǥ顤FIXNUMʳRubyΥ֥Ȥι¤ΤñVALUE -˥㥹ȤVALUEѴޤǤդι¤ -ΤVALUE˥㥹Ƚ櫓ǤϤޤ㥹Ȥ -RubyΤäƤ빽¤(ruby.hƤstruct RXxxx -Τ)Ǥ - -FIXNUM˴ؤƤѴޥͳɬפޤC -VALUEѴޥϰʲΤΤޤɬפ˱ -ƻȤʬƤ - - INT2FIX() Ȥ31bitޤ63bit˼ޤ뼫 - - INT2NUM() ǤդVALUE - -INT2NUM()FIXNUMϰϤ˼ޤʤ硤BignumѴ -Ƥޤ(٤) - -1.5 RubyΥǡ - -Ҥ٤̤ꡤRubyι¤ΤƤι -ԤȤϴޤǡRubyΥǡˤ -RubyѰդƤؿѤƤ - -ǤϤäȤȤǤʸ/ -ؿޤ(ǤϤʤǤ) - - ʸФؿ +<<<<<<< HEAD +1.3 VALUEをCのデータに変換する + +データタイプがT_NIL,T_FALSE,T_TRUEである時,データはそれぞ +れnil,false,trueです.このデータタイプのオブジェクトはひと +つずつしか存在しません. + +データタイプがT_FIXNUMの時,これは31bitまたは63bitのサイズを +持つ整数です.longのサイズが32bitのプラットフォームであれば +31bitに,longのサイズが64bitのプラットフォームであれば63bit +になります. FIXNUM を C の整数に変換するためにはマクロ +「FIX2INT()」または「FIX2LONG()」を使います.これらのマクロ +を使用する際には事前にデータタイプがFIXNUMであることを確認す +る必要がありますが,比較的高速に変換を行うことができます.ま +た,「FIX2LONG()」は例外を発生しませんが,「FIX2INT()」は変 +換結果がintのサイズに収まらない場合には例外を発生します. +それから,FIXNUMに限らずRubyのデータを整数に変換する +「NUM2INT()」および「NUM2LONG()」というマクロがあります.こ +れらのマクロはマクロはデータタイプのチェック無しで使えます +(整数に変換できない場合には例外が発生する).同様にチェック無 +で使える変換マクロはdoubleを取り出す「NUM2DBL()」があります. + +char* を取り出す場合, StringValue() と StringValuePtr() +を使います. +StringValue(var) は var が String +であれば何もせず,そうでなければ var を var.to_str() の結果 +に置き換えるマクロ,StringValuePtr(var) は同様に var を +String に置き換えてから var のバイト列表現に対する char* を +返すマクロです.var の内容を直接置き換える処理が入るので, +var は lvalue である必要があります. +また,StringValuePtr() に類似した StringValueCStr() というマ +クロもあります.StringValueCStr(var) は var を String に置き +換えてから var の文字列表現に対する char* を返します.返され +る文字列の末尾には nul 文字が付加されます.なお,途中に nul +文字が含まれる場合は ArgumentError が発生します. +一方,StringValuePtr() では,末尾に nul 文字がある保証はなく, +途中に nul 文字が含まれている可能性もあります. + +それ以外のデータタイプは対応するCの構造体があります.対応す +る構造体のあるVALUEはそのままキャスト(型変換)すれば構造体の +ポインタに変換できます. + +構造体は「struct RXxxxx」という名前でruby.hで定義されていま +す.例えば文字列は「struct RString」です.実際に使う可能性が +あるのは文字列と配列くらいだと思います. + +ruby.hでは構造体へキャストするマクロも「RXXXXX()」(全部大文 +字にしたもの)という名前で提供されています(例: RSTRING()). + +構造体からデータを取り出すマクロが提供されています.文字列 +strの長さを得るためには「RSTRING_LEN(str)」とし,文字列strを +char*として得るためには「RSTRING_PTR(str)」とします.配列の +場合には,それぞれ「RARRAY_LEN(ary)」,「RARRAY_PTR(ary)」と +なります. + +Rubyの構造体を直接アクセスする時に気をつけなければならないこ +とは,配列や文字列の構造体の中身は参照するだけで,直接変更し +ないことです.直接変更した場合,オブジェクトの内容の整合性が +とれなくなって,思わぬバグの原因になります. + +1.4 CのデータをVALUEに変換する + +VALUEの実際の構造は + + * FIXNUMの場合 + + 1bit左シフトして,LSBを立てる. + + * その他のポインタの場合 + + そのままVALUEにキャストする. + +となっています.よって,LSBをチェックすればVALUEがFIXNUMかど +うかわかるわけです(ポインタのLSBが立っていないことを仮定して +いる). + +ですから,FIXNUM以外のRubyのオブジェクトの構造体は単にVALUE +にキャストするだけでVALUEに変換出来ます.ただし,任意の構造 +体がVALUEにキャスト出来るわけではありません.キャストするの +はRubyの知っている構造体(ruby.hで定義されているstruct RXxxx +のもの)だけです. + +FIXNUMに関しては変換マクロを経由する必要があります.Cの整数 +からVALUEに変換するマクロは以下のものがあります.必要に応じ +て使い分けてください. + + INT2FIX() もとの整数が31bitまたは63bit以内に収まる自信 + がある時 + INT2NUM() 任意の整数からVALUEへ + +INT2NUM()は整数がFIXNUMの範囲に収まらない場合,Bignumに変換 +してくれます(が,少し遅い). + +1.5 Rubyのデータを操作する + +先程も述べた通り,Rubyの構造体をアクセスする時に内容の更新を +行うことは勧められません.で,Rubyのデータを操作する時には +Rubyが用意している関数を用いてください. + +ここではもっとも使われるであろう文字列と配列の生成/操作を行 +い関数をあげます(全部ではないです). + + 文字列に対する関数 +======= +1.3 VALUEをCのデータに変換する + +データタイプがT_NIL,T_FALSE,T_TRUEである時,データはそれぞ +れnil,false,trueです.このデータタイプのオブジェクトはひと +つずつしか存在しません. + +データタイプがT_FIXNUMの時,これは31bitまたは63bitのサイズを +持つ整数です.longのサイズが32bitのプラットフォームであれば +31bitに,longのサイズが64bitのプラットフォームであれば63bit +になります. FIXNUM を C の整数に変換するためにはマクロ +「FIX2INT()」または「FIX2LONG()」を使います.これらのマクロ +を使用する際には事前にデータタイプがFIXNUMであることを確認す +る必要がありますが,比較的高速に変換を行うことができます.ま +た,「FIX2LONG()」は例外を発生しませんが,「FIX2INT()」は変 +換結果がintのサイズに収まらない場合には例外を発生します. +それから,FIXNUMに限らずRubyのデータを整数に変換する +「NUM2INT()」および「NUM2LONG()」というマクロがあります.こ +れらのマクロはマクロはデータタイプのチェック無しで使えます +(整数に変換できない場合には例外が発生する).同様にチェック無 +で使える変換マクロはdoubleを取り出す「NUM2DBL()」があります. + +char* を取り出す場合, StringValue() と StringValuePtr() +を使います. +StringValue(var) は var が String +であれば何もせず,そうでなければ var を var.to_str() の結果 +に置き換えるマクロ,StringValuePtr(var) は同様に var を +String に置き換えてから var のバイト列表現に対する char* を +返すマクロです.var の内容を直接置き換える処理が入るので, +var は lvalue である必要があります. +また,StringValuePtr() に類似した StringValueCStr() というマ +クロもあります.StringValueCStr(var) は var を String に置き +換えてから var の文字列表現に対する char* を返します.返され +る文字列の末尾には nul 文字が付加されます.なお,途中に nul +文字が含まれる場合は ArgumentError が発生します. +一方,StringValuePtr() では,末尾に nul 文字がある保証はなく, +途中に nul 文字が含まれている可能性もあります. + +それ以外のデータタイプは対応するCの構造体があります.対応す +る構造体のあるVALUEはそのままキャスト(型変換)すれば構造体の +ポインタに変換できます. + +構造体は「struct RXxxxx」という名前でruby.hで定義されていま +す.例えば文字列は「struct RString」です.実際に使う可能性が +あるのは文字列と配列くらいだと思います. + +ruby.hでは構造体へキャストするマクロも「RXXXXX()」(全部大文 +字にしたもの)という名前で提供されています(例: RSTRING()). + +構造体からデータを取り出すマクロが提供されています.文字列 +strの長さを得るためには「RSTRING_LEN(str)」とし,文字列strを +char*として得るためには「RSTRING_PTR(str)」とします.配列の +場合には,それぞれ「RARRAY_LEN(ary)」,「RARRAY_PTR(ary)」と +なります. + +Rubyの構造体を直接アクセスする時に気をつけなければならないこ +とは,配列や文字列の構造体の中身は参照するだけで,直接変更し +ないことです.直接変更した場合,オブジェクトの内容の整合性が +とれなくなって,思わぬバグの原因になります. + +1.4 CのデータをVALUEに変換する + +VALUEの実際の構造は + + * FIXNUMの場合 + + 1bit左シフトして,LSBを立てる. + + * その他のポインタの場合 + + そのままVALUEにキャストする. + +となっています.よって,LSBをチェックすればVALUEがFIXNUMかど +うかわかるわけです(ポインタのLSBが立っていないことを仮定して +いる). + +ですから,FIXNUM以外のRubyのオブジェクトの構造体は単にVALUE +にキャストするだけでVALUEに変換出来ます.ただし,任意の構造 +体がVALUEにキャスト出来るわけではありません.キャストするの +はRubyの知っている構造体(ruby.hで定義されているstruct RXxxx +のもの)だけです. + +FIXNUMに関しては変換マクロを経由する必要があります.Cの整数 +からVALUEに変換するマクロは以下のものがあります.必要に応じ +て使い分けてください. + + INT2FIX() もとの整数が31bitまたは63bit以内に収まる自信 + がある時 + INT2NUM() 任意の整数からVALUEへ + +INT2NUM()は整数がFIXNUMの範囲に収まらない場合,Bignumに変換 +してくれます(が,少し遅い). + +1.5 Rubyのデータを操作する + +先程も述べた通り,Rubyの構造体をアクセスする時に内容の更新を +行うことは勧められません.で,Rubyのデータを操作する時には +Rubyが用意している関数を用いてください. + +ここではもっとも使われるであろう文字列と配列の生成/操作を行 +い関数をあげます(全部ではないです). + + 文字列に対する関数 +>>>>>>> Change encoding from EUC-JP to UTF-8. [Feature #5128] rb_str_new(const char *ptr, long len) - Rubyʸ롥 + 新しいRubyの文字列を生成する. rb_str_new2(const char *ptr) rb_str_new_cstr(const char *ptr) - CʸRubyʸ롥δؿεǽ - rb_str_new(ptr, strlen(ptr))ƱǤ롥 + Cの文字列からRubyの文字列を生成する.この関数の機能は + rb_str_new(ptr, strlen(ptr))と同等である. rb_tainted_str_new(const char *ptr, long len) - ޡղä줿Rubyʸ롥 - Υǡ˴Ťʸˤϱޡղä٤ - Ǥ롥 + 汚染マークが付加された新しいRubyの文字列を生成する.外部 + からのデータに基づく文字列には汚染マークが付加されるべき + である. rb_tainted_str_new2(const char *ptr) rb_tainted_str_new_cstr(const char *ptr) - Cʸޡղä줿Rubyʸ롥 + Cの文字列から汚染マークが付加されたRubyの文字列を生成する. rb_sprintf(const char *format, ...) rb_vsprintf(const char *format, va_list ap) - Cʸformat³printf(3)ΥեޥåȤˤä - Rubyʸ롥 + Cの文字列formatと続く引数をprintf(3)のフォーマットにしたがって + 整形し,Rubyの文字列を生成する. rb_str_cat(VALUE str, const char *ptr, long len) - RubyʸstrlenХȤʸptrɲä롥 + Rubyの文字列strにlenバイトの文字列ptrを追加する. rb_str_cat2(VALUE str, const char* ptr) - RubyʸstrCʸptrɲä롥δؿεǽ - rb_str_cat(str, ptr, strlen(ptr))ƱǤ롥 + Rubyの文字列strにCの文字列ptrを追加する.この関数の機能は + rb_str_cat(str, ptr, strlen(ptr))と同等である. rb_str_catf(VALUE str, const char* format, ...) rb_str_vcatf(VALUE str, const char* format, va_list ap) - Cʸformat³printf(3)ΥեޥåȤˤä - Rubyʸstrɲä롥δؿεǽϡ줾 - rb_str_cat2(str, rb_sprintf(format, ...)) - rb_str_cat2(str, rb_vsprintf(format, ap)) ƱǤ롥 + Cの文字列formatと続く引数をprintf(3)のフォーマットにしたがって + 整形し,Rubyの文字列strに追加する.この関数の機能は,それぞれ + rb_str_cat2(str, rb_sprintf(format, ...)) や + rb_str_cat2(str, rb_vsprintf(format, ap)) と同等である. rb_enc_str_new(const char *ptr, long len, rb_encoding *enc) +<<<<<<< HEAD - ꤵ줿ǥRubyʸ. + 指定されたエンコーディングでRubyの文字列を生成する. +======= + + 指定されたエンコーディングでRubyの文字列を生成する. + +>>>>>>> Change encoding from EUC-JP to UTF-8. [Feature #5128] rb_usascii_str_new(const char *ptr, long len) rb_usascii_str_new_cstr(const char *ptr) - ǥUS-ASCIIRubyʸ. + エンコーディングがUS-ASCIIのRubyの文字列を生成する. rb_str_resize(VALUE str, long len) - RubyʸΥlenХȤѹ롥strĹ - ʤƥåȤƤʤФʤʤlenĹû - ϡlenХȤۤʬƤϼΤƤ롥len - ĹĹϡĹۤʬƤ¸ - ʤǥߤˤʤδؿθƤӽФˤä - RSTRING_PTR(str)ѹ뤫⤷ʤȤա + Rubyの文字列のサイズをlenバイトに変更する.strの長さは前 + 以てセットされていなければならない.lenが元の長さよりも短 + い時は,lenバイトを越えた部分の内容は捨てられる.lenが元 + の長さよりも長い時は,元の長さを越えた部分の内容は保存さ + れないでゴミになるだろう.この関数の呼び出しによって + RSTRING_PTR(str)が変更されるかもしれないことに注意. rb_str_set_len(VALUE str, long len) - RubyʸΥlenХȤ˥åȤ롥strѹ - ǽǤʤ㳰ȯ롥RSTRING_LEN(str)Ȥ̵طˡ - lenХȤޤǤƤ¸롥lenstr̤ۤƤ - ƤϤʤʤ + Rubyの文字列のサイズをlenバイトにセットする.strが変更可 + 能でなければ例外が発生する.RSTRING_LEN(str)とは無関係に, + lenバイトまでの内容は保存される.lenはstrの容量を越えてい + てはならない. - Фؿ + 配列に対する関数 rb_ary_new() - Ǥ0롥 + 要素が0の配列を生成する. rb_ary_new2(long len) - Ǥ0롥lenʬΰ餫 - ƤƤ + 要素が0の配列を生成する.len要素分の領域をあらかじめ割り + 当てておく. rb_ary_new3(long n, ...) - ǻꤷnǤޤ롥 + 引数で指定したn要素を含む配列を生成する. rb_ary_new4(long n, VALUE *elts) - ͿnǤ롥 + 配列で与えたn要素の配列を生成する. rb_ary_to_ary(VALUE obj) - ֥ȤѴ. - Object#to_aryƱǤ. + オブジェクトを配列に変換する. + Object#to_aryと同等である. - ¾ˤؿ¿. - aryϤʤФʤʤ. ʤ - Ǥ. + 他にも配列を操作する関数が多数ある. これらは + 引数aryに配列を渡さなければならない. さもないと + コアを吐く. rb_ary_aref(argc, VALUE *argv, VALUE ary) - Array#[]Ʊ. + Array#[]と同等. rb_ary_entry(VALUE ary, long offset) @@ -312,45 +423,45 @@ RubyѰդƤؿѤƤ rb_ary_shift(VALUE ary) rb_ary_unshift(VALUE ary, VALUE val) -2RubyεǽȤ +2.Rubyの機能を使う -ŪRubyǽ뤳ȤCǤޤRubyΤΤCǵ -ҤƤǤ顤ȤʤǤɡ -Rubyγĥ˻ȤȤ¿ͽ¬뵡ǽ濴˾ -𤷤ޤ +原理的にRubyで書けることはCでも書けます.RubyそのものがCで記 +述されているんですから,当然といえば当然なんですけど.ここで +はRubyの拡張に使うことが多いだろうと予測される機能を中心に紹 +介します. -2.1 Ruby˵ǽɲä +2.1 Rubyに機能を追加する -RubyƤؿȤRubyץ˿ǽ -ɲä뤳ȤǤޤRubyǤϰʲεǽɲäؿ -Ƥޤ +Rubyで提供されている関数を使えばRubyインタプリタに新しい機能 +を追加することができます.Rubyでは以下の機能を追加する関数が +提供されています. - * 饹⥸塼 - * åɡðۥåɤʤ - * + * クラス,モジュール + * メソッド,特異メソッドなど + * 定数 -ǤϽ˾Ҳ𤷤ޤ +では順に紹介します. -2.1.1 饹/⥸塼 +2.1.1 クラス/モジュール定義 -饹⥸塼뤿ˤϡʲδؿȤޤ +クラスやモジュールを定義するためには,以下の関数を使います. VALUE rb_define_class(const char *name, VALUE super) VALUE rb_define_module(const char *name) -δؿϿ줿饹⥸塼֤ޤ -åɤˤͤɬפʤΤǡۤȤɤξ -ͤѿ˳ǼƤɬפǤ礦 +これらの関数は新しく定義されたクラスやモジュールを返します. +メソッドや定数の定義にこれらの値が必要なので,ほとんどの場合 +は戻り値を変数に格納しておく必要があるでしょう. -饹⥸塼¾Υ饹˥ͥȤ -ϰʲδؿȤޤ +クラスやモジュールを他のクラスの内部にネストして定義する時に +は以下の関数を使います. VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super) VALUE rb_define_module_under(VALUE outer, const char *name) -2.1.2 å/ðۥå +2.1.2 メソッド/特異メソッド定義 -åɤðۥåɤˤϰʲδؿȤޤ +メソッドや特異メソッドを定義するには以下の関数を使います. void rb_define_method(VALUE klass, const char *name, VALUE (*func)(), int argc) @@ -359,365 +470,365 @@ RubyƤؿȤRubyץ˿ǽ VALUE (*func)(), int argc) -ǰΤȡðۥåɡפȤϡΥ֥ -ȤФƤͭʥåɤǤRubyǤϤ褯Smalltalkˤ -륯饹åɤȤơ饹ФðۥåɤȤ -ޤ +念のため説明すると「特異メソッド」とは,その特定のオブジェク +トに対してだけ有効なメソッドです.RubyではよくSmalltalkにお +けるクラスメソッドとして,クラスに対する特異メソッドが使われ +ます. -δؿ argcȤCδؿϤο( -)ޤargc0ʾλϴؿ˰Ϥο -̣ޤ16İʾΰϻȤޤ(פޤ͡ -ʤ)ºݤδؿˤƬΰȤselfͿޤ -ǡꤷ1¿ĤȤˤʤޤ +これらの関数の argcという引数はCの関数へ渡される引数の数(と +形式)を決めます.argcが0以上の時は関数に引き渡す引数の数を意 +味します.16個以上の引数は使えません(が,要りませんよね,そ +んなに).実際の関数には先頭の引数としてselfが与えられますの +で,指定した数より1多い引数を持つことになります. -argcλϰοǤϤʤꤷȤˤʤޤ -argc-1λϰϤޤargc-2λϰ -RubyȤϤޤ +argcが負の時は引数の数ではなく,形式を指定したことになります. +argcが-1の時は引数を配列に入れて渡されます.argcが-2の時は引 +数はRubyの配列として渡されます. -åɤؿϤޤĤޤ. ҤȤĤϥå -̾ȤIDޤ. IDˤĤƤ2.2.2. +メソッドを定義する関数はまだいくつかあります. ひとつはメソッド +名としてIDを取ります. IDについては2.2.2を参照. void rb_define_method_id(VALUE klass, ID name, VALUE (*func)(ANYARGS), int argc) -private/protectedʥåɤդĤδؿޤ. +private/protectedなメソッドを定義するふたつの関数があります. void rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(), int argc) void rb_define_protected_method(VALUE klass, const char *name, VALUE (*func)(), int argc) -privateåɤȤϴؿǤƤӽФȤνʤ -ɤǤ +privateメソッドとは関数形式でしか呼び出すことの出来ないメソッ +ドです. -Ǹˡ rb_define_moduleؿϥ⥸塼ؿޤ -⥸塼ؿȤϥ⥸塼ðۥåɤǤꡤƱ -privateåɤǤ⤢ΤǤMath⥸塼 -sqrt()ʤɤޤΥåɤ +最後に, rb_define_module関数はモジュール関数を定義します. +モジュール関数とはモジュールの特異メソッドであり,同時に +privateメソッドでもあるものです.例をあげるとMathモジュール +のsqrt()などがあげられます.このメソッドは Math.sqrt(4) -ȤǤ +という形式でも include Math sqrt(4) -ȤǤȤޤ⥸塼ؿؿϰʲ -̤Ǥ +という形式でも使えます.モジュール関数を定義する関数は以下の +通りです. void rb_define_module_function(VALUE module, const char *name, VALUE (*func)(), int argc) -ؿŪå(Kernel⥸塼private method)뤿 -δؿϰʲ̤Ǥ +関数的メソッド(Kernelモジュールのprivate method)を定義するた +めの関数は以下の通りです. void rb_define_global_function(const char *name, VALUE (*func)(), int argc) -åɤ̾뤿δؿϰʲ̤Ǥ +メソッドの別名を定義するための関数は以下の通りです. void rb_define_alias(VALUE module, const char* new, const char* old); -°μåɤˤ +属性の取得・設定メソッドを定義するには void rb_define_attr(VALUE klass, const char *name, int read, int write) -饹åallocateꤹ뤿δؿ -ʲ̤Ǥ +クラスメソッドallocateを定義したり削除したりするための関数は +以下の通りです. void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass)); void rb_undef_alloc_func(VALUE klass); -funcϥ饹ȤƼäơƤ줿 -֤ʤƤϤʤޤΥϡ -ʤɤޤޤʤǤֶפΤޤޤˤƤۤ -褤Ǥ礦 +funcはクラスを引数として受け取って,新しく割り当てられたイン +スタンスを返さなくてはなりません.このインスタンスは,外部リ +ソースなどを含まない,できるだけ「空」のままにしておいたほう +がよいでしょう. -2.1.3 +2.1.3 定数定義 -ĥ饤֥꤬ɬפϤ餫Ƥɤ -Ǥ礦ؿĤޤ +拡張ライブラリが必要な定数はあらかじめ定義しておいた方が良い +でしょう.定数を定義する関数は二つあります. void rb_define_const(VALUE klass, const char *name, VALUE val) void rb_define_global_const(const char *name, VALUE val) -ԤΥ饹/⥸塼°Ρ -ԤϥХΤǤ +前者は特定のクラス/モジュールに属する定数を定義するもの,後 +者はグローバルな定数を定義するものです. -2.2 RubyεǽCƤӽФ +2.2 Rubyの機能をCから呼び出す -ˡ1.5 RubyΥǡ٤ǰҲ𤷤褦ʴؿ -ȤСRubyεǽ¸ƤؿľܸƤӽФȤ -ޤ +既に『1.5 Rubyのデータを操作する』で一部紹介したような関数を +使えば,Rubyの機能を実現している関数を直接呼び出すことが出来 +ます. -# Τ褦ʴؿΰɽϤޤΤȤޤ -# 뤷ʤǤ͡ +# このような関数の一覧表はいまのところありません.ソースを見 +# るしかないですね. -ʳˤRubyεǽƤӽФˡϤĤޤ +それ以外にもRubyの機能を呼び出す方法はいくつかあります. -2.2.1 RubyΥץeval +2.2.1 Rubyのプログラムをevalする -CRubyεǽƤӽФäȤñˡȤơʸ -Ϳ줿RubyΥץɾʲδؿޤ +CからRubyの機能を呼び出すもっとも簡単な方法として,文字列で +与えられたRubyのプログラムを評価する以下の関数があります. VALUE rb_eval_string(const char *str) -ɾϸߤδĶǹԤޤĤޤꡤߤΥѿ -ʤɤѤޤ +この評価は現在の環境で行われます.つまり,現在のローカル変数 +などを受け継ぎます. -ɾ㳰ȯ뤫⤷ʤȤդޤ礦. -ʴؿ⤢ޤ. +評価は例外を発生するかもしれないことに注意しましょう. より安全 +な関数もあります. VALUE rb_eval_string_protect(const char *str, int *state) -δؿϥ顼ȯnil֤ޤơˤ -*stateϥˡʤˤʤޤ +この関数はエラーが発生するとnilを返します.そして,成功時には +*stateはゼロに,さもなくば非ゼロになります. -2.2.2 IDޤϥܥ +2.2.2 IDまたはシンボル -CʸͳRubyΥåɤƤӽФȤǤ -ˡRubyץǥåɤѿ̾ꤹ -˻ȤƤIDˤĤƤޤ礦 +Cから文字列を経由せずにRubyのメソッドを呼び出すこともできま +す.その前に,Rubyインタプリタ内でメソッドや変数名を指定する +時に使われているIDについて説明しておきましょう. -IDȤѿ̾å̾ɽǤRubyǤ +IDとは変数名,メソッド名を表す整数です.Rubyの中では - :̻ -ޤ - :"Ǥդʸ" + :識別子 +または + :"任意の文字列" -ǥǤޤC餳뤿ˤϴؿ +でアクセスできます.Cからこの整数を得るためには関数 rb_intern(const char *name) -ȤޤRubyȤͿ줿ܥ(ޤʸ -)IDѴˤϰʲδؿȤޤ +を使います.Rubyから引数として与えられたシンボル(または文字 +列)をIDに変換するには以下の関数を使います. rb_to_id(VALUE symbol) -2.2.3 CRubyΥåɤƤӽФ +2.2.3 CからRubyのメソッドを呼び出す -CʸͳRubyΥåɤƤӽФˤϰʲ -δؿȤޤ +Cから文字列を経由せずにRubyのメソッドを呼び出すためには以下 +の関数を使います. VALUE rb_funcall(VALUE recv, ID mid, int argc, ...) -δؿϥ֥recvmidǻꤵåɤƤӽ -ޤ¾˰λλ㤦ʲδؿ⤢ޤ +この関数はオブジェクトrecvのmidで指定されるメソッドを呼び出 +します.その他に引数の指定の仕方が違う以下の関数もあります. VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) VALUE rb_apply(VALUE recv, ID mid, VALUE args) -applyˤϰȤRubyͿޤ +applyには引数としてRubyの配列を与えます. -2.2.4 ѿ// +2.2.4 変数/定数を参照/更新する -CؿȤäƻȡǤΤϡ -ǤѿϰΤΤCѿȤƥǤ -ޤѿȤˡϸƤޤ +Cから関数を使って参照・更新できるのは,定数,インスタンス変 +数です.大域変数は一部のものはCの大域変数としてアクセスでき +ます.ローカル変数を参照する方法は公開していません. -֥ȤΥѿȡؿϰʲ -Ǥ +オブジェクトのインスタンス変数を参照・更新する関数は以下の通 +りです. VALUE rb_ivar_get(VALUE obj, ID id) VALUE rb_ivar_set(VALUE obj, ID id, VALUE val) -idrb_intern()ΤȤäƤ +idはrb_intern()で得られるものを使ってください. -ȤˤϰʲδؿȤäƤ +定数を参照するには以下の関数を使ってください. VALUE rb_const_get(VALUE obj, ID id) -뤿ˤϡ2.1.3 ٤ǾҲ -ƤؿȤäƤ +定数を新しく定義するためには『2.1.3 定数定義』で紹介さ +れている関数を使ってください. -3RubyCȤξͭ +3.RubyとCとの情報共有 -CRubyδ֤ǾͭˡˤĤƲ⤷ޤ +C言語とRubyの間で情報を共有する方法について解説します. -3.1 C黲ȤǤRuby +3.1 Cから参照できるRubyの定数 -ʲRubyCΥ٥뤫黲ȤǤޤ +以下のRubyの定数はCのレベルから参照できます. Qtrue Qfalse - ͡QfalseCǤȤߤʤޤ(Ĥޤ0) + 真偽値.QfalseはC言語でも偽とみなされます(つまり0). Qnil - C줫鸫nilס + C言語から見た「nil」. -3.2 CRubyǶͭѿ +3.2 CとRubyで共有される大域変数 -CRubyѿȤäƾͭǤޤͭǤ -ѿˤϤĤμबޤΤʤǤäȤɤȤ -ȻפΤrb_define_variable()Ǥ +CとRubyで大域変数を使って情報を共有できます.共有できる大域 +変数にはいくつかの種類があります.そのなかでもっとも良く使わ +れると思われるのはrb_define_variable()です. void rb_define_variable(const char *name, VALUE *var) -δؿRubyCȤǶͭѿޤѿ̾ -`$'ǻϤޤʤˤϼưŪɲäޤѿͤ -ȼưŪRubyбѿͤѤޤ +この関数はRubyとCとで共有する大域変数を定義します.変数名が +`$'で始まらない時には自動的に追加されます.この変数の値を変 +更すると自動的にRubyの対応する変数の値も変わります. -ޤRuby¦ϹǤʤѿ⤢ޤread only -ѿϰʲδؿޤ +またRuby側からは更新できない変数もあります.このread onlyの +変数は以下の関数で定義します. void rb_define_readonly_variable(const char *name, VALUE *var) -ѿ¾hookĤѿǤޤhookդ -ѿϰʲδؿѤޤhookդѿ -ͤλȤhookǹԤɬפޤ +これら変数の他にhookをつけた大域変数を定義できます.hook付き +の大域変数は以下の関数を用いて定義します.hook付き大域変数の +値の参照や設定はhookで行う必要があります. void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)()) -δؿCδؿˤähookΤĤ줿ѿ -ѿȤ줿ˤϴؿgetterѿͤåȤ -ˤϴؿsetterƤФ롥hookꤷʤgetter -setter0ꤷޤ -# gettersetter0ʤrb_define_variable()Ʊˤʤ롥 +この関数はCの関数によってhookのつけられた大域変数を定義しま +す.変数が参照された時には関数getterが,変数に値がセットされ +た時には関数setterが呼ばれる.hookを指定しない場合はgetterや +setterに0を指定します. +# getterもsetterも0ならばrb_define_variable()と同じになる. -gettersetterλͤϼ̤Ǥ +getterとsetterの仕様は次の通りです. VALUE (*getter)(ID id, VALUE *var); void (*setter)(VALUE val, ID id, VALUE *var); -줫顤бCѿʤRubyѿ -ȤǤޤ. ѿͤϥեåؿΤߤˤäƼ -ޤ. +それから,対応するCの変数を持たないRubyの大域変数を定義する +こともできます. その変数の値はフック関数のみによって取得・設定 +されます. void rb_define_virtual_variable(const char *name, VALUE (*getter)(), void (*setter)()) -δؿˤä줿RubyѿȤ줿ˤ -getterѿͤåȤ줿ˤsetterƤФޤ +この関数によって定義されたRubyの大域変数が参照された時には +getterが,変数に値がセットされた時にはsetterが呼ばれます. -gettersetterλͤϰʲ̤Ǥ +getterとsetterの仕様は以下の通りです. (*getter)(ID id); (*setter)(VALUE val, ID id); -3.3 CΥǡRuby֥Ȥˤ +3.3 CのデータをRubyオブジェクトにする -C줿ǡ(¤)RubyΥ֥ȤȤ -갷礬ꤨޤΤ褦ʾˤϡDataȤ -Ruby֥ȤCι¤(ؤΥݥ)ळȤRuby -֥ȤȤƼ갷褦ˤʤޤ +Cの世界で定義されたデータ(構造体)をRubyのオブジェクトとして +取り扱いたい場合がありえます.このような場合には,Dataという +RubyオブジェクトにCの構造体(へのポインタ)をくるむことでRuby +オブジェクトとして取り扱えるようになります. -Data֥Ȥƹ¤ΤRuby֥Ȥ˥ץ -뤿ˤϡʲΥޥȤޤ +Dataオブジェクトを生成して構造体をRubyオブジェクトにカプセル +化するためには,以下のマクロを使います. Data_Wrap_Struct(klass, mark, free, ptr) -Υޥͤ줿Data֥ȤǤ +このマクロの戻り値は生成されたDataオブジェクトです. -klassϤData֥ȤΥ饹Ǥptrϥץ벽 -Cι¤ΤؤΥݥǤmarkϤι¤ΤRubyΥ֥ -ȤؤλȤ˻ȤؿǤΤ褦ʻȤޤޤʤ -ˤ0ꤷޤ +klassはこのDataオブジェクトのクラスです.ptrはカプセル化する +Cの構造体へのポインタです.markはこの構造体がRubyのオブジェ +クトへの参照がある時に使う関数です.そのような参照を含まない +時には0を指定します. -# Τ褦ʻȤϴޤ +# そのような参照は勧められません. -freeϤι¤Τ⤦פˤʤä˸ƤФؿǤ -ؿ١쥯ƤФޤ줬-1ξϡñ -˳ޤ +freeはこの構造体がもう不要になった時に呼ばれる関数です.この +関数がガーベージコレクタから呼ばれます.これが-1の場合は,単 +純に開放されます. -markfreeؿGC¹˸ƤӽФޤ. -ʤ, GC¹Ruby֥ȤΥ϶ػߤ -. ä, markfreeؿRuby֥ȤΥ -ϹԤʤǤ. +markおよびfree関数はGC実行中に呼び出されます. +なお, GC実行中はRubyオブジェクトのアロケーションは禁止されま +す. よって, markおよびfree関数でRubyオブジェクトのアロケーシ +ョンは行わないでください. -Cι¤ΤγData֥ȤƱ˹Ԥޥ -ưʲΤΤƤޤ +Cの構造体の割当とDataオブジェクトの生成を同時に行うマクロと +して以下のものが提供されています. Data_Make_Struct(klass, type, mark, free, sval) -Υޥͤ줿Data֥ȤǤ +このマクロの戻り値は生成されたDataオブジェクトです. -klass, mark, freeData_Wrap_StructƱƯޤtype -ϳƤC¤ΤηǤƤ줿¤Τѿsval -ޤѿη (type*) Ǥɬפޤ +klass, mark, freeはData_Wrap_Structと同じ働きをします.type +は割り当てるC構造体の型です.割り当てられた構造体は変数sval +に代入されます.この変数の型は (type*) である必要があります. -Data֥ȤݥФΤϰʲΥޥѤ -ޤ +Dataオブジェクトからポインタを取り出すのは以下のマクロを用い +ます. Data_Get_Struct(obj, type, sval) -Cι¤ΤؤΥݥѿsvalޤ +Cの構造体へのポインタは変数svalに代入されます. -DataλȤϤäʬˤΤǡ -ȤƤ +これらのDataの使い方はちょっと分かりにくいので,後で説明する +例題を参照してください. -4 - dbmѥå +4.例題 - dbmパッケージを作る -ޤǤǤȤꤢĥ饤֥ϺϤǤ -Rubyextǥ쥯ȥˤǤ˴ޤޤƤdbm饤֥ -ʳŪޤ +ここまでの説明でとりあえず拡張ライブラリは作れるはずです. +Rubyのextディレクトリにすでに含まれているdbmライブラリを例に +して段階的に説明します. -(1) ǥ쥯ȥ +(1) ディレクトリを作る % mkdir ext/dbm -Ruby 1.1ǤդΥǥ쥯ȥǥʥߥå饤֥ -뤳ȤǤ褦ˤʤޤRubyŪ˥ -RubyŸǥ쥯ȥβextǥ쥯ȥ˳ĥ -饤֥ѤΥǥ쥯ȥɬפޤ̾Ŭ -ǹޤ +Ruby 1.1からは任意のディレクトリでダイナミックライブラリを作 +ることができるようになりました.Rubyに静的にリンクする場合に +はRubyを展開したディレクトリの下,extディレクトリの中に拡張 +ライブラリ用のディレクトリを作る必要があります.名前は適当に +選んで構いません. -(2) ߷פ +(2) 設計する -ޤʤǤɡɤǽ¸뤫ɤޤ -פɬפޤɤʥ饹Ĥ뤫Υ饹ˤ -ɤʥåɤ뤫饹ʤɤˤĤ߷ -ޤ +まあ,当然なんですけど,どういう機能を実現するかどうかまず設 +計する必要があります.どんなクラスをつくるか,そのクラスには +どんなメソッドがあるか,クラスが提供する定数などについて設計 +します. -(3) Cɤ +(3) Cコードを書く -ĥ饤֥ΤȤʤCΥޤCΥ -ҤȤĤλˤϡ֥饤֥̾.cפ֤ɤǤ礦C -Υʣξˤϵդˡ֥饤֥̾.cפȤե -̾ɬפޤ֥ȥեȥ⥸塼 -Ū֥饤֥̾.oפȤե -Ȥͤ뤫ǤޤҤ mkmf 饤֥Τ -δؿѥפƥȤΤˡconftest.cפȤ -ե̾Ѥ뤳ȤդƤե -̾Ȥơconftest.cפѤƤϤʤޤ +拡張ライブラリ本体となるC言語のソースを書きます.C言語のソー +スがひとつの時には「ライブラリ名.c」を選ぶと良いでしょう.C +言語のソースが複数の場合には逆に「ライブラリ名.c」というファ +イル名は避ける必要があります.オブジェクトファイルとモジュー +ル生成時に中間的に生成される「ライブラリ名.o」というファイル +とが衝突するからです.また,後述する mkmf ライブラリのいくつ +かの関数がコンパイルを要するテストのために「conftest.c」とい +うファイル名を使用することに注意してください.ソースファイル +名として「conftest.c」を使用してはなりません. -Rubyϳĥ饤֥ɤˡInit_饤֥̾פ -ؿưŪ˼¹Ԥޤdbm饤֥ξInit_dbm -Ǥδؿǥ饹⥸塼롤åɡʤɤ -Ԥޤdbm.cѤޤ +Rubyは拡張ライブラリをロードする時に「Init_ライブラリ名」と +いう関数を自動的に実行します.dbmライブラリの場合「Init_dbm」 +です.この関数の中でクラス,モジュール,メソッド,定数などの +定義を行います.dbm.cから一部引用します. -- void Init_dbm(void) { - /* DBM饹 */ + /* DBMクラスを定義する */ cDBM = rb_define_class("DBM", rb_cObject); - /* DBMEnumerate⥸塼롼ɤ */ + /* DBMはEnumerateモジュールをインクルードする */ rb_include_module(cDBM, rb_mEnumerable); - /* DBM饹Υ饹åopen(): CǼ */ + /* DBMクラスのクラスメソッドopen(): 引数はCの配列で受ける */ rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1); - /* DBM饹Υåclose(): Ϥʤ */ + /* DBMクラスのメソッドclose(): 引数はなし */ rb_define_method(cDBM, "close", fdbm_close, 0); - /* DBM饹Υå[]: 1 */ + /* DBMクラスのメソッド[]: 引数は1個 */ rb_define_method(cDBM, "[]", fdbm_fetch, 1); : - /* DBMǡǼ륤ѿ̾ΤID */ + /* DBMデータを格納するインスタンス変数名のためのID */ id_dbm = rb_intern("dbm"); } -- -DBM饤֥dbmΥǡб륪֥ȤˤʤϤ -顤CdbmRuby˼ɬפޤ +DBMライブラリはdbmのデータと対応するオブジェクトになるはずで +すから,Cの世界のdbmをRubyの世界に取り込む必要があります. -dbm.cǤData_Make_StructʲΤ褦˻ȤäƤޤ +dbm.cではData_Make_Structを以下のように使っています. -- struct dbmdata { @@ -729,12 +840,12 @@ struct dbmdata { obj = Data_Make_Struct(klass, struct dbmdata, 0, free_dbm, dbmp); -- -Ǥdbmstruct¤ΤؤΥݥData˥ץ벽Ƥ -ޤDBM*ľܥץ벽ʤΤclose()ν -ƤΤȤǤ +ここではdbmstruct構造体へのポインタをDataにカプセル化してい +ます.DBM*を直接カプセル化しないのはclose()した時の処理を考 +えてのことです. -Data֥Ȥdbmstruct¤ΤΥݥФ -˰ʲΥޥȤäƤޤ +Dataオブジェクトからdbmstruct構造体のポインタを取り出すため +に以下のマクロを使っています. -- #define GetDBM(obj, dbmp) {\ @@ -743,14 +854,14 @@ Data֥Ȥdbmstruct¤ΤΥݥФ } -- -äʣʥޥǤפdbmdata¤ΤΥݥ -μФȡcloseƤ뤫ɤΥåޤȤƤ -Ǥ +ちょっと複雑なマクロですが,要するにdbmdata構造体のポインタ +の取り出しと,closeされているかどうかのチェックをまとめてい +るだけです. -DBM饹ˤϤåɤޤʬह3 -μޤҤȤĤϰοΤΤǡ -ƤdeleteåɤޤdeleteåɤƤ -fdbm_delete()ϤΤ褦ˤʤäƤޤ +DBMクラスにはたくさんメソッドがありますが,分類すると3種類の +引数の受け方があります.ひとつは引数の数が固定のもので,例と +してはdeleteメソッドがあります.deleteメソッドを実装している +fdbm_delete()はこのようになっています. -- static VALUE @@ -760,13 +871,13 @@ fdbm_delete(VALUE obj, VALUE keystr) } -- -οΥפ1self2ʹߤå -ΰȤʤޤ +引数の数が固定のタイプは第1引数がself,第2引数以降がメソッド +の引数となります. -οΤΤCǼΤRubyǼ -ΤȤޤdbm饤֥ǡCǼ -DBMΥ饹åɤǤopen()ǤƤ -fdbm_s_open()ϤʤäƤޤ +引数の数が不定のものはCの配列で受けるものとRubyの配列で受け +るものとがあります.dbmライブラリの中で,Cの配列で受けるもの +はDBMのクラスメソッドであるopen()です.これを実装している関 +数fdbm_s_open()はこうなっています. -- static VALUE @@ -780,18 +891,18 @@ fdbm_s_open(int argc, VALUE *argv, VALUE klass) } -- -Υפδؿ1Ϳ줿ο2Ϳ -줿äƤˤʤޤself3ȤͿ -ޤ +このタイプの関数は第1引数が与えられた引数の数,第2引数が与え +られた引数の入っている配列になります.selfは第3引数として与 +えられます. -Ϳ줿Ϥ뤿δؿopen()ǤȤ -Ƥrb_scan_args()Ǥ3˻ꤷեޥåȤ˽ -4ѿʹߤ˻ꤷVALUEؤλȤͤƤ - +この配列で与えられた引数を解析するための関数がopen()でも使わ +れているrb_scan_args()です.第3引数に指定したフォーマットに従 +い,第4変数以降に指定したVALUEへの参照に値を代入してくれま +す. -RubyȤƼåɤˤ -Thread#initializeޤϤǤ +引数をRubyの配列として受け取るメソッドの例には +Thread#initializeがあります.実装はこうです. -- static VALUE @@ -801,141 +912,141 @@ thread_initialize(VALUE thread, VALUE args) } -- -1self2RubyǤ +第1引数はself,第2引数はRubyの配列です. -** ջ +** 注意事項 -RubyȶͭϤʤRubyΥ֥ȤǼǽΤ -CѿϰʲδؿȤäRubyץѿ¸ -ƤƤǤʤGCǥȥ֥ޤ +Rubyと共有はしないがRubyのオブジェクトを格納する可能性のある +Cの大域変数は以下の関数を使ってRubyインタプリタに変数の存在 +を教えてあげてください.でないとGCでトラブルを起こします. void rb_global_variable(VALUE *var) -(4) extconf.rbѰդ +(4) extconf.rbを用意する -Makefileοˤʤextconf.rbȤե -ޤextconf.rbϥ饤֥ΥѥɬפʾΥ -ʤɤԤȤŪǤޤ +Makefileを作る場合の雛型になるextconf.rbというファイルを作り +ます.extconf.rbはライブラリのコンパイルに必要な条件のチェッ +クなどを行うことが目的です.まず, require 'mkmf' -extconf.rbƬ֤ޤextconf.rbǤϰʲRuby -ȤȤޤ +をextconf.rbの先頭に置きます.extconf.rbの中では以下のRuby関 +数を使うことが出来ます. - have_library(lib, func): 饤֥¸ߥå - have_func(func, header): ؿ¸ߥå - have_header(header): إåե¸ߥå - create_makefile(target): Makefile + have_library(lib, func): ライブラリの存在チェック + have_func(func, header): 関数の存在チェック + have_header(header): ヘッダファイルの存在チェック + create_makefile(target): Makefileの生成 -ʲѿȤȤǤޤ +以下の変数を使うことができます. - $CFLAGS: ѥɲŪ˻ꤹե饰(-Oʤ) - $CPPFLAGS: ץץåɲŪ˻ꤹե饰(-I-Dʤ) - $LDFLAGS: ɲŪ˻ꤹե饰(-Lʤ) - $objs: 륪֥ȥե̾Υꥹ + $CFLAGS: コンパイル時に追加的に指定するフラグ(-Oなど) + $CPPFLAGS: プリプロセッサに追加的に指定するフラグ(-Iや-Dなど) + $LDFLAGS: リンク時に追加的に指定するフラグ(-Lなど) + $objs: リンクされるオブジェクトファイル名のリスト -֥ȥեΥꥹȤϡ̾ϥե -ƼưŪޤmakeǥ褦 -Ū˻ꤹɬפޤ +オブジェクトファイルのリストは,通常はソースファイルを検索し +て自動的に生成されますが,makeの途中でソースを生成するような +場合は明示的に指定する必要があります. -饤֥ѥ뤹郎·鷺Υ饤֥ -ѥ뤷ʤˤcreate_makefileƤФʤMakefile -줺ѥԤޤ +ライブラリをコンパイルする条件が揃わず,そのライブラリをコン +パイルしない時にはcreate_makefileを呼ばなければMakefileは生 +成されず,コンパイルも行われません. -(5) dependѰդ +(5) dependを用意する -⤷ǥ쥯ȥdependȤե뤬¸ߤС -Makefile¸طåƤޤ +もし,ディレクトリにdependというファイルが存在すれば, +Makefileが依存関係をチェックしてくれます. % gcc -MM *.c > depend -ʤɤǺ뤳Ȥޤä»̵Ǥ礦 +などで作ることが出来ます.あって損は無いでしょう. -(6) Makefile +(6) Makefileを生成する -Makefileºݤ뤿ˤ +Makefileを実際に生成するためには ruby extconf.rb -Ȥޤextconf.rb require 'mkmf' ιԤʤˤϥ顼 -ˤʤޤΤǡɲä +とします.extconf.rbに require 'mkmf' の行がない場合にはエラー +になりますので,引数を追加して ruby -r mkmf extconf.rb -ȤƤ +としてください. -site_ruby ǥ쥯ȥǤʤ -vendor_ruby ǥ쥯ȥ˥ȡ뤹ˤ -ʲΤ褦 --vendor ץäƤ +site_ruby ディレクトリでなく, +vendor_ruby ディレクトリにインストールする場合には +以下のように --vendor オプションを加えてください. ruby extconf.rb --vendor -ǥ쥯ȥextʲѰդˤRubyΤmakeλ -ưŪMakefileޤΤǡΥƥåפפǤ +ディレクトリをext以下に用意した場合にはRuby全体のmakeの時に +自動的にMakefileが生成されますので,このステップは不要です. -(7) make +(7) makeする -ưŪ饤֥ˤϤξmakeƤ -ɬפǤ make install ǥȡ뤵ޤ +動的リンクライブラリを生成する場合にはその場でmakeしてくださ +い.必要であれば make install でインストールされます. -extʲ˥ǥ쥯ȥѰդϡRubyΥǥ쥯ȥ -make¹ԤMakefilemakeɬפˤäƤϤΥ -塼RubyؤΥޤǼưŪ˼¹ԤƤޤ -extconf.rbʤɤMakefileκɬפʻϤ -Rubyǥ쥯ȥmakeƤ +ext以下にディレクトリを用意した場合は,Rubyのディレクトリで +makeを実行するとMakefileを生成からmake,必要によってはそのモ +ジュールのRubyへのリンクまで自動的に実行してくれます. +extconf.rbを書き換えるなどしてMakefileの再生成が必要な時はま +たRubyディレクトリでmakeしてください. -ĥ饤֥make installRuby饤֥Υǥ쥯ȥ -˥ԡޤ⤷ĥ饤֥ȶĴƻȤRubyǵ -Ҥ줿ץबꡤRuby饤֥֤ˤϡ -ĥ饤֥ѤΥǥ쥯ȥβ lib Ȥǥ쥯ȥ -ꡤ ĥ .rb Υե֤ƤƱ˥ -ȡ뤵ޤ +拡張ライブラリはmake installでRubyライブラリのディレクトリの +下にコピーされます.もし拡張ライブラリと協調して使うRubyで記 +述されたプログラムがあり,Rubyライブラリに置きたい場合には, +拡張ライブラリ用のディレクトリの下に lib というディレクトリ +を作り,そこに 拡張子 .rb のファイルを置いておけば同時にイン +ストールされます. -(8) ǥХå +(8) デバッグ -ޤǥХåʤưʤǤ礦͡ext/Setup˥ǥ -ȥ̾Ū˥ΤǥǥХåȤ褦ˤ -ޤʬѥ뤬٤ʤޤɡ +まあ,デバッグしないと動かないでしょうね.ext/Setupにディレ +クトリ名を書くと静的にリンクするのでデバッガが使えるようにな +ります.その分コンパイルが遅くなりますけど. -(9) Ǥ +(9) できあがり -ϤäȤʤꡤʤꡤʤꡤͳˤ -ȤRubyκԤϳĥ饤֥˴ؤưڤθ -ĥޤ +後はこっそり使うなり,広く公開するなり,売るなり,ご自由にお +使いください.Rubyの作者は拡張ライブラリに関して一切の権利を +主張しません. -Appendix A. RubyΥɤʬ +Appendix A. Rubyのソースコードの分類 -RubyΥϤĤʬह뤳ȤޤΤ -饤֥ʬϴŪ˳ĥ饤֥Ʊˤʤ -ƤޤΥϺޤǤǤۤȤǤ -פޤ +Rubyのソースはいくつかに分類することが出来ます.このうちクラ +スライブラリの部分は基本的に拡張ライブラリと同じ作り方になっ +ています.これらのソースは今までの説明でほとんど理解できると +思います. -RubyΥ +Ruby言語のコア - class.c : 饹ȥ⥸塼 - error.c : 㳰饹㳰 - gc.c : ΰ - load.c : 饤֥Υ - object.c : ֥ - variable.c : ѿ + class.c : クラスとモジュール + error.c : 例外クラスと例外機構 + gc.c : 記憶領域管理 + load.c : ライブラリのロード + object.c : オブジェクト + variable.c : 変数と定数 -Rubyιʸϴ - parse.y : ϴȹʸ - -> parse.c : ư - keywords : ͽ - -> lex.c : ư +Rubyの構文解析器 + parse.y : 字句解析器と構文定義 + -> parse.c : 自動生成 + keywords : 予約語 + -> lex.c : 自動生成 -Rubyɾ (̾YARV) +Rubyの評価器 (通称YARV) compile.c eval.c eval_error.c eval_jump.c eval_safe.c - insns.def : ۵ - iseq.c : VM::ISeqμ - thread.c : åɴȥƥڤؤ - thread_win32.c : åɼ - thread_pthread.c : Ʊ + insns.def : 仮想機械語の定義 + iseq.c : VM::ISeqの実装 + thread.c : スレッド管理とコンテキスト切り替え + thread_win32.c : スレッド実装 + thread_pthread.c : 同上 vm.c vm_dump.c vm_eval.c @@ -943,14 +1054,14 @@ Rubyɾ (̾YARV) vm_insnhelper.c vm_method.c - opt_insns_unif.def : ̿ͻ - opt_operand.def : ŬΤ + opt_insns_unif.def : 命令融合 + opt_operand.def : 最適化のための定義 - -> insn*.inc : ư - -> opt*.inc : ư - -> vm.inc : ư + -> insn*.inc : 自動生成 + -> opt*.inc : 自動生成 + -> vm.inc : 自動生成 -ɽ () +正規表現エンジン (鬼車) regex.c regcomp.c regenc.c @@ -959,15 +1070,15 @@ Rubyɾ (̾YARV) regparse.c regsyntax.c -桼ƥƥؿ +ユーティリティ関数 - debug.c : CǥХåѤΥǥХåܥ - dln.c : ưŪǥ - st.c : ѥϥåɽ - strftime.c : - util.c : ¾Υ桼ƥƥ + debug.c : Cデバッガ用のデバッグシンボル + dln.c : 動的ローディング + st.c : 汎用ハッシュ表 + strftime.c : 時刻整形 + util.c : その他のユーティリティ -Rubyޥɤμ +Rubyコマンドの実装 dmyext.c dmydln.c @@ -981,7 +1092,7 @@ Rubyޥɤμ gem_prelude.rb prelude.rb -饹饤֥ +クラスライブラリ array.c : Array bignum.c : Bignum @@ -1000,7 +1111,7 @@ Rubyޥɤμ pack.c : Array#pack, String#unpack proc.c : Binding, Proc process.c : Process - random.c : + random.c : 乱数 range.c : Range rational.c : Rational re.c : Regexp, MatchData @@ -1010,69 +1121,74 @@ Rubyޥɤμ struct.c : Struct time.c : Time - defs/known_errors.def : 㳰饹 Errno::* - -> known_errors.inc : ư + defs/known_errors.def : 例外クラス Errno::* + -> known_errors.inc : 自動生成 -¿첽 +多言語化 encoding.c : Encoding transcode.c : Encoding::Converter - enc/*.c : ǥ饹 - enc/trans/* : ɥݥбɽ + enc/*.c : エンコーディングクラス群 + enc/trans/* : コードポイント対応表 -gorubyޥɤμ +<<<<<<< HEAD +gorubyコマンドの実装 +======= +gorubyコマンドの実装 + +>>>>>>> Change encoding from EUC-JP to UTF-8. [Feature #5128] goruby.c - golf_prelude.rb : gorubyͭΥ饤֥ - -> golf_prelude.c : ư + golf_prelude.rb : goruby固有のライブラリ + -> golf_prelude.c : 自動生成 -Appendix B. ĥѴؿե +Appendix B. 拡張用関数リファレンス -C줫RubyεǽѤAPIϰʲ̤Ǥ롥 +C言語からRubyの機能を利用するAPIは以下の通りである. -** +** 型 VALUE - Ruby֥Ȥɽ뷿ɬפ˱ƥ㥹ȤѤ롥 - Ȥ߹߷ɽCηruby.h˵ҤƤRǻϤޤ빽¤ - ΤǤ롥VALUE˥㥹Ȥ뤿RǻϤޤ빽¤ - ̾ʸˤ̾ΥޥѰդƤ롥 + Rubyオブジェクトを表現する型.必要に応じてキャストして用いる. + 組み込み型を表現するCの型はruby.hに記述してあるRで始まる構造 + 体である.VALUE型をこれらにキャストするためにRで始まる構造体 + 名を全て大文字にした名前のマクロが用意されている. -** ѿ +** 変数・定数 Qnil - : nil֥ + 定数: nilオブジェクト Qtrue - : true֥(Υǥե) + 定数: trueオブジェクト(真のデフォルト値) Qfalse - : false֥ + 定数: falseオブジェクト -** CǡΥץ벽 +** Cデータのカプセル化 Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval) - CǤդΥݥץ벽Ruby֥Ȥ֤ - ΥݥRuby饢ʤʤäfreeǻꤷ - ؿƤФ롥ޤΥݥλؤǡ¾Ruby - ȤؤƤ硤mark˻ꤹؿǥޡɬ - 롥 + Cの任意のポインタをカプセル化したRubyオブジェクトを返す.こ + のポインタがRubyからアクセスされなくなった時,freeで指定した + 関数が呼ばれる.また,このポインタの指すデータが他のRubyオブ + ジェクトを指している場合,markに指定する関数でマークする必要 + がある. Data_Make_Struct(klass, type, mark, free, sval) - typeΥmallocѿsval塤ץ - 벽ǡ֤ޥ + type型のメモリをmallocし,変数svalに代入した後,それをカプセ + ル化したデータを返すマクロ. Data_Get_Struct(data, type, sval) - datatypeΥݥФѿsvalޥ + dataからtype型のポインタを取り出し変数svalに代入するマクロ. -** å +** 型チェック TYPE(value) FIXNUM_P(value) @@ -1080,7 +1196,7 @@ NIL_P(value) void Check_Type(VALUE value, int type) void Check_SafeStr(VALUE value) -** Ѵ +** 型変換 FIX2INT(value), INT2FIX(i) FIX2LONG(value), LONG2FIX(l) @@ -1100,105 +1216,114 @@ StringValuePtr(value) StringValueCStr(value) rb_str_new2(s) -** 饹/⥸塼 +** クラス/モジュール定義 VALUE rb_define_class(const char *name, VALUE super) - superΥ֥饹ȤƿRuby饹롥 + superのサブクラスとして新しいRubyクラスを定義する. VALUE rb_define_class_under(VALUE module, const char *name, VALUE super) - superΥ֥饹ȤƿRuby饹module - Ȥ롥 + superのサブクラスとして新しいRubyクラスを定義し,moduleの + 定数として定義する. VALUE rb_define_module(const char *name) - Ruby⥸塼롥 + 新しいRubyモジュールを定義する. VALUE rb_define_module_under(VALUE module, const char *name) - Ruby⥸塼moduleȤ롥 + 新しいRubyモジュールを定義し,moduleの定数として定義する. void rb_include_module(VALUE klass, VALUE module) - ⥸塼롼ɤ롥classǤmodule - 롼ɤƤˤϲ⤷ʤ(¿ť롼ɤζػ) + モジュールをインクルードする.classがすでにmoduleをインク + ルードしている時には何もしない(多重インクルードの禁止). void rb_extend_object(VALUE object, VALUE module) - ֥Ȥ⥸塼(Ƥå)dzĥ롥 + オブジェクトをモジュール(で定義されているメソッド)で拡張する. -** ѿ +** 大域変数定義 void rb_define_variable(const char *name, VALUE *var) - RubyCȤǶͭ륰Хѿ롥ѿ̾`$' - ϤޤʤˤϼưŪɲä롥nameȤRubyμ̻ - ȤƵʤʸ(㤨` ')ޤˤRubyץ - फϸʤʤ롥 + RubyとCとで共有するグローバル変数を定義する.変数名が`$'で + 始まらない時には自動的に追加される.nameとしてRubyの識別子 + として許されない文字(例えば` ')を含む場合にはRubyプログラ + ムからは見えなくなる. void rb_define_readonly_variable(const char *name, VALUE *var) - RubyCȤǶͭread onlyΥХѿ롥 - read onlyǤ뤳Ȱʳrb_define_variable()Ʊ + RubyとCとで共有するread onlyのグローバル変数を定義する. + read onlyであること以外はrb_define_variable()と同じ. void rb_define_virtual_variable(const char *name, VALUE (*getter)(), void (*setter)()) - ؿˤäƼ¸Rubyѿ롥ѿȤ줿 - ˤgetterѿͤåȤ줿ˤsetterƤФ - 롥 + 関数によって実現されるRuby変数を定義する.変数が参照された + 時にはgetterが,変数に値がセットされた時にはsetterが呼ばれ + る. void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)()) - ؿˤähookΤĤ줿Хѿ롥ѿ - Ȥ줿ˤgetterؿͤåȤ줿ˤ - setterƤФ롥gettersetter0ꤷˤhook - ꤷʤΤƱˤʤ롥 + 関数によってhookのつけられたグローバル変数を定義する.変数 + が参照された時にはgetterが,関数に値がセットされた時には + setterが呼ばれる.getterやsetterに0を指定した時にはhookを + 指定しないのと同じ事になる. void rb_global_variable(VALUE *var) - GCΤᡤRubyץफϥʤ, Ruby - Ȥޤѿޡ롥 + GCのため,Rubyプログラムからはアクセスされないが, Rubyオブ + ジェクトを含む大域変数をマークする. -** +** 定数 void rb_define_const(VALUE klass, const char *name, VALUE val) - 롥 + 定数を定義する. void rb_define_global_const(const char *name, VALUE val) - 롥 + 大域定数を定義する. rb_define_const(rb_cObject, name, val) - Ʊ̣ + と同じ意味. -** å +** メソッド定義 rb_define_method(VALUE klass, const char *name, VALUE (*func)(), int argc) - åɤ롥argcselfοargc-1λ, - ؿˤϰο(selfޤޤʤ)1, 2 - ȤͿ(3self)argc-2λ, - 1self, 2args(argsϰޤRuby) - Ϳ롥 - +<<<<<<< HEAD + メソッドを定義する.argcはselfを除く引数の数.argcが-1の時, + 関数には引数の数(selfを含まない)を第1引数, 引数の配列を第2 + 引数とする形式で与えられる(第3引数はself).argcが-2の時, + 第1引数がself, 第2引数がargs(argsは引数を含むRubyの配列)と + いう形式で与えられる. + +======= + メソッドを定義する.argcはselfを除く引数の数.argcが-1の時, + 関数には引数の数(selfを含まない)を第1引数, 引数の配列を第2 + 引数とする形式で与えられる(第3引数はself).argcが-2の時, + 第1引数がself, 第2引数がargs(argsは引数を含むRubyの配列)と + いう形式で与えられる. + +>>>>>>> Change encoding from EUC-JP to UTF-8. [Feature #5128] rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(), int argc) - privateåɤ롥rb_define_method()Ʊ + privateメソッドを定義する.引数はrb_define_method()と同じ. rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(), int argc) - ðۥåɤ롥rb_define_method()Ʊ + 特異メソッドを定義する.引数はrb_define_method()と同じ. rb_scan_args(int argc, VALUE *argv, const char *fmt, ...) - argc, argvͿ줿ꤵ줿եޥåȤ˽äư - ʬ³VALUEؤλȤ˥åȤޤΥեޥ - ȤϡABNFǵҤȰʲ̤Ǥ + argc, argv形式で与えられた指定されたフォーマットに従って引 + 数を分解し,続くVALUEへの参照にセットします.このフォーマッ + トは,ABNFで記述すると以下の通りです. -- scan-arg-spec := param-arg-spec [option-hash-arg-spec] [block-arg-spec] @@ -1210,186 +1335,196 @@ pre-opt-post-arg-spec := num-of-leading-mandatory-args num-of-optional-args num- option-hash-arg-spec := sym-for-option-hash-arg block-arg-spec := sym-for-block-arg -num-of-leading-mandatory-args := DIGIT ; Ƭ֤άǽʰο -num-of-optional-args := DIGIT ; ³֤άǽʰο -sym-for-variable-length-args := "*" ; ³֤Ĺ - ; RubyǼ뤿λ -num-of-trailing-mandatory-args := DIGIT ; ü֤άǽʰο -sym-for-option-hash-arg := ":" ; ץϥå - ; λ; άǽʰ - ; ¿ΰꤵ졤 - ; Ǹΰϥåʤޤ - ; #to_hashѴǽˤξ - ; 롥Ǹΰnil - ; 硤Ĺ꤬ʤ - ; άǽο¿ - ; ꤵ줿˼ -sym-for-block-arg := "&" ; ƥ졼֥å뤿 - ; +num-of-leading-mandatory-args := DIGIT ; 先頭に置かれる省略不能な引数の数 +num-of-optional-args := DIGIT ; 続いて置かれる省略可能な引数の数 +sym-for-variable-length-args := "*" ; 続いて置かれる可変長引数を + ; Rubyの配列で取得するための指定 +num-of-trailing-mandatory-args := DIGIT ; 終端に置かれる省略不能な引数の数 +sym-for-option-hash-arg := ":" ; オプションハッシュを取得する + ; ための指定; 省略不能な引数の + ; 数よりも多くの引数が指定され, + ; 最後の引数がハッシュ(または + ; #to_hashで変換可能)の場合に + ; 取得される.最後の引数がnilの + ; 場合,可変長引数指定がなく, + ; 省略不能引数の数よりも多くの + ; 引数が指定された場合に取得される +sym-for-block-arg := "&" ; イテレータブロックを取得するための + ; 指定 -- - եޥåȤ"12"ξ硤Ϻ1Ĥǡ3(1+2)ޤǵ - Ȥ̣ˤʤޤäơեޥåʸ³ - 3ĤVALUEؤλȤ֤ɬפޤˤϼ - ѿåȤޤѿؤλȤNULLꤹ - ȤǤξϼͤϼΤƤޤʤ - άǽά줿ѿͤnil(CΥ٥Ǥ - Qnil)ˤʤޤ + フォーマットが"12"の場合,引数は最低1つで,3つ(1+2)まで許さ + れるという意味になります.従って,フォーマット文字列に続い + て3つのVALUEへの参照を置く必要があります.それらには取得した + 変数がセットされます.変数への参照の代わりにNULLを指定する + こともでき,その場合は取得した引数の値は捨てられます.なお, + 省略可能引数が省略された時の変数の値はnil(C言語のレベルでは + Qnil)になります. - ֤ͤͿ줿οǤץϥå太ӥ - ƥ졼֥åϿޤ + 返り値は与えられた引数の数です.オプションハッシュおよびイ + テレータブロックは数えません. -** RubyåɸƤӽФ +** Rubyメソッド呼び出し VALUE rb_funcall(VALUE recv, ID mid, int narg, ...) - åɸƤӽФʸmid뤿ˤrb_intern() - Ȥ + メソッド呼び出し.文字列からmidを得るためにはrb_intern()を + 使う. VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) - åɸƤӽФargc, argvϤ + メソッド呼び出し.引数をargc, argv形式で渡す. VALUE rb_eval_string(const char *str) - ʸRubyץȤȤƥѥ롦¹Ԥ롥 + 文字列をRubyスクリプトとしてコンパイル・実行する. ID rb_intern(const char *name) - ʸбID֤ + 文字列に対応するIDを返す. char *rb_id2name(ID id) - IDбʸ֤(ǥХå) + IDに対応する文字列を返す(デバッグ用). char *rb_class2name(VALUE klass) - 饹֤̾(ǥХå)饹̾ʤ - , ̤ä̾ĥ饹֤̾ + クラスの名前を返す(デバッグ用).クラスが名前を持たない時に + は, 祖先を遡って名前を持つクラスの名前を返す. int rb_respond_to(VALUE obj, ID id) - objidǼåɤĤɤ֤ + objがidで示されるメソッドを持つかどうかを返す. -** ѿ +** インスタンス変数 VALUE rb_iv_get(VALUE obj, const char *name) - objΥѿͤ롥`@'ǻϤޤʤ - ѿ Rubyץफ饢Ǥʤֱ줿ץ - ѿˤʤ롥ʸ̾ĥ饹(ޤ - ⥸塼)ΥѿȤƼƤ롥 + objのインスタンス変数の値を得る.`@'で始まらないインスタン + ス変数は Rubyプログラムからアクセスできない「隠れた」イン + スタンス変数になる.定数は大文字の名前を持つクラス(または + モジュール)のインスタンス変数として実装されている. VALUE rb_iv_set(VALUE obj, const char *name, VALUE val) - objΥѿval˥åȤ롥 + objのインスタンス変数をvalにセットする. -** 湽¤ +** 制御構造 VALUE rb_block_call(VALUE obj, ID mid, int argc, VALUE * argv, VALUE (*func) (ANYARGS), VALUE data2) - func֥åȤꤷobj쥷Сargcargv - ȤmidåɤƤӽФfuncyield줿͡ - data2롥ʣͤyield줿(CǤ - rb_yield_values()rb_yield_values2(), rb_yield_splat()) - data2ArrayȤƥѥåƤ롥軰, Ͱargc - argvˤäyield줿ͤФȤǤ롥 + funcをブロックとして設定し,objをレシーバ,argcとargvを引数 + としてmidメソッドを呼び出す.funcは第一引数にyieldされた値, + 第二引数にdata2を受け取る.複数の値がyieldされた場合(Cでは + rb_yield_values()とrb_yield_values2(), rb_yield_splat()), + data2はArrayとしてパックされている.第三, 第四引数のargcと + argvによってyieldされた値を取り出すことができる. [OBSOLETE] VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) - func2֥åȤꤷ, func1ƥ졼ȤƸƤ֡ - func1ˤ arg1ȤϤ, func2ˤ1˥ƥ졼 - Ϳ줿, 2arg2Ϥ롥 - - 1.9rb_iterateȤ, func1Ruby٥Υå - ƤӽФʤФʤʤ. - 1.9obsoleteȤʤä. rb_block_callѰդ줿. +<<<<<<< HEAD + func2をブロックとして設定し, func1をイテレータとして呼ぶ. + func1には arg1が引数として渡され, func2には第1引数にイテレー + タから与えられた値, 第2引数にarg2が渡される. + + 1.9でrb_iterateを使う場合は, func1の中でRubyレベルのメソッド + を呼び出さなければならない. + 1.9でobsoleteとなった. 代わりにrb_block_callが用意された. +======= + func2をブロックとして設定し, func1をイテレータとして呼ぶ. + func1には arg1が引数として渡され, func2には第1引数にイテレー + タから与えられた値, 第2引数にarg2が渡される. + + 1.9でrb_iterateを使う場合は, func1の中でRubyレベルのメソッド + を呼び出さなければならない. + 1.9でobsoleteとなった. 代わりにrb_block_callが用意された. +>>>>>>> Change encoding from EUC-JP to UTF-8. [Feature #5128] VALUE rb_yield(VALUE val) - valͤȤƥƥ졼֥åƤӽФ + valを値としてイテレータブロックを呼び出す. VALUE rb_rescue(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) - ؿfunc1arg1˸ƤӽФfunc1μ¹㳰ȯ - ˤ func2arg2ȤƸƤ֡ͤ㳰ȯ - ʤäfunc1, 㳰ȯˤfunc2 - ͤǤ롥 + 関数func1をarg1を引数に呼び出す.func1の実行中に例外が発生 + した時には func2をarg2を引数として呼ぶ.戻り値は例外が発生 + しなかった時はfunc1の戻り値, 例外が発生した時にはfunc2の戻 + り値である. VALUE rb_ensure(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) - ؿfunc1arg1ȤƼ¹Ԥ, ¹Խλ(Ȥ㳰 - ȯƤ) func2arg2ȤƼ¹Ԥ롥ͤfunc1 - ͤǤ(㳰ȯʤ) + 関数func1をarg1を引数として実行し, 実行終了後(たとえ例外が + 発生しても) func2をarg2を引数として実行する.戻り値はfunc1 + の戻り値である(例外が発生した時は戻らない). VALUE rb_protect(VALUE (*func) (VALUE), VALUE arg, int *state) - ؿfuncargȤƼ¹Ԥ, 㳰ȯʤФ - ֤ͤ㳰ȯ, *state0åȤ - Qnil֤ + 関数funcをargを引数として実行し, 例外が発生しなければその戻 + り値を返す.例外が発生した場合は, *stateに非0をセットして + Qnilを返す. void rb_jump_tag(int state) - rb_protect()rb_eval_string_protect()ª줿㳰 - 롥stateϤδؿ֤줿ͤǤʤФʤʤ - δؿľܤθƤӽФʤ + rb_protect()やrb_eval_string_protect()で捕捉された例外を再 + 送する.stateはそれらの関数から返された値でなければならない. + この関数は直接の呼び出し元に戻らない. -** 㳰顼 +** 例外・エラー void rb_warning(const char *fmt, ...) - rb_verboseɸ२顼Ϥ˷ٹɽ롥 - printf()Ʊ + rb_verbose時に標準エラー出力に警告情報を表示する.引数は + printf()と同じ. void rb_raise(rb_eRuntimeError, const char *fmt, ...) - RuntimeError㳰ȯ롥printf()Ʊ + RuntimeError例外を発生させる.引数はprintf()と同じ. void rb_raise(VALUE exception, const char *fmt, ...) - exceptionǻꤷ㳰ȯ롥fmtʲΰ - printf()Ʊ + exceptionで指定した例外を発生させる.fmt以下の引数は + printf()と同じ. void rb_fatal(const char *fmt, ...) - ̿Ū㳰ȯ롥̾㳰ϹԤʤ줺, - ץλ(ensureǻꤵ줿ɤϽλ - ¹Ԥ) + 致命的例外を発生させる.通常の例外処理は行なわれず, インター + プリタが終了する(ただしensureで指定されたコードは終了前に + 実行される). void rb_bug(const char *fmt, ...) - ץʤɥץΥХǤȯϤΤʤ - λƤ֡ץϥפľ˽λ롥 - 㳰ϰڹԤʤʤ + インタープリタなどプログラムのバグでしか発生するはずのない + 状況の時呼ぶ.インタープリタはコアダンプし直ちに終了する. + 例外処理は一切行なわれない. -** Rubyν¹ +** Rubyの初期化・実行 -RubyץꥱˤϰʲΥե -Ȥ̾γĥ饤֥ˤɬפʤ +Rubyをアプリケーションに埋め込む場合には以下のインタフェース +を使う.通常の拡張ライブラリには必要ない. void ruby_init() - RubyץνԤʤ + Rubyインタプリタの初期化を行なう. void ruby_options(int argc, char **argv) - RubyץΥޥɥ饤νԤʤ + Rubyインタプリタのコマンドライン引数の処理を行なう. void ruby_run() - Rubyץ¹Ԥ롥 + Rubyインタプリタを実行する. void ruby_script(char *name) - RubyΥץ̾($0)ꤹ롥 + Rubyのスクリプト名($0)を設定する. -** ץΥ٥ȤΥեå +** インタプリタのイベントのフック void rb_add_event_hook(rb_event_hook_func_t func, rb_event_flag_t events, VALUE data) -ꤵ줿ץΥ٥ȤФեåؿɲäޤ -eventsϰʲͤorǤʤФʤޤ: +指定されたインタプリタのイベントに対するフック関数を追加します. +eventsは以下の値のorでなければなりません: RUBY_EVENT_LINE RUBY_EVENT_CLASS @@ -1401,167 +1536,173 @@ eventsϰʲͤorǤʤФʤޤ: RUBY_EVENT_RAISE RUBY_EVENT_ALL -rb_event_hook_func_tϰʲ̤Ǥ: +rb_event_hook_func_tの定義は以下の通りです: typedef void (*rb_event_hook_func_t)(rb_event_t event, VALUE data, VALUE self, ID id, VALUE klass) -rb_add_event_hook() 3 data ϡեåؿ2 -Ϥޤ1.8ǤϸߤNODEؤΥݥǤ - RB_EVENT_HOOKS_HAVE_CALLBACK_DATA ⻲ȤƤ +rb_add_event_hook() の第3引数 data は,フック関数の第2引数と +して渡されます.これは1.8では現在のNODEへのポインタでした.以 +下の RB_EVENT_HOOKS_HAVE_CALLBACK_DATA も参照してください. int rb_remove_event_hook(rb_event_hook_func_t func) -ꤵ줿եåؿޤ +指定されたフック関数を削除します. -** ߴΤΥޥ +** 互換性のためのマクロ -APIθߴå뤿˰ʲΥޥǥեȤƤޤ +APIの互換性をチェックするために以下のマクロがデフォルトで定義されています. NORETURN_STYLE_NEW - NORETURN ޥؿޥȤƤ뤳Ȥ̣롥 + NORETURN マクロが関数型マクロとして定義されていることを意味する. HAVE_RB_DEFINE_ALLOC_FUNC - rb_define_alloc_func() ؿƤ뤳ȡĤޤ - allocation framework Ȥ뤳Ȥ̣롥 + rb_define_alloc_func() 関数が提供されていること,つまり + allocation framework が使われることを意味する. have_func("rb_define_alloc_func", "ruby.h") - η̤Ʊ + の結果と同じ. HAVE_RB_REG_NEW_STR - String֥ȤRegexp֥Ȥ - rb_reg_new_str() ؿƤ뤳Ȥ̣롥 + StringオブジェクトからRegexpオブジェクトを作る + rb_reg_new_str() 関数が提供されていることを意味する. have_func("rb_reg_new_str", "ruby.h"). - η̤Ʊ + の結果と同じ. HAVE_RB_IO_T - rb_io_t Ƥ뤳Ȥ̣롥 + rb_io_t 型が提供されていることを意味する. USE_SYMBOL_AS_METHOD_NAME - å֤̾åɡModule#methods, #singleton_methods - ʤɤSymbol֤Ȥ̣롥 + メソッド名を返すメソッド,Module#methods, #singleton_methods + などがSymbolを返すことを意味する. HAVE_RUBY_*_H - ruby.h Ƥ롥бإåƤ뤳 - ̣롥ȤСHAVE_RUBY_ST_H Ƥ - ñʤ st.h ǤϤʤ ruby/st.h Ѥ롥 + ruby.h で定義されている.対応するヘッダが提供されていること + を意味する.たとえば,HAVE_RUBY_ST_H が定義されている場合は + 単なる st.h ではなく ruby/st.h を使用する. RB_EVENT_HOOKS_HAVE_CALLBACK_DATA - rb_add_event_hook() եåؿϤ data 3Ȥ - 뤳Ȥ̣롥 + rb_add_event_hook() がフック関数に渡す data を第3引数として + 受け取ることを意味する. -Appendix C. extconf.rbǻȤؿ +Appendix C. extconf.rbで使える関数たち -extconf.rbǤѲǽʥѥåδؿϰ -̤Ǥ롥 +extconf.rbの中では利用可能なコンパイル条件チェックの関数は以 +下の通りである. have_macro(macro, headers) - إåեheader롼ɤƥޥmacro - Ƥ뤫ɤå롥ޥƤtrue - ֤ + ヘッダファイルheaderをインクルードしてマクロmacroが定義さ + れているかどうかチェックする.マクロが定義されている時true + を返す. have_library(lib, func) - ؿfuncƤ饤֥lib¸ߤå롥 - 饤֥꤬¸ߤtrue֤ + 関数funcを定義しているライブラリlibの存在をチェックする. + ライブラリが存在する時,trueを返す. find_library(lib, func, path...) - ؿfuncƤ饤֥lib¸ߤ -Lpath ɲ - ʤå롥饤֥꤬դätrue֤ + 関数funcを定義しているライブラリlibの存在を -Lpath を追加 + しながらチェックする.ライブラリが見付かった時,trueを返す. have_func(func, header) - إåեheader롼ɤƴؿfunc¸ߤ - å롥funcɸǤϥʤ饤֥ΤΤ - ˤhave_libraryǤΥ饤֥åƤ - ؿ¸ߤtrue֤ + ヘッダファイルheaderをインクルードして関数funcの存在をチェ + ックする.funcが標準ではリンクされないライブラリ内のもので + ある時には先にhave_libraryでそのライブラリをチェックしてお + く事.関数が存在する時trueを返す. have_var(var, header) - إåեheader롼ɤѿvar¸ߤ - 롥varɸǤϥʤ饤֥ΤΤǤ - ˤhave_libraryǤΥ饤֥åƤ - ѿ¸ߤtrue֤ + ヘッダファイルheaderをインクルードして変数varの存在をチェッ + クする.varが標準ではリンクされないライブラリ内のものであ + る時には先にhave_libraryでそのライブラリをチェックしておく + 事.変数が存在する時trueを返す. have_header(header) - إåե¸ߤå롥إåե뤬¸ߤ - true֤ + ヘッダファイルの存在をチェックする.ヘッダファイルが存在す + る時trueを返す. find_header(header, path...) - إåեheader¸ߤ -Ipath ɲäʤå - 롥إåե뤬դätrue֤ + ヘッダファイルheaderの存在を -Ipath を追加しながらチェック + する.ヘッダファイルが見付かった時,trueを返す. have_struct_member(type, member, header) - إåեheader롼ɤƷtype˥member - ¸ߤ뤫å롥typeƤơmember - Ĥtrue֤ + ヘッダファイルheaderをインクルードして型typeにメンバmember + が存在するかをチェックする.typeが定義されていて,memberを + 持つする時trueを返す. have_type(type, header, opt) - إåեheader롼ɤƷtype¸ߤ뤫 - å롥typeƤtrue֤ + ヘッダファイルheaderをインクルードして型typeが存在するかを + チェックする.typeが定義されている時trueを返す. check_sizeof(type, header) - إåեheader롼ɤƷtypecharñ̥ - Ĵ٤롥typeƤΥ֤ - ƤʤȤnil֤ + ヘッダファイルheaderをインクルードして型typeのchar単位サイ + ズを調べる.typeが定義されている時そのサイズを返す.定義さ + れていないときはnilを返す. create_makefile(target) - ĥ饤֥ѤMakefile롥δؿƤФʤ - ФΥ饤֥ϥѥ뤵ʤtargetϥ⥸塼̾ - ɽ + 拡張ライブラリ用のMakefileを生成する.この関数を呼ばなけれ + ばそのライブラリはコンパイルされない.targetはモジュール名 + を表す. find_executable(command, path) - ޥcommandFile::PATH_SEPARATORǶڤ줿ѥ̾ - ꥹpathõpathnilޤϾά줿ϡĶ - ѿPATHͤѤ롥¹ԲǽʥޥɤĤä - ϥѥޤե̾Ĥʤänil֤ + コマンドcommandをFile::PATH_SEPARATORで区切られたパス名の + リストpathから探す.pathがnilまたは省略された場合は,環境 + 変数PATHの値を使用する.実行可能なコマンドが見つかった場合 + はパスを含むファイル名,見つからなかった場合はnilを返す. with_config(withval[, default=nil]) - ޥɥ饤--with-<withval>ǻꤵ줿ץ - 롥 + コマンドライン上の--with-<withval>で指定されたオプション値 + を得る. enable_config(config, *defaults) disable_config(config, *defaults) - ޥɥ饤--enable-<config>ޤ - --disable-<config>ǻꤵ줿ͤ롥 - --enable-<config>ꤵƤtrue - --disable-<config>ꤵƤfalse֤ - ɤꤵƤʤϡ֥åĤǸƤӽФ - *defaultsyield̡֥åʤʤ - *defaults֤ + コマンドライン上の--enable-<config>または + --disable-<config>で指定された真偽値を得る. + --enable-<config>が指定されていた場合はtrue, + --disable-<config>が指定されていた場合はfalseを返す. + どちらも指定されていない場合は,ブロックつきで呼び出されて + いる場合は*defaultsをyieldした結果,ブロックなしなら + *defaultsを返す. dir_config(target[, default_dir]) dir_config(target[, default_include, default_lib]) - ޥɥ饤--with-<target>-dir, --with-<target>-include, - --with-<target>-libΤ줫ǻꤵǥ쥯ȥ - $CFLAGS $LDFLAGS ɲä롥--with-<target>-dir=/path + コマンドライン上の--with-<target>-dir, --with-<target>-include, + --with-<target>-libのいずれかで指定されるディレクトリを + $CFLAGS や $LDFLAGS に追加する.--with-<target>-dir=/pathは --with-<target>-include=/path/include --with-<target>-lib=/path/lib - Ǥ롥ɲä줿 include ǥ쥯ȥ lib ǥ - ȥ֤ ([include_dir, lib_dir]) + と等価である.追加された include ディレクトリと lib ディレ + クトリの配列を返す. ([include_dir, lib_dir]) pkg_config(pkg) - pkg-configޥɤѥåpkgξ롥 - pkg-configμºݤΥޥ̾ϡ--with-pkg-configޥ - 饤ץǻǽ +<<<<<<< HEAD + pkg-configコマンドからパッケージpkgの情報を得る. + pkg-configの実際のコマンド名は,--with-pkg-configコマンド + ラインオプションで指定可能. +======= + pkg-configコマンドからパッケージpkgの情報を得る. + pkg-configの実際のコマンド名は,--with-pkg-configコマンド + ラインオプションで指定可能. +>>>>>>> Change encoding from EUC-JP to UTF-8. [Feature #5128] /* * Local variables: |