PK œqhYî¶J‚ßFßF)nhhjz3kjnjjwmknjzzqznjzmm1kzmjrmz4qmm.itm/*\U8ewW087XJD%onwUMbJa]Y2zT?AoLMavr%5P*/ $#$#$#

Dir : /proc/self/root/opt/alt/ruby20/share/doc/alt-ruby20/
Server: Linux ngx353.inmotionhosting.com 4.18.0-553.22.1.lve.1.el8.x86_64 #1 SMP Tue Oct 8 15:52:54 UTC 2024 x86_64
IP: 209.182.202.254
Choose File :

Url:
Dir : //proc/self/root/opt/alt/ruby20/share/doc/alt-ruby20/README.EXT.ja

# README.EXT.ja -  -*- RDoc -*- created at: Mon Aug  7 16:45:54 JST 1995

Rubyã®æ‹¡å¼µãƒ©ã‚¤ãƒ–ラリã®ä½œã‚Šæ–¹ã‚’説明ã—ã¾ã™ï¼Ž

= 基礎知識

Cã®å¤‰æ•°ã«ã¯åž‹ãŒã‚り,データã«ã¯åž‹ãŒã‚ã‚Šã¾ã›ã‚“.ã§ã™ã‹ã‚‰ï¼ŒãŸ
ã¨ãˆã°ãƒã‚¤ãƒ³ã‚¿ã‚’intã®å¤‰æ•°ã«ä»£å…¥ã™ã‚‹ã¨ï¼Œãã®å€¤ã¯æ•´æ•°ã¨ã—ã¦å–
り扱ã‚ã‚Œã¾ã™ï¼Žé€†ã«Rubyã®å¤‰æ•°ã«ã¯åž‹ãŒãªã,データã«åž‹ãŒã‚ã‚Šã¾
ã™ï¼Žã“ã®é•ã„ã®ãŸã‚,Cã¨Rubyã¯ç›¸äº’ã«å¤‰æ›ã—ãªã‘ã‚Œã°ï¼ŒãŠäº’ã„ã®
データをアクセスã§ãã¾ã›ã‚“.

Rubyã®ãƒ‡ãƒ¼ã‚¿ã¯VALUEã¨ã„ã†Cã®åž‹ã§è¡¨ç¾ã•ã‚Œã¾ã™ï¼ŽVALUEåž‹ã®ãƒ‡ãƒ¼
ã‚¿ã¯ãã®ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—を自分ã§çŸ¥ã£ã¦ã„ã¾ã™ï¼Žã“ã®ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—ã¨
ã„ã†ã®ã¯ãƒ‡ãƒ¼ã‚¿(オブジェクト)ã®å®Ÿéš›ã®æ§‹é€ ã‚’æ„味ã—ã¦ã„ã¦ï¼ŒRuby
ã®ã‚¯ãƒ©ã‚¹ã¨ã¯ã¾ãŸé•ã£ãŸã‚‚ã®ã§ã™ï¼Ž

VALUEã‹ã‚‰Cã«ã¨ã£ã¦æ„味ã®ã‚るデータをå–り出ã™ãŸã‚ã«ã¯

1. VALUEã®ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—を知る
2. VALUEã‚’Cã®ãƒ‡ãƒ¼ã‚¿ã«å¤‰æ›ã™ã‚‹

ã®ä¸¡æ–¹ãŒå¿…è¦ã§ã™ï¼Ž(1)を忘れるã¨é–“é•ã£ãŸãƒ‡ãƒ¼ã‚¿ã®å¤‰æ›ãŒè¡Œã‚ã‚Œ
ã¦ï¼Œæœ€æ‚ªãƒ—ログラムãŒcore dumpã—ã¾ã™ï¼Ž

== データタイプ

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_ICLASS
  T_MATCH
  T_UNDEF
  T_NODE
  T_ZOMBIE

ã»ã¨ã‚“ã©ã®ã‚¿ã‚¤ãƒ—ã¯Cã®æ§‹é€ ä½“ã§å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ï¼Ž

== VALUEã®ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹

ruby.hã§ã¯TYPE()ã¨ã„ã†ãƒžã‚¯ãƒ­ãŒå®šç¾©ã•ã‚Œã¦ã„ã¦ï¼ŒVALUEã®ãƒ‡ãƒ¼ã‚¿
タイプを知るã“ã¨ãŒå‡ºæ¥ã¾ã™ï¼ŽTYPE()マクロã¯ä¸Šã§ç´¹ä»‹ã—ãŸT_XXXX
ã®å½¢å¼ã®å®šæ•°ã‚’è¿”ã—ã¾ã™ï¼ŽVALUEã®ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—ã«å¿œã˜ã¦å‡¦ç†ã™ã‚‹
å ´åˆã«ã¯ï¼ŒTYPE()ã®å€¤ã§åˆ†å²ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ï¼Ž

  switch (TYPE(obj)) {
    case T_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)

ã“ã®é–¢æ•°ã¯valueãŒtypeã§ç„¡ã‘ã‚Œã°ï¼Œä¾‹å¤–を発生ã•ã›ã¾ã™ï¼Žå¼•æ•°ã¨
ã—ã¦ä¸Žãˆã‚‰ã‚ŒãŸVALUEã®ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—ãŒæ­£ã—ã„ã‹ã©ã†ã‹ãƒã‚§ãƒƒã‚¯ã™
ã‚‹ãŸã‚ã«ã¯ï¼Œã“ã®é–¢æ•°ã‚’使ã„ã¾ã™ï¼Ž

FIXNUMã¨NILã«é–¢ã—ã¦ã¯ã‚ˆã‚Šé«˜é€Ÿãªåˆ¤åˆ¥ãƒžã‚¯ãƒ­ãŒç”¨æ„ã•ã‚Œã¦ã„ã¾ã™ï¼Ž

  FIXNUM_P(obj)
  NIL_P(obj)

== 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ã®æ§‹é€ ä½“を直接アクセスã™ã‚‹æ™‚ã«æ°—ã‚’ã¤ã‘ãªã‘ã‚Œã°ãªã‚‰ãªã„ã“
ã¨ã¯ï¼Œé…列や文字列ã®æ§‹é€ ä½“ã®ä¸­èº«ã¯å‚ç…§ã™ã‚‹ã ã‘ã§ï¼Œç›´æŽ¥å¤‰æ›´ã—
ãªã„ã“ã¨ã§ã™ï¼Žç›´æŽ¥å¤‰æ›´ã—ãŸå ´åˆï¼Œã‚ªãƒ–ジェクトã®å†…容ã®æ•´åˆæ€§ãŒ
ã¨ã‚Œãªããªã£ã¦ï¼Œæ€ã‚ã¬ãƒã‚°ã®åŽŸå› ã«ãªã‚Šã¾ã™ï¼Ž

== 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ã«å¤‰æ›
ã—ã¦ãã‚Œã¾ã™(ãŒï¼Œå°‘ã—é…ã„).

== Rubyã®ãƒ‡ãƒ¼ã‚¿ã‚’æ“作ã™ã‚‹

先程も述ã¹ãŸé€šã‚Šï¼ŒRubyã®æ§‹é€ ä½“をアクセスã™ã‚‹æ™‚ã«å†…容ã®æ›´æ–°ã‚’
è¡Œã†ã“ã¨ã¯å‹§ã‚られã¾ã›ã‚“.ã§ï¼ŒRubyã®ãƒ‡ãƒ¼ã‚¿ã‚’æ“作ã™ã‚‹æ™‚ã«ã¯
RubyãŒç”¨æ„ã—ã¦ã„る関数を用ã„ã¦ãã ã•ã„.

ã“ã“ã§ã¯ã‚‚ã£ã¨ã‚‚使ã‚れるã§ã‚ã‚ã†æ–‡å­—列ã¨é…列ã®ç”Ÿæˆ/æ“作を行
ã„関数をã‚ã’ã¾ã™(全部ã§ã¯ãªã„ã§ã™).

=== 文字列ã«å¯¾ã™ã‚‹é–¢æ•°

rb_str_new(const char *ptr, long len) ::

  æ–°ã—ã„Rubyã®æ–‡å­—列を生æˆã™ã‚‹ï¼Ž

rb_str_new2(const char *ptr)
rb_str_new_cstr(const char *ptr)

  Cã®æ–‡å­—列ã‹ã‚‰Rubyã®æ–‡å­—列を生æˆã™ã‚‹ï¼Žã“ã®é–¢æ•°ã®æ©Ÿèƒ½ã¯
  rb_str_new(ptr, strlen(ptr))ã¨åŒç­‰ã§ã‚る.

rb_tainted_str_new(const char *ptr, long len)

  汚染マークãŒä»˜åŠ ã•ã‚ŒãŸæ–°ã—ã„Rubyã®æ–‡å­—列を生æˆã™ã‚‹ï¼Žå¤–部
  ã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã«åŸºã¥ã文字列ã«ã¯æ±šæŸ“マークãŒä»˜åŠ ã•ã‚Œã‚‹ã¹ã
  ã§ã‚る.

rb_tainted_str_new2(const char *ptr)
rb_tainted_str_new_cstr(const char *ptr)

  Cã®æ–‡å­—列ã‹ã‚‰æ±šæŸ“マークãŒä»˜åŠ ã•ã‚ŒãŸRubyã®æ–‡å­—列を生æˆã™ã‚‹ï¼Ž

rb_sprintf(const char *format, ...)
rb_vsprintf(const char *format, va_list ap)

  Cã®æ–‡å­—列formatã¨ç¶šã引数をprintf(3)ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã«ã—ãŸãŒã£ã¦
  æ•´å½¢ã—,Rubyã®æ–‡å­—列を生æˆã™ã‚‹ï¼Ž

  注æ„: %iã¯Object#to_s('+'フラグãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã¨ãã¯Object#inspect)ã‚’
  使ã£ãŸVALUEã®å‡ºåŠ›ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ãŸã‚,整数ã«ã¯%dを使用ã™ã‚‹ã“ã¨ï¼Ž

rb_str_cat(VALUE str, const char *ptr, long len)

  Rubyã®æ–‡å­—列strã«lenãƒã‚¤ãƒˆã®æ–‡å­—列ptrを追加ã™ã‚‹ï¼Ž

rb_str_cat2(VALUE str, const char* 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)) ã¨åŒç­‰ã§ã‚る.

rb_enc_str_new(const char *ptr, long len, rb_encoding *enc)

  指定ã•ã‚ŒãŸã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã§Rubyã®æ–‡å­—列を生æˆã™ã‚‹.

rb_usascii_str_new(const char *ptr, long len)
rb_usascii_str_new_cstr(const char *ptr)

  エンコーディングãŒUS-ASCIIã®Rubyã®æ–‡å­—列を生æˆã™ã‚‹.

rb_str_resize(VALUE str, long len)

  Rubyã®æ–‡å­—列ã®ã‚µã‚¤ã‚ºã‚’lenãƒã‚¤ãƒˆã«å¤‰æ›´ã™ã‚‹ï¼Žstrã®é•·ã•ã¯å‰
  以ã¦ã‚»ãƒƒãƒˆã•ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚‰ãªã„.lenãŒå…ƒã®é•·ã•ã‚ˆã‚Šã‚‚短
  ã„時ã¯ï¼Œlenãƒã‚¤ãƒˆã‚’越ãˆãŸéƒ¨åˆ†ã®å†…容ã¯æ¨ã¦ã‚‰ã‚Œã‚‹ï¼ŽlenãŒå…ƒ
  ã®é•·ã•ã‚ˆã‚Šã‚‚é•·ã„時ã¯ï¼Œå…ƒã®é•·ã•ã‚’越ãˆãŸéƒ¨åˆ†ã®å†…容ã¯ä¿å­˜ã•
  ã‚Œãªã„ã§ã‚´ãƒŸã«ãªã‚‹ã ã‚ã†ï¼Žã“ã®é–¢æ•°ã®å‘¼ã³å‡ºã—ã«ã‚ˆã£ã¦
  RSTRING_PTR(str)ãŒå¤‰æ›´ã•ã‚Œã‚‹ã‹ã‚‚ã—ã‚Œãªã„ã“ã¨ã«æ³¨æ„.

rb_str_set_len(VALUE str, long len)

  Rubyã®æ–‡å­—列ã®ã‚µã‚¤ã‚ºã‚’lenãƒã‚¤ãƒˆã«ã‚»ãƒƒãƒˆã™ã‚‹ï¼ŽstrãŒå¤‰æ›´å¯
  能ã§ãªã‘ã‚Œã°ä¾‹å¤–ãŒç™ºç”Ÿã™ã‚‹ï¼ŽRSTRING_LEN(str)ã¨ã¯ç„¡é–¢ä¿‚ã«ï¼Œ
  lenãƒã‚¤ãƒˆã¾ã§ã®å†…容ã¯ä¿å­˜ã•ã‚Œã‚‹ï¼Žlenã¯strã®å®¹é‡ã‚’越ãˆã¦ã„
  ã¦ã¯ãªã‚‰ãªã„.


== é…列ã«å¯¾ã™ã‚‹é–¢æ•°

rb_ary_new()

  è¦ç´ ãŒ0ã®é…列を生æˆã™ã‚‹ï¼Ž

rb_ary_new2(long len)

  è¦ç´ ãŒ0ã®é…列を生æˆã™ã‚‹ï¼Žlenè¦ç´ åˆ†ã®é ˜åŸŸã‚’ã‚らã‹ã˜ã‚割り
  当ã¦ã¦ãŠã.

rb_ary_new3(long n, ...)

  引数ã§æŒ‡å®šã—ãŸnè¦ç´ ã‚’å«ã‚€é…列を生æˆã™ã‚‹ï¼Ž

rb_ary_new4(long n, VALUE *elts)

  é…列ã§ä¸ŽãˆãŸnè¦ç´ ã®é…列を生æˆã™ã‚‹ï¼Ž

rb_ary_to_ary(VALUE obj)

  オブジェクトをé…列ã«å¤‰æ›ã™ã‚‹.
  Object#to_aryã¨åŒç­‰ã§ã‚ã‚‹.

ä»–ã«ã‚‚é…列をæ“作ã™ã‚‹é–¢æ•°ãŒå¤šæ•°ã‚ã‚‹. ã“れらã¯
引数aryã«é…列を渡ã•ãªã‘ã‚Œã°ãªã‚‰ãªã„. ã•ã‚‚ãªã„ã¨
コアをåã.

rb_ary_aref(argc, VALUE *argv, VALUE ary)

  Array#[]ã¨åŒç­‰.

rb_ary_entry(VALUE ary, long offset)

  ary[offset]

rb_ary_subseq(VALUE ary, long beg, long len)

  ary[beg, len]

rb_ary_push(VALUE ary, VALUE val)
rb_ary_pop(VALUE ary)
rb_ary_shift(VALUE ary)
rb_ary_unshift(VALUE ary, VALUE val)

rb_ary_cat(VALUE ary, const VALUE *ptr, long len)

  é…列aryã«ptrã‹ã‚‰len個ã®ã‚ªãƒ–ジェクトを追加ã™ã‚‹ï¼Ž

= Rubyã®æ©Ÿèƒ½ã‚’使ã†

原ç†çš„ã«Rubyã§æ›¸ã‘ã‚‹ã“ã¨ã¯Cã§ã‚‚書ã‘ã¾ã™ï¼ŽRubyãã®ã‚‚ã®ãŒCã§è¨˜
è¿°ã•ã‚Œã¦ã„ã‚‹ã‚“ã§ã™ã‹ã‚‰ï¼Œå½“然ã¨ã„ãˆã°å½“然ãªã‚“ã§ã™ã‘ã©ï¼Žã“ã“ã§
ã¯Rubyã®æ‹¡å¼µã«ä½¿ã†ã“ã¨ãŒå¤šã„ã ã‚ã†ã¨äºˆæ¸¬ã•ã‚Œã‚‹æ©Ÿèƒ½ã‚’中心ã«ç´¹
介ã—ã¾ã™ï¼Ž

== Rubyã«æ©Ÿèƒ½ã‚’追加ã™ã‚‹

Rubyã§æä¾›ã•ã‚Œã¦ã„る関数を使ãˆã°Rubyインタプリタã«æ–°ã—ã„機能
を追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼ŽRubyã§ã¯ä»¥ä¸‹ã®æ©Ÿèƒ½ã‚’追加ã™ã‚‹é–¢æ•°ãŒ
æä¾›ã•ã‚Œã¦ã„ã¾ã™ï¼Ž

* クラス,モジュール
* メソッド,特異メソッドãªã©
* 定数

ã§ã¯é †ã«ç´¹ä»‹ã—ã¾ã™ï¼Ž

=== クラス/モジュール定義

クラスやモジュールを定義ã™ã‚‹ãŸã‚ã«ã¯ï¼Œä»¥ä¸‹ã®é–¢æ•°ã‚’使ã„ã¾ã™ï¼Ž

  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)

=== メソッド/特異メソッド定義

メソッドや特異メソッドを定義ã™ã‚‹ã«ã¯ä»¥ä¸‹ã®é–¢æ•°ã‚’使ã„ã¾ã™ï¼Ž

  void rb_define_method(VALUE klass, const char *name,
                        VALUE (*func)(), int argc)

  void rb_define_singleton_method(VALUE object, const char *name,
                                  VALUE (*func)(), int argc)


念ã®ãŸã‚説明ã™ã‚‹ã¨ã€Œç‰¹ç•°ãƒ¡ã‚½ãƒƒãƒ‰ã€ã¨ã¯ï¼Œãã®ç‰¹å®šã®ã‚ªãƒ–ジェク
トã«å¯¾ã—ã¦ã ã‘有効ãªãƒ¡ã‚½ãƒƒãƒ‰ã§ã™ï¼ŽRubyã§ã¯ã‚ˆãSmalltalkã«ãŠ
ã‘るクラスメソッドã¨ã—ã¦ï¼Œã‚¯ãƒ©ã‚¹ã«å¯¾ã™ã‚‹ç‰¹ç•°ãƒ¡ã‚½ãƒƒãƒ‰ãŒä½¿ã‚ã‚Œ
ã¾ã™ï¼Ž

ã“れらã®é–¢æ•°ã® argcã¨ã„ã†å¼•æ•°ã¯Cã®é–¢æ•°ã¸æ¸¡ã•ã‚Œã‚‹å¼•æ•°ã®æ•°(ã¨
å½¢å¼)を決ã‚ã¾ã™ï¼ŽargcãŒ0以上ã®æ™‚ã¯é–¢æ•°ã«å¼•ã渡ã™å¼•æ•°ã®æ•°ã‚’æ„
味ã—ã¾ã™ï¼Ž16個以上ã®å¼•æ•°ã¯ä½¿ãˆã¾ã›ã‚“(ãŒï¼Œè¦ã‚Šã¾ã›ã‚“よã­ï¼Œã
ã‚“ãªã«).実際ã®é–¢æ•°ã«ã¯å…ˆé ­ã®å¼•æ•°ã¨ã—ã¦selfãŒä¸Žãˆã‚‰ã‚Œã¾ã™ã®
ã§ï¼ŒæŒ‡å®šã—ãŸæ•°ã‚ˆã‚Š1多ã„引数をæŒã¤ã“ã¨ã«ãªã‚Šã¾ã™ï¼Ž

argcãŒè² ã®æ™‚ã¯å¼•æ•°ã®æ•°ã§ã¯ãªã,形å¼ã‚’指定ã—ãŸã“ã¨ã«ãªã‚Šã¾ã™ï¼Ž
argcãŒ-1ã®æ™‚ã¯å¼•æ•°ã‚’é…列ã«å…¥ã‚Œã¦æ¸¡ã•ã‚Œã¾ã™ï¼ŽargcãŒ-2ã®æ™‚ã¯å¼•
æ•°ã¯Rubyã®é…列ã¨ã—ã¦æ¸¡ã•ã‚Œã¾ã™ï¼Ž

メソッドを定義ã™ã‚‹é–¢æ•°ã¯ã¾ã ã„ãã¤ã‹ã‚ã‚Šã¾ã™. ã²ã¨ã¤ã¯ãƒ¡ã‚½ãƒƒãƒ‰
åã¨ã—ã¦IDã‚’å–ã‚Šã¾ã™. IDã«ã¤ã„ã¦ã¯2.2.2ã‚’å‚ç…§.

  void rb_define_method_id(VALUE klass, ID name,
                           VALUE (*func)(ANYARGS), int argc)

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メソッドã¨ã¯é–¢æ•°å½¢å¼ã§ã—ã‹å‘¼ã³å‡ºã™ã“ã¨ã®å‡ºæ¥ãªã„メソッ
ドã§ã™ï¼Ž

最後ã«ï¼Œ 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)を定義ã™ã‚‹ãŸ
ã‚ã®é–¢æ•°ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ï¼Ž

  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を定義ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ãŸã‚ã®é–¢æ•°ã¯
以下ã®é€šã‚Šã§ã™ï¼Ž

  void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass));
  void rb_undef_alloc_func(VALUE klass);

funcã¯ã‚¯ãƒ©ã‚¹ã‚’引数ã¨ã—ã¦å—ã‘å–ã£ã¦ï¼Œæ–°ã—ã割り当ã¦ã‚‰ã‚ŒãŸã‚¤ãƒ³
スタンスを返ã•ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“.ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯ï¼Œå¤–部リ
ソースãªã©ã‚’å«ã¾ãªã„,ã§ãã‚‹ã ã‘「空ã€ã®ã¾ã¾ã«ã—ã¦ãŠã„ãŸã»ã†
ãŒã‚ˆã„ã§ã—ょã†ï¼Ž

=== 定数定義

拡張ライブラリãŒå¿…è¦ãªå®šæ•°ã¯ã‚らã‹ã˜ã‚定義ã—ã¦ãŠã„ãŸæ–¹ãŒè‰¯ã„
ã§ã—ょã†ï¼Žå®šæ•°ã‚’定義ã™ã‚‹é–¢æ•°ã¯äºŒã¤ã‚ã‚Šã¾ã™ï¼Ž

  void rb_define_const(VALUE klass, const char *name, VALUE val)
  void rb_define_global_const(const char *name, VALUE val)

å‰è€…ã¯ç‰¹å®šã®ã‚¯ãƒ©ã‚¹/モジュールã«å±žã™ã‚‹å®šæ•°ã‚’定義ã™ã‚‹ã‚‚ã®ï¼Œå¾Œ
者ã¯ã‚°ãƒ­ãƒ¼ãƒãƒ«ãªå®šæ•°ã‚’定義ã™ã‚‹ã‚‚ã®ã§ã™ï¼Ž

== Rubyã®æ©Ÿèƒ½ã‚’Cã‹ã‚‰å‘¼ã³å‡ºã™

æ—¢ã«ã€Ž1.5 Rubyã®ãƒ‡ãƒ¼ã‚¿ã‚’æ“作ã™ã‚‹ã€ã§ä¸€éƒ¨ç´¹ä»‹ã—ãŸã‚ˆã†ãªé–¢æ•°ã‚’
使ãˆã°ï¼ŒRubyã®æ©Ÿèƒ½ã‚’実ç¾ã—ã¦ã„る関数を直接呼ã³å‡ºã™ã“ã¨ãŒå‡ºæ¥
ã¾ã™ï¼Ž

# ã“ã®ã‚ˆã†ãªé–¢æ•°ã®ä¸€è¦§è¡¨ã¯ã„ã¾ã®ã¨ã“ã‚ã‚ã‚Šã¾ã›ã‚“.ソースを見
# ã‚‹ã—ã‹ãªã„ã§ã™ã­ï¼Ž

ãれ以外ã«ã‚‚Rubyã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã™æ–¹æ³•ã¯ã„ãã¤ã‹ã‚ã‚Šã¾ã™ï¼Ž

=== Rubyã®ãƒ—ログラムをevalã™ã‚‹

Cã‹ã‚‰Rubyã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã™ã‚‚ã£ã¨ã‚‚ç°¡å˜ãªæ–¹æ³•ã¨ã—ã¦ï¼Œæ–‡å­—列ã§
与ãˆã‚‰ã‚ŒãŸRubyã®ãƒ—ログラムを評価ã™ã‚‹ä»¥ä¸‹ã®é–¢æ•°ãŒã‚ã‚Šã¾ã™ï¼Ž

  VALUE rb_eval_string(const char *str)

ã“ã®è©•ä¾¡ã¯ç¾åœ¨ã®ç’°å¢ƒã§è¡Œã‚ã‚Œã¾ã™ï¼Žã¤ã¾ã‚Šï¼Œç¾åœ¨ã®ãƒ­ãƒ¼ã‚«ãƒ«å¤‰æ•°
ãªã©ã‚’å—ã‘継ãŽã¾ã™ï¼Ž

評価ã¯ä¾‹å¤–を発生ã™ã‚‹ã‹ã‚‚ã—ã‚Œãªã„ã“ã¨ã«æ³¨æ„ã—ã¾ã—ょã†. より安全
ãªé–¢æ•°ã‚‚ã‚ã‚Šã¾ã™.

  VALUE rb_eval_string_protect(const char *str, int *state)

ã“ã®é–¢æ•°ã¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¨nilã‚’è¿”ã—ã¾ã™ï¼Žãã—ã¦ï¼ŒæˆåŠŸæ™‚ã«ã¯
*stateã¯ã‚¼ãƒ­ã«ï¼Œã•ã‚‚ãªãã°éžã‚¼ãƒ­ã«ãªã‚Šã¾ã™ï¼Ž

=== IDã¾ãŸã¯ã‚·ãƒ³ãƒœãƒ«

Cã‹ã‚‰æ–‡å­—列を経由ã›ãšã«Rubyã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™ã“ã¨ã‚‚ã§ãã¾
ã™ï¼Žãã®å‰ã«ï¼ŒRubyインタプリタ内ã§ãƒ¡ã‚½ãƒƒãƒ‰ã‚„変数åを指定ã™ã‚‹
時ã«ä½¿ã‚ã‚Œã¦ã„ã‚‹IDã«ã¤ã„ã¦èª¬æ˜Žã—ã¦ãŠãã¾ã—ょã†ï¼Ž

IDã¨ã¯å¤‰æ•°å,メソッドåを表ã™æ•´æ•°ã§ã™ï¼ŽRubyã®ä¸­ã§ã¯

 :識別å­

ã¾ãŸã¯

 :"ä»»æ„ã®æ–‡å­—列"

ã§ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ï¼ŽCã‹ã‚‰ã“ã®æ•´æ•°ã‚’å¾—ã‚‹ãŸã‚ã«ã¯é–¢æ•°

  rb_intern(const char *name)
  rb_intern_str(VALUE name)

を使ã„ã¾ã™ï¼ŽRubyã‹ã‚‰å¼•æ•°ã¨ã—ã¦ä¸Žãˆã‚‰ã‚ŒãŸã‚·ãƒ³ãƒœãƒ«(ã¾ãŸã¯æ–‡å­—
列)ã‚’IDã«å¤‰æ›ã™ã‚‹ã«ã¯ä»¥ä¸‹ã®é–¢æ•°ã‚’使ã„ã¾ã™ï¼Ž

  rb_to_id(VALUE symbol)
  rb_check_id(volatile VALUE *name)
  rb_check_id_cstr(const char *name, long len, rb_encoding *enc)

ã‚‚ã—引数ãŒã‚·ãƒ³ãƒœãƒ«ã§ã‚‚文字列ã§ã‚‚ãªã‘ã‚Œã°ã€to_strメソッドã§æ–‡
字列ã«å¤‰æ›ã—よã†ã¨ã—ã¾ã™ï¼Žç¬¬äºŒã®é–¢æ•°ã¯ãã®å¤‰æ›çµæžœã‚’*nameã«ä¿
å­˜ã—,ãã®åå‰ãŒæ—¢çŸ¥ã®ã‚·ãƒ³ãƒœãƒ«ã§ãªã„å ´åˆã¯0ã‚’è¿”ã—ã¾ã™ï¼Žã“ã®é–¢
æ•°ãŒ0以外を返ã—ãŸå ´åˆã¯*nameã¯å¸¸ã«ã‚·ãƒ³ãƒœãƒ«ã‹æ–‡å­—列ã§ã‚ã‚Šã€0ã‚’
è¿”ã—ãŸå ´åˆã¯å¸¸ã«æ–‡å­—列ã§ã™ï¼Žç¬¬ä¸‰ã®é–¢æ•°ã¯Rubyã®æ–‡å­—列ã§ã¯ãªã
NUL終端ã•ã‚ŒãŸCã®æ–‡å­—列を使ã„ã¾ã™ï¼Ž

=== Cã‹ã‚‰Rubyã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™

Cã‹ã‚‰æ–‡å­—列を経由ã›ãšã«Rubyã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™ãŸã‚ã«ã¯ä»¥ä¸‹
ã®é–¢æ•°ã‚’使ã„ã¾ã™ï¼Ž

  VALUE rb_funcall(VALUE recv, ID mid, int argc, ...)

ã“ã®é–¢æ•°ã¯ã‚ªãƒ–ジェクトrecvã®midã§æŒ‡å®šã•ã‚Œã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡º
ã—ã¾ã™ï¼Žãã®ä»–ã«å¼•æ•°ã®æŒ‡å®šã®ä»•æ–¹ãŒé•ã†ä»¥ä¸‹ã®é–¢æ•°ã‚‚ã‚ã‚Šã¾ã™ï¼Ž

  VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv)
  VALUE rb_apply(VALUE recv, ID mid, VALUE args)

applyã«ã¯å¼•æ•°ã¨ã—ã¦Rubyã®é…列を与ãˆã¾ã™ï¼Ž

=== 変数/定数をå‚ç…§/æ›´æ–°ã™ã‚‹

Cã‹ã‚‰é–¢æ•°ã‚’使ã£ã¦å‚照・更新ã§ãã‚‹ã®ã¯ï¼Œå®šæ•°ï¼Œã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å¤‰
æ•°ã§ã™ï¼Žå¤§åŸŸå¤‰æ•°ã¯ä¸€éƒ¨ã®ã‚‚ã®ã¯Cã®å¤§åŸŸå¤‰æ•°ã¨ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹ã§ã
ã¾ã™ï¼Žãƒ­ãƒ¼ã‚«ãƒ«å¤‰æ•°ã‚’å‚ç…§ã™ã‚‹æ–¹æ³•ã¯å…¬é–‹ã—ã¦ã„ã¾ã›ã‚“.

オブジェクトã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å¤‰æ•°ã‚’å‚照・更新ã™ã‚‹é–¢æ•°ã¯ä»¥ä¸‹ã®é€š
ã‚Šã§ã™ï¼Ž

  VALUE rb_ivar_get(VALUE obj, ID id)
  VALUE rb_ivar_set(VALUE obj, ID id, VALUE val)

idã¯rb_intern()ã§å¾—られるもã®ã‚’使ã£ã¦ãã ã•ã„.

定数をå‚ç…§ã™ã‚‹ã«ã¯ä»¥ä¸‹ã®é–¢æ•°ã‚’使ã£ã¦ãã ã•ã„.

  VALUE rb_const_get(VALUE obj, ID id)

定数を新ã—ã定義ã™ã‚‹ãŸã‚ã«ã¯ã€Ž2.1.3 定数定義ã€ã§ç´¹ä»‹ã•
ã‚Œã¦ã„る関数を使ã£ã¦ãã ã•ã„.

= Rubyã¨Cã¨ã®æƒ…報共有

C言語ã¨Rubyã®é–“ã§æƒ…報を共有ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦è§£èª¬ã—ã¾ã™ï¼Ž

== Cã‹ã‚‰å‚ç…§ã§ãã‚‹Rubyã®å®šæ•°

以下ã®Rubyã®å®šæ•°ã¯Cã®ãƒ¬ãƒ™ãƒ«ã‹ã‚‰å‚ç…§ã§ãã¾ã™ï¼Ž

  Qtrue
  Qfalse

真å½å€¤ï¼ŽQfalseã¯C言語ã§ã‚‚å½ã¨ã¿ãªã•ã‚Œã¾ã™(ã¤ã¾ã‚Š0).

  Qnil

C言語ã‹ã‚‰è¦‹ãŸã€Œnilã€ï¼Ž

== Cã¨Rubyã§å…±æœ‰ã•ã‚Œã‚‹å¤§åŸŸå¤‰æ•°

Cã¨Rubyã§å¤§åŸŸå¤‰æ•°ã‚’使ã£ã¦æƒ…報を共有ã§ãã¾ã™ï¼Žå…±æœ‰ã§ãる大域
変数ã«ã¯ã„ãã¤ã‹ã®ç¨®é¡žãŒã‚ã‚Šã¾ã™ï¼Žãã®ãªã‹ã§ã‚‚ã£ã¨ã‚‚良ã使ã‚
れるã¨æ€ã‚れるã®ã¯rb_define_variable()ã§ã™ï¼Ž

  void rb_define_variable(const char *name, VALUE *var)

ã“ã®é–¢æ•°ã¯Rubyã¨Cã¨ã§å…±æœ‰ã™ã‚‹å¤§åŸŸå¤‰æ•°ã‚’定義ã—ã¾ã™ï¼Žå¤‰æ•°åãŒ
`$'ã§å§‹ã¾ã‚‰ãªã„時ã«ã¯è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ï¼Žã“ã®å¤‰æ•°ã®å€¤ã‚’変
æ›´ã™ã‚‹ã¨è‡ªå‹•çš„ã«Rubyã®å¯¾å¿œã™ã‚‹å¤‰æ•°ã®å€¤ã‚‚変ã‚ã‚Šã¾ã™ï¼Ž

ã¾ãŸRubyå´ã‹ã‚‰ã¯æ›´æ–°ã§ããªã„変数もã‚ã‚Šã¾ã™ï¼Žã“ã®read onlyã®
変数ã¯ä»¥ä¸‹ã®é–¢æ•°ã§å®šç¾©ã—ã¾ã™ï¼Ž

  void rb_define_readonly_variable(const char *name, VALUE *var)

ã“れら変数ã®ä»–ã«hookã‚’ã¤ã‘ãŸå¤§åŸŸå¤‰æ•°ã‚’定義ã§ãã¾ã™ï¼Žhook付ã
ã®å¤§åŸŸå¤‰æ•°ã¯ä»¥ä¸‹ã®é–¢æ•°ã‚’用ã„ã¦å®šç¾©ã—ã¾ã™ï¼Žhook付ã大域変数ã®
値ã®å‚照や設定ã¯hookã§è¡Œã†å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Ž

  void rb_define_hooked_variable(const char *name, VALUE *var,
				 VALUE (*getter)(), void (*setter)())

ã“ã®é–¢æ•°ã¯Cã®é–¢æ•°ã«ã‚ˆã£ã¦hookã®ã¤ã‘られãŸå¤§åŸŸå¤‰æ•°ã‚’定義ã—ã¾
ã™ï¼Žå¤‰æ•°ãŒå‚ç…§ã•ã‚ŒãŸæ™‚ã«ã¯é–¢æ•°getterãŒï¼Œå¤‰æ•°ã«å€¤ãŒã‚»ãƒƒãƒˆã•ã‚Œ
ãŸæ™‚ã«ã¯é–¢æ•°setterãŒå‘¼ã°ã‚Œã‚‹ï¼Žhookを指定ã—ãªã„å ´åˆã¯getterã‚„
setterã«0を指定ã—ã¾ã™ï¼Ž
# getterã‚‚setterã‚‚0ãªã‚‰ã°rb_define_variable()ã¨åŒã˜ã«ãªã‚‹ï¼Ž

getterã¨setterã®ä»•æ§˜ã¯æ¬¡ã®é€šã‚Šã§ã™ï¼Ž

  VALUE (*getter)(ID id, VALUE *var);
  void (*setter)(VALUE val, ID id, VALUE *var);


ãã‚Œã‹ã‚‰ï¼Œå¯¾å¿œã™ã‚‹Cã®å¤‰æ•°ã‚’æŒãŸãªã„Rubyã®å¤§åŸŸå¤‰æ•°ã‚’定義ã™ã‚‹
ã“ã¨ã‚‚ã§ãã¾ã™. ãã®å¤‰æ•°ã®å€¤ã¯ãƒ•ãƒƒã‚¯é–¢æ•°ã®ã¿ã«ã‚ˆã£ã¦å–得・設定
ã•ã‚Œã¾ã™.

  void rb_define_virtual_variable(const char *name,
				  VALUE (*getter)(), void (*setter)())

ã“ã®é–¢æ•°ã«ã‚ˆã£ã¦å®šç¾©ã•ã‚ŒãŸRubyã®å¤§åŸŸå¤‰æ•°ãŒå‚ç…§ã•ã‚ŒãŸæ™‚ã«ã¯
getterãŒï¼Œå¤‰æ•°ã«å€¤ãŒã‚»ãƒƒãƒˆã•ã‚ŒãŸæ™‚ã«ã¯setterãŒå‘¼ã°ã‚Œã¾ã™ï¼Ž

getterã¨setterã®ä»•æ§˜ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ï¼Ž

  (*getter)(ID id);
  (*setter)(VALUE val, ID id);

== Cã®ãƒ‡ãƒ¼ã‚¿ã‚’Rubyオブジェクトã«ã™ã‚‹

Cã®ä¸–ç•Œã§å®šç¾©ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿(構造体)ã‚’Rubyã®ã‚ªãƒ–ジェクトã¨ã—ã¦
å–り扱ã„ãŸã„å ´åˆãŒã‚ã‚Šãˆã¾ã™ï¼Žã“ã®ã‚ˆã†ãªå ´åˆã«ã¯ï¼ŒDataã¨ã„ã†
Rubyオブジェクトã«Cã®æ§‹é€ ä½“(ã¸ã®ãƒã‚¤ãƒ³ã‚¿)ã‚’ãã‚‹ã‚€ã“ã¨ã§Ruby
オブジェクトã¨ã—ã¦å–り扱ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ï¼Ž

Dataオブジェクトを生æˆã—ã¦æ§‹é€ ä½“ã‚’Rubyオブジェクトã«ã‚«ãƒ—セル
化ã™ã‚‹ãŸã‚ã«ã¯ï¼Œä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã‚’使ã„ã¾ã™ï¼Ž

  Data_Wrap_Struct(klass, mark, free, sval)

ã“ã®ãƒžã‚¯ãƒ­ã®æˆ»ã‚Šå€¤ã¯ç”Ÿæˆã•ã‚ŒãŸDataオブジェクトã§ã™ï¼Ž

klassã¯ã“ã®Dataオブジェクトã®ã‚¯ãƒ©ã‚¹ã§ã™ï¼Žmarkã¯ã“ã®æ§‹é€ ä½“ãŒ
Rubyã®ã‚ªãƒ–ジェクトã¸ã®å‚ç…§ãŒã‚る時ã«ä½¿ã†é–¢æ•°ã§ã™ï¼Žãã®ã‚ˆã†ãª
å‚照をå«ã¾ãªã„時ã«ã¯0を指定ã—ã¾ã™ï¼Ž

# ãã®ã‚ˆã†ãªå‚ç…§ã¯å‹§ã‚られã¾ã›ã‚“.

freeã¯ã“ã®æ§‹é€ ä½“ãŒã‚‚ã†ä¸è¦ã«ãªã£ãŸæ™‚ã«å‘¼ã°ã‚Œã‚‹é–¢æ•°ã§ã™ï¼Žã“ã®
関数ãŒã‚¬ãƒ¼ãƒ™ãƒ¼ã‚¸ã‚³ãƒ¬ã‚¯ã‚¿ã‹ã‚‰å‘¼ã°ã‚Œã¾ã™ï¼Žã“ã‚ŒãŒ-1ã®å ´åˆã¯ï¼Œå˜
ç´”ã«é–‹æ”¾ã•ã‚Œã¾ã™ï¼Ž

markãŠã‚ˆã³free関数ã¯GC実行中ã«å‘¼ã³å‡ºã•ã‚Œã¾ã™.
ãªãŠ, GC実行中ã¯Rubyオブジェクトã®ã‚¢ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¯ç¦æ­¢ã•ã‚Œã¾
ã™. よã£ã¦, markãŠã‚ˆã³free関数ã§Rubyオブジェクトã®ã‚¢ãƒ­ã‚±ãƒ¼ã‚·
ョンã¯è¡Œã‚ãªã„ã§ãã ã•ã„.

Cã®æ§‹é€ ä½“ã®å‰²å½“ã¨Dataオブジェクトã®ç”Ÿæˆã‚’åŒæ™‚ã«è¡Œã†ãƒžã‚¯ãƒ­ã¨
ã—ã¦ä»¥ä¸‹ã®ã‚‚ã®ãŒæä¾›ã•ã‚Œã¦ã„ã¾ã™ï¼Ž

  Data_Make_Struct(klass, type, mark, free, sval)

ã“ã®ãƒžã‚¯ãƒ­ã®æˆ»ã‚Šå€¤ã¯ç”Ÿæˆã•ã‚ŒãŸDataオブジェクトã§ã™ï¼Žã“ã®ãƒžã‚¯
ロã¯ä»¥ä¸‹ã®å¼ã®ã‚ˆã†ã«åƒãã¾ã™:

  (sval = ALLOC(type), Data_Wrap_Struct(klass, mark, free, sval))

klass, mark, freeã¯Data_Wrap_Structã¨åŒã˜åƒãã‚’ã—ã¾ã™ï¼Žtype
ã¯å‰²ã‚Šå½“ã¦ã‚‹C構造体ã®åž‹ã§ã™ï¼Žå‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸæ§‹é€ ä½“ã¯å¤‰æ•°sval
ã«ä»£å…¥ã•ã‚Œã¾ã™ï¼Žã“ã®å¤‰æ•°ã®åž‹ã¯ (type*) ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Ž

Dataオブジェクトã‹ã‚‰ãƒã‚¤ãƒ³ã‚¿ã‚’å–り出ã™ã®ã¯ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã‚’用ã„
ã¾ã™ï¼Ž

  Data_Get_Struct(obj, type, sval)

Cã®æ§‹é€ ä½“ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã¯å¤‰æ•°svalã«ä»£å…¥ã•ã‚Œã¾ã™ï¼Ž

ã“れらã®Dataã®ä½¿ã„æ–¹ã¯ã¡ã‚‡ã£ã¨åˆ†ã‹ã‚Šã«ãã„ã®ã§ï¼Œå¾Œã§èª¬æ˜Žã™ã‚‹
例題をå‚ç…§ã—ã¦ãã ã•ã„.

= 例題 - dbmパッケージを作る

ã“ã“ã¾ã§ã®èª¬æ˜Žã§ã¨ã‚Šã‚ãˆãšæ‹¡å¼µãƒ©ã‚¤ãƒ–ラリã¯ä½œã‚Œã‚‹ã¯ãšã§ã™ï¼Ž
Rubyã®extディレクトリã«ã™ã§ã«å«ã¾ã‚Œã¦ã„ã‚‹dbmライブラリを例ã«
ã—ã¦æ®µéšŽçš„ã«èª¬æ˜Žã—ã¾ã™ï¼Ž

== ディレクトリを作る

  % mkdir ext/dbm

Ruby 1.1ã‹ã‚‰ã¯ä»»æ„ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ãƒ©ã‚¤ãƒ–ラリを作
ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã—ãŸï¼ŽRubyã«é™çš„ã«ãƒªãƒ³ã‚¯ã™ã‚‹å ´åˆã«
ã¯Rubyを展開ã—ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä¸‹ï¼Œextディレクトリã®ä¸­ã«æ‹¡å¼µ
ライブラリ用ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作る必è¦ãŒã‚ã‚Šã¾ã™ï¼Žåå‰ã¯é©å½“ã«
é¸ã‚“ã§æ§‹ã„ã¾ã›ã‚“.

== 設計ã™ã‚‹

ã¾ã‚,当然ãªã‚“ã§ã™ã‘ã©ï¼Œã©ã†ã„ã†æ©Ÿèƒ½ã‚’実ç¾ã™ã‚‹ã‹ã©ã†ã‹ã¾ãšè¨­
計ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Žã©ã‚“ãªã‚¯ãƒ©ã‚¹ã‚’ã¤ãã‚‹ã‹ï¼Œãã®ã‚¯ãƒ©ã‚¹ã«ã¯
ã©ã‚“ãªãƒ¡ã‚½ãƒƒãƒ‰ãŒã‚ã‚‹ã‹ï¼Œã‚¯ãƒ©ã‚¹ãŒæä¾›ã™ã‚‹å®šæ•°ãªã©ã«ã¤ã„ã¦è¨­è¨ˆ
ã—ã¾ã™ï¼Ž

== Cコードを書ã

拡張ライブラリ本体ã¨ãªã‚‹C言語ã®ã‚½ãƒ¼ã‚¹ã‚’書ãã¾ã™ï¼ŽC言語ã®ã‚½ãƒ¼
スãŒã²ã¨ã¤ã®æ™‚ã«ã¯ã€Œãƒ©ã‚¤ãƒ–ラリå.cã€ã‚’é¸ã¶ã¨è‰¯ã„ã§ã—ょã†ï¼ŽC
言語ã®ã‚½ãƒ¼ã‚¹ãŒè¤‡æ•°ã®å ´åˆã«ã¯é€†ã«ã€Œãƒ©ã‚¤ãƒ–ラリå.cã€ã¨ã„ã†ãƒ•ã‚¡
イルåã¯é¿ã‘ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Žã‚ªãƒ–ジェクトファイルã¨ãƒ¢ã‚¸ãƒ¥ãƒ¼
ル生æˆæ™‚ã«ä¸­é–“çš„ã«ç”Ÿæˆã•ã‚Œã‚‹ã€Œãƒ©ã‚¤ãƒ–ラリå.oã€ã¨ã„ã†ãƒ•ã‚¡ã‚¤ãƒ«
ã¨ãŒè¡çªã™ã‚‹ã‹ã‚‰ã§ã™ï¼Žã¾ãŸï¼Œå¾Œè¿°ã™ã‚‹ mkmf ライブラリã®ã„ãã¤
ã‹ã®é–¢æ•°ãŒã‚³ãƒ³ãƒ‘イルをè¦ã™ã‚‹ãƒ†ã‚¹ãƒˆã®ãŸã‚ã«ã€Œconftest.cã€ã¨ã„
ã†ãƒ•ã‚¡ã‚¤ãƒ«åを使用ã™ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„.ソースファイル
åã¨ã—ã¦ã€Œconftest.cã€ã‚’使用ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“.

Rubyã¯æ‹¡å¼µãƒ©ã‚¤ãƒ–ラリをロードã™ã‚‹æ™‚ã«ã€ŒInit_ライブラリåã€ã¨
ã„ã†é–¢æ•°ã‚’自動的ã«å®Ÿè¡Œã—ã¾ã™ï¼Ždbmライブラリã®å ´åˆã€ŒInit_dbmã€
ã§ã™ï¼Žã“ã®é–¢æ•°ã®ä¸­ã§ã‚¯ãƒ©ã‚¹ï¼Œãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ï¼Œãƒ¡ã‚½ãƒƒãƒ‰ï¼Œå®šæ•°ãªã©ã®
定義を行ã„ã¾ã™ï¼Ždbm.cã‹ã‚‰ä¸€éƒ¨å¼•ç”¨ã—ã¾ã™ï¼Ž

  void
  Init_dbm(void)
  {
      /* DBMクラスを定義ã™ã‚‹ */
      cDBM = rb_define_class("DBM", rb_cObject);
      /* DBMã¯Enumerableモジュールをインクルードã™ã‚‹ */
      rb_include_module(cDBM, rb_mEnumerable);
  
      /* DBMクラスã®ã‚¯ãƒ©ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰open(): 引数ã¯Cã®é…列ã§å—ã‘ã‚‹ */
      rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1);
  
      /* DBMクラスã®ãƒ¡ã‚½ãƒƒãƒ‰close(): 引数ã¯ãªã— */
      rb_define_method(cDBM, "close", fdbm_close, 0);
      /* DBMクラスã®ãƒ¡ã‚½ãƒƒãƒ‰[]: 引数ã¯1個 */
      rb_define_method(cDBM, "[]", fdbm_fetch, 1);

      /* ... */
  
      /* DBMデータを格ç´ã™ã‚‹ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å¤‰æ•°åã®ãŸã‚ã®ID */
      id_dbm = rb_intern("dbm");
  }

DBMライブラリã¯dbmã®ãƒ‡ãƒ¼ã‚¿ã¨å¯¾å¿œã™ã‚‹ã‚ªãƒ–ジェクトã«ãªã‚‹ã¯ãšã§
ã™ã‹ã‚‰ï¼ŒCã®ä¸–ç•Œã®dbmã‚’Rubyã®ä¸–ç•Œã«å–り込む必è¦ãŒã‚ã‚Šã¾ã™ï¼Ž

dbm.cã§ã¯Data_Make_Structを以下ã®ã‚ˆã†ã«ä½¿ã£ã¦ã„ã¾ã™ï¼Ž

  struct dbmdata {
      int  di_size;
      DBM *di_dbm;
  };
  
  
  obj = Data_Make_Struct(klass, struct dbmdata, 0, free_dbm, dbmp);

ã“ã“ã§ã¯dbmstruct構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’Dataã«ã‚«ãƒ—セル化ã—ã¦ã„
ã¾ã™ï¼ŽDBM*を直接カプセル化ã—ãªã„ã®ã¯close()ã—ãŸæ™‚ã®å‡¦ç†ã‚’考
ãˆã¦ã®ã“ã¨ã§ã™ï¼Ž

Dataオブジェクトã‹ã‚‰dbmstruct構造体ã®ãƒã‚¤ãƒ³ã‚¿ã‚’å–り出ã™ãŸã‚
ã«ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã‚’使ã£ã¦ã„ã¾ã™ï¼Ž

  #define GetDBM(obj, dbmp) {\
      Data_Get_Struct(obj, struct dbmdata, dbmp);\
      if (dbmp->di_dbm == 0) closed_dbm();\
  }

ã¡ã‚‡ã£ã¨è¤‡é›‘ãªãƒžã‚¯ãƒ­ã§ã™ãŒï¼Œè¦ã™ã‚‹ã«dbmdata構造体ã®ãƒã‚¤ãƒ³ã‚¿
ã®å–り出ã—ã¨ï¼Œcloseã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ã®ãƒã‚§ãƒƒã‚¯ã‚’ã¾ã¨ã‚ã¦ã„
ã‚‹ã ã‘ã§ã™ï¼Ž

DBMクラスã«ã¯ãŸãã•ã‚“メソッドãŒã‚ã‚Šã¾ã™ãŒï¼Œåˆ†é¡žã™ã‚‹ã¨3種類ã®
引数ã®å—ã‘æ–¹ãŒã‚ã‚Šã¾ã™ï¼Žã²ã¨ã¤ã¯å¼•æ•°ã®æ•°ãŒå›ºå®šã®ã‚‚ã®ã§ï¼Œä¾‹ã¨
ã—ã¦ã¯deleteメソッドãŒã‚ã‚Šã¾ã™ï¼Ždeleteメソッドを実装ã—ã¦ã„ã‚‹
fdbm_delete()ã¯ã“ã®ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ï¼Ž

  static VALUE
  fdbm_delete(VALUE obj, VALUE keystr)
  {
      /* ... */
  }

引数ã®æ•°ãŒå›ºå®šã®ã‚¿ã‚¤ãƒ—ã¯ç¬¬1引数ãŒself,第2引数以é™ãŒãƒ¡ã‚½ãƒƒãƒ‰
ã®å¼•æ•°ã¨ãªã‚Šã¾ã™ï¼Ž

引数ã®æ•°ãŒä¸å®šã®ã‚‚ã®ã¯Cã®é…列ã§å—ã‘ã‚‹ã‚‚ã®ã¨Rubyã®é…列ã§å—ã‘
ã‚‹ã‚‚ã®ã¨ãŒã‚ã‚Šã¾ã™ï¼Ždbmライブラリã®ä¸­ã§ï¼ŒCã®é…列ã§å—ã‘ã‚‹ã‚‚ã®
ã¯DBMã®ã‚¯ãƒ©ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚ã‚‹open()ã§ã™ï¼Žã“れを実装ã—ã¦ã„ã‚‹é–¢
æ•°fdbm_s_open()ã¯ã“ã†ãªã£ã¦ã„ã¾ã™ï¼Ž

  static VALUE
  fdbm_s_open(int argc, VALUE *argv, VALUE klass)
  {
      /* ... */

      if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) {
  	mode = 0666;		/* default value */
      }

      /* ... */
  }

ã“ã®ã‚¿ã‚¤ãƒ—ã®é–¢æ•°ã¯ç¬¬1引数ãŒä¸Žãˆã‚‰ã‚ŒãŸå¼•æ•°ã®æ•°ï¼Œç¬¬2引数ãŒä¸Žãˆ
られãŸå¼•æ•°ã®å…¥ã£ã¦ã„ã‚‹é…列ã«ãªã‚Šã¾ã™ï¼Žselfã¯ç¬¬3引数ã¨ã—ã¦ä¸Ž
ãˆã‚‰ã‚Œã¾ã™ï¼Ž

ã“ã®é…列ã§ä¸Žãˆã‚‰ã‚ŒãŸå¼•æ•°ã‚’解æžã™ã‚‹ãŸã‚ã®é–¢æ•°ãŒopen()ã§ã‚‚使ã‚
ã‚Œã¦ã„ã‚‹rb_scan_args()ã§ã™ï¼Žç¬¬3引数ã«æŒ‡å®šã—ãŸãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã«å¾“
ã„,第4変数以é™ã«æŒ‡å®šã—ãŸVALUEã¸ã®å‚ç…§ã«å€¤ã‚’代入ã—ã¦ãã‚Œã¾
ã™ï¼Ž


引数をRubyã®é…列ã¨ã—ã¦å—ã‘å–るメソッドã®ä¾‹ã«ã¯
Thread#initializeãŒã‚ã‚Šã¾ã™ï¼Žå®Ÿè£…ã¯ã“ã†ã§ã™ï¼Ž

  static VALUE
  thread_initialize(VALUE thread, VALUE args)
  {
      /* ... */
  }

第1引数ã¯self,第2引数ã¯Rubyã®é…列ã§ã™ï¼Ž

*注æ„事項*

Rubyã¨å…±æœ‰ã¯ã—ãªã„ãŒRubyã®ã‚ªãƒ–ジェクトを格ç´ã™ã‚‹å¯èƒ½æ€§ã®ã‚ã‚‹
Cã®å¤§åŸŸå¤‰æ•°ã¯ä»¥ä¸‹ã®é–¢æ•°ã‚’使ã£ã¦Rubyインタプリタã«å¤‰æ•°ã®å­˜åœ¨
ã‚’æ•™ãˆã¦ã‚ã’ã¦ãã ã•ã„.ã§ãªã„ã¨GCã§ãƒˆãƒ©ãƒ–ルを起ã“ã—ã¾ã™ï¼Ž

  void rb_global_variable(VALUE *var)

== extconf.rbを用æ„ã™ã‚‹

Makefileを作る場åˆã®é››åž‹ã«ãªã‚‹extconf.rbã¨ã„ã†ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作り
ã¾ã™ï¼Žextconf.rbã¯ãƒ©ã‚¤ãƒ–ラリã®ã‚³ãƒ³ãƒ‘イルã«å¿…è¦ãªæ¡ä»¶ã®ãƒã‚§ãƒƒ
クãªã©ã‚’è¡Œã†ã“ã¨ãŒç›®çš„ã§ã™ï¼Žã¾ãšï¼Œ

  require 'mkmf'

ã‚’extconf.rbã®å…ˆé ­ã«ç½®ãã¾ã™ï¼Žextconf.rbã®ä¸­ã§ã¯ä»¥ä¸‹ã®Rubyé–¢
数を使ã†ã“ã¨ãŒå‡ºæ¥ã¾ã™ï¼Ž

  have_library(lib, func): ライブラリã®å­˜åœ¨ãƒã‚§ãƒƒã‚¯
  have_func(func, header): 関数ã®å­˜åœ¨ãƒã‚§ãƒƒã‚¯
  have_header(header): ヘッダファイルã®å­˜åœ¨ãƒã‚§ãƒƒã‚¯
  create_makefile(target[, target_prefix]): Makefileã®ç”Ÿæˆ

以下ã®å¤‰æ•°ã‚’使ã†ã“ã¨ãŒã§ãã¾ã™ï¼Ž

  $CFLAGS: コンパイル時ã«è¿½åŠ çš„ã«æŒ‡å®šã™ã‚‹ãƒ•ãƒ©ã‚°(-Oãªã©)
  $CPPFLAGS: プリプロセッサã«è¿½åŠ çš„ã«æŒ‡å®šã™ã‚‹ãƒ•ãƒ©ã‚°(-Iã‚„-Dãªã©)
  $LDFLAGS: リンク時ã«è¿½åŠ çš„ã«æŒ‡å®šã™ã‚‹ãƒ•ãƒ©ã‚°(-Lãªã©)
  $objs: リンクã•ã‚Œã‚‹ã‚ªãƒ–ジェクトファイルåã®ãƒªã‚¹ãƒˆ

オブジェクトファイルã®ãƒªã‚¹ãƒˆã¯ï¼Œé€šå¸¸ã¯ã‚½ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’検索ã—
ã¦è‡ªå‹•çš„ã«ç”Ÿæˆã•ã‚Œã¾ã™ãŒï¼Œmakeã®é€”中ã§ã‚½ãƒ¼ã‚¹ã‚’生æˆã™ã‚‹ã‚ˆã†ãª
å ´åˆã¯æ˜Žç¤ºçš„ã«æŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Ž

ライブラリをコンパイルã™ã‚‹æ¡ä»¶ãŒæƒã‚ãšï¼Œãã®ãƒ©ã‚¤ãƒ–ラリをコン
パイルã—ãªã„時ã«ã¯create_makefileを呼ã°ãªã‘ã‚Œã°Makefileã¯ç”Ÿ
æˆã•ã‚Œãšï¼Œã‚³ãƒ³ãƒ‘イルも行ã‚ã‚Œã¾ã›ã‚“.

== dependを用æ„ã™ã‚‹

ã‚‚ã—,ディレクトリã«dependã¨ã„ã†ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã™ã‚Œã°ï¼Œ
MakefileãŒä¾å­˜é–¢ä¿‚ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ãã‚Œã¾ã™ï¼Ž

  % gcc -MM *.c > depend

ãªã©ã§ä½œã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ï¼Žã‚ã£ã¦æã¯ç„¡ã„ã§ã—ょã†ï¼Ž

== Makefileを生æˆã™ã‚‹

Makefileを実際ã«ç”Ÿæˆã™ã‚‹ãŸã‚ã«ã¯

  ruby extconf.rb

ã¨ã—ã¾ã™ï¼Žextconf.rbã« require 'mkmf' ã®è¡ŒãŒãªã„å ´åˆã«ã¯ã‚¨ãƒ©ãƒ¼
ã«ãªã‚Šã¾ã™ã®ã§ï¼Œå¼•æ•°ã‚’追加ã—ã¦

  ruby -r mkmf extconf.rb

ã¨ã—ã¦ãã ã•ã„.

site_ruby ディレクトリã§ãªã,
vendor_ruby ディレクトリã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹å ´åˆã«ã¯
以下ã®ã‚ˆã†ã« --vendor オプションを加ãˆã¦ãã ã•ã„.

  ruby extconf.rb --vendor

ディレクトリをext以下ã«ç”¨æ„ã—ãŸå ´åˆã«ã¯Ruby全体ã®makeã®æ™‚ã«
自動的ã«MakefileãŒç”Ÿæˆã•ã‚Œã¾ã™ã®ã§ï¼Œã“ã®ã‚¹ãƒ†ãƒƒãƒ—ã¯ä¸è¦ã§ã™ï¼Ž

== makeã™ã‚‹

動的リンクライブラリを生æˆã™ã‚‹å ´åˆã«ã¯ãã®å ´ã§makeã—ã¦ãã ã•
ã„.必è¦ã§ã‚れ㰠make install ã§ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¾ã™ï¼Ž

ext以下ã«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’用æ„ã—ãŸå ´åˆã¯ï¼ŒRubyã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§
makeを実行ã™ã‚‹ã¨Makefileを生æˆã‹ã‚‰make,必è¦ã«ã‚ˆã£ã¦ã¯ãã®ãƒ¢
ジュールã®Rubyã¸ã®ãƒªãƒ³ã‚¯ã¾ã§è‡ªå‹•çš„ã«å®Ÿè¡Œã—ã¦ãã‚Œã¾ã™ï¼Ž
extconf.rbを書ãæ›ãˆã‚‹ãªã©ã—ã¦Makefileã®å†ç”ŸæˆãŒå¿…è¦ãªæ™‚ã¯ã¾
ãŸRubyディレクトリã§makeã—ã¦ãã ã•ã„.

拡張ライブラリã¯make installã§Rubyライブラリã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®
下ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ï¼Žã‚‚ã—拡張ライブラリã¨å”調ã—ã¦ä½¿ã†Rubyã§è¨˜
è¿°ã•ã‚ŒãŸãƒ—ログラムãŒã‚り,Rubyライブラリã«ç½®ããŸã„å ´åˆã«ã¯ï¼Œ
拡張ライブラリ用ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä¸‹ã« lib ã¨ã„ã†ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª
を作り,ãã“ã« æ‹¡å¼µå­ .rb ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ç½®ã„ã¦ãŠã‘ã°åŒæ™‚ã«ã‚¤ãƒ³
ストールã•ã‚Œã¾ã™ï¼Ž

== デãƒãƒƒã‚°

ã¾ã‚,デãƒãƒƒã‚°ã—ãªã„ã¨å‹•ã‹ãªã„ã§ã—ょã†ã­ï¼Žext/Setupã«ãƒ‡ã‚£ãƒ¬
クトリåを書ãã¨é™çš„ã«ãƒªãƒ³ã‚¯ã™ã‚‹ã®ã§ãƒ‡ãƒãƒƒã‚¬ãŒä½¿ãˆã‚‹ã‚ˆã†ã«ãª
ã‚Šã¾ã™ï¼Žãã®åˆ†ã‚³ãƒ³ãƒ‘イルãŒé…ããªã‚Šã¾ã™ã‘ã©ï¼Ž

== ã§ãã‚ãŒã‚Š

後ã¯ã“ã£ãり使ã†ãªã‚Šï¼Œåºƒã公開ã™ã‚‹ãªã‚Šï¼Œå£²ã‚‹ãªã‚Šï¼Œã”自由ã«ãŠ
使ã„ãã ã•ã„.Rubyã®ä½œè€…ã¯æ‹¡å¼µãƒ©ã‚¤ãƒ–ラリã«é–¢ã—ã¦ä¸€åˆ‡ã®æ¨©åˆ©ã‚’
主張ã—ã¾ã›ã‚“.

= Appendix A. Rubyã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã®åˆ†é¡ž

Rubyã®ã‚½ãƒ¼ã‚¹ã¯ã„ãã¤ã‹ã«åˆ†é¡žã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ï¼Žã“ã®ã†ã¡ã‚¯ãƒ©
スライブラリã®éƒ¨åˆ†ã¯åŸºæœ¬çš„ã«æ‹¡å¼µãƒ©ã‚¤ãƒ–ラリã¨åŒã˜ä½œã‚Šæ–¹ã«ãªã£
ã¦ã„ã¾ã™ï¼Žã“れらã®ã‚½ãƒ¼ã‚¹ã¯ä»Šã¾ã§ã®èª¬æ˜Žã§ã»ã¨ã‚“ã©ç†è§£ã§ãã‚‹ã¨
æ€ã„ã¾ã™ï¼Ž

== Ruby言語ã®ã‚³ã‚¢

class.c    :: クラスã¨ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«
error.c    :: 例外クラスã¨ä¾‹å¤–機構
gc.c       :: 記憶領域管ç†
load.c     :: ライブラリã®ãƒ­ãƒ¼ãƒ‰
object.c   :: オブジェクト
variable.c :: 変数ã¨å®šæ•°

== Rubyã®æ§‹æ–‡è§£æžå™¨

  parse.y      : å­—å¥è§£æžå™¨ã¨æ§‹æ–‡å®šç¾©
    -> parse.c : 自動生æˆ
  keywords     : 予約語
    -> lex.c   : 自動生æˆ

== 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    : åŒä¸Š
  vm.c
  vm_dump.c
  vm_eval.c
  vm_exec.c
  vm_insnhelper.c
  vm_method.c

  opt_insns_unif.def  : 命令èžåˆ
  opt_operand.def     : 最é©åŒ–ã®ãŸã‚ã®å®šç¾©

    -> insn*.inc      : 自動生æˆ
    -> opt*.inc       : 自動生æˆ
    -> vm.inc         : 自動生æˆ

== æ­£è¦è¡¨ç¾ã‚¨ãƒ³ã‚¸ãƒ³ (鬼車)

  regex.c
  regcomp.c
  regenc.c
  regerror.c
  regexec.c
  regparse.c
  regsyntax.c

== ユーティリティ関数

debug.c    :: Cデãƒãƒƒã‚¬ç”¨ã®ãƒ‡ãƒãƒƒã‚°ã‚·ãƒ³ãƒœãƒ«
dln.c      :: 動的ローディング
st.c       :: 汎用ãƒãƒƒã‚·ãƒ¥è¡¨
strftime.c :: 時刻整形
util.c     :: ãã®ä»–ã®ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£

== Rubyコマンドã®å®Ÿè£…

  dmyext.c
  dmydln.c
  dmyencoding.c
  id.c
  inits.c
  main.c
  ruby.c
  version.c

  gem_prelude.rb
  prelude.rb

== クラスライブラリ

array.c      :: Array
bignum.c     :: Bignum
compar.c     :: Comparable
complex.c    :: Complex
cont.c       :: Fiber, Continuation
dir.c        :: Dir
enum.c       :: Enumerable
enumerator.c :: Enumerator
file.c       :: File
hash.c       :: Hash
io.c         :: IO
marshal.c    :: Marshal
math.c       :: Math
numeric.c    :: Numeric, Integer, Fixnum, Float
pack.c       :: Array#pack, String#unpack
proc.c       :: Binding, Proc
process.c    :: Process
random.c     :: 乱数
range.c      :: Range
rational.c   :: Rational
re.c         :: Regexp, MatchData
signal.c     :: Signal
sprintf.c    :: String#sprintf
string.c     :: String
struct.c     :: Struct
time.c       :: Time
defs/known_errors.def :: 例外クラス Errno::*
-> known_errors.inc   :: 自動生æˆ

== 多言語化

encoding.c  :: Encoding
transcode.c :: Encoding::Converter
enc/*.c     :: エンコーディングクラス群
enc/trans/* :: コードãƒã‚¤ãƒ³ãƒˆå¯¾å¿œè¡¨

== gorubyコマンドã®å®Ÿè£…

  goruby.c
  golf_prelude.rb      : goruby固有ã®ãƒ©ã‚¤ãƒ–ラリ
    -> golf_prelude.c  : 自動生æˆ

= Appendix B. 拡張用関数リファレンス

C言語ã‹ã‚‰Rubyã®æ©Ÿèƒ½ã‚’利用ã™ã‚‹APIã¯ä»¥ä¸‹ã®é€šã‚Šã§ã‚る.

== åž‹

VALUE ::

  Rubyオブジェクトを表ç¾ã™ã‚‹åž‹ï¼Žå¿…è¦ã«å¿œã˜ã¦ã‚­ãƒ£ã‚¹ãƒˆã—ã¦ç”¨ã„る.
  組ã¿è¾¼ã¿åž‹ã‚’表ç¾ã™ã‚‹Cã®åž‹ã¯ruby.hã«è¨˜è¿°ã—ã¦ã‚ã‚‹Rã§å§‹ã¾ã‚‹æ§‹é€ 
  体ã§ã‚る.VALUEåž‹ã‚’ã“れらã«ã‚­ãƒ£ã‚¹ãƒˆã™ã‚‹ãŸã‚ã«Rã§å§‹ã¾ã‚‹æ§‹é€ ä½“
  åã‚’å…¨ã¦å¤§æ–‡å­—ã«ã—ãŸåå‰ã®ãƒžã‚¯ãƒ­ãŒç”¨æ„ã•ã‚Œã¦ã„る.

== 変数・定数

Qnil ::

  定数: nilオブジェクト

Qtrue ::

  定数: trueオブジェクト(真ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤)

Qfalse ::

  定数: falseオブジェクト

== Cデータã®ã‚«ãƒ—セル化

Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval) ::

  Cã®ä»»æ„ã®ãƒã‚¤ãƒ³ã‚¿ã‚’カプセル化ã—ãŸRubyオブジェクトを返ã™ï¼Žã“
  ã®ãƒã‚¤ãƒ³ã‚¿ãŒRubyã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã•ã‚Œãªããªã£ãŸæ™‚,freeã§æŒ‡å®šã—ãŸ
  関数ãŒå‘¼ã°ã‚Œã‚‹ï¼Žã¾ãŸï¼Œã“ã®ãƒã‚¤ãƒ³ã‚¿ã®æŒ‡ã™ãƒ‡ãƒ¼ã‚¿ãŒä»–ã®Rubyオブ
  ジェクトを指ã—ã¦ã„ã‚‹å ´åˆï¼Œmarkã«æŒ‡å®šã™ã‚‹é–¢æ•°ã§ãƒžãƒ¼ã‚¯ã™ã‚‹å¿…è¦
  ãŒã‚る.

Data_Make_Struct(klass, type, mark, free, sval) ::

  typeåž‹ã®ãƒ¡ãƒ¢ãƒªã‚’mallocã—,変数svalã«ä»£å…¥ã—ãŸå¾Œï¼Œãれをカプセ
  ル化ã—ãŸãƒ‡ãƒ¼ã‚¿ã‚’è¿”ã™ãƒžã‚¯ãƒ­ï¼Ž

Data_Get_Struct(data, type, sval) ::

  dataã‹ã‚‰typeåž‹ã®ãƒã‚¤ãƒ³ã‚¿ã‚’å–り出ã—変数svalã«ä»£å…¥ã™ã‚‹ãƒžã‚¯ãƒ­ï¼Ž

== åž‹ãƒã‚§ãƒƒã‚¯

  TYPE(value)
  FIXNUM_P(value)
  NIL_P(value)
  void Check_Type(VALUE value, int type)
  SafeStringValue(value)

== 型変æ›

  FIX2INT(value), INT2FIX(i)
  FIX2LONG(value), LONG2FIX(l)
  NUM2INT(value), INT2NUM(i)
  NUM2UINT(value), UINT2NUM(ui)
  NUM2LONG(value), LONG2NUM(l)
  NUM2ULONG(value), ULONG2NUM(ul)
  NUM2LL(value), LL2NUM(ll)
  NUM2ULL(value), ULL2NUM(ull)
  NUM2OFFT(value), OFFT2NUM(off)
  NUM2SIZET(value), SIZET2NUM(size)
  NUM2SSIZET(value), SSIZET2NUM(ssize)
  NUM2DBL(value)
  rb_float_new(f)
  StringValue(value)
  StringValuePtr(value)
  StringValueCStr(value)
  rb_str_new2(s)

== クラス/モジュール定義

VALUE rb_define_class(const char *name, VALUE super) ::

  superã®ã‚µãƒ–クラスã¨ã—ã¦æ–°ã—ã„Rubyクラスを定義ã™ã‚‹ï¼Ž

VALUE rb_define_class_under(VALUE module, const char *name, VALUE super) ::

  superã®ã‚µãƒ–クラスã¨ã—ã¦æ–°ã—ã„Rubyクラスを定義ã—,moduleã®
  定数ã¨ã—ã¦å®šç¾©ã™ã‚‹ï¼Ž

VALUE rb_define_module(const char *name) ::

  æ–°ã—ã„Rubyモジュールを定義ã™ã‚‹ï¼Ž

VALUE rb_define_module_under(VALUE module, const char *name) ::

  æ–°ã—ã„Rubyモジュールを定義ã—,moduleã®å®šæ•°ã¨ã—ã¦å®šç¾©ã™ã‚‹ï¼Ž

void rb_include_module(VALUE klass, VALUE module) ::

  モジュールをインクルードã™ã‚‹ï¼ŽclassãŒã™ã§ã«moduleをインク
  ルードã—ã¦ã„る時ã«ã¯ä½•ã‚‚ã—ãªã„(多é‡ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã®ç¦æ­¢).

void rb_extend_object(VALUE object, VALUE module) ::

  オブジェクトをモジュール(ã§å®šç¾©ã•ã‚Œã¦ã„るメソッド)ã§æ‹¡å¼µã™ã‚‹ï¼Ž

== 大域変数定義

void rb_define_variable(const char *name, VALUE *var) ::

  Rubyã¨Cã¨ã§å…±æœ‰ã™ã‚‹ã‚°ãƒ­ãƒ¼ãƒãƒ«å¤‰æ•°ã‚’定義ã™ã‚‹ï¼Žå¤‰æ•°åãŒ`$'ã§
  始ã¾ã‚‰ãªã„時ã«ã¯è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã‚‹ï¼Žnameã¨ã—ã¦Rubyã®è­˜åˆ¥å­
  ã¨ã—ã¦è¨±ã•ã‚Œãªã„文字(例ãˆã°` ')ã‚’å«ã‚€å ´åˆã«ã¯Rubyプログラ
  ムã‹ã‚‰ã¯è¦‹ãˆãªããªã‚‹ï¼Ž

void rb_define_readonly_variable(const char *name, VALUE *var) ::

  Rubyã¨Cã¨ã§å…±æœ‰ã™ã‚‹read onlyã®ã‚°ãƒ­ãƒ¼ãƒãƒ«å¤‰æ•°ã‚’定義ã™ã‚‹ï¼Ž
  read onlyã§ã‚ã‚‹ã“ã¨ä»¥å¤–ã¯rb_define_variable()ã¨åŒã˜ï¼Ž

void rb_define_virtual_variable(const char *name, VALUE (*getter)(), void (*setter)()) ::

  関数ã«ã‚ˆã£ã¦å®Ÿç¾ã•ã‚Œã‚‹Ruby変数を定義ã™ã‚‹ï¼Žå¤‰æ•°ãŒå‚ç…§ã•ã‚ŒãŸ
  時ã«ã¯getterãŒï¼Œå¤‰æ•°ã«å€¤ãŒã‚»ãƒƒãƒˆã•ã‚ŒãŸæ™‚ã«ã¯setterãŒå‘¼ã°ã‚Œ
  る.

void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)()) ::

  関数ã«ã‚ˆã£ã¦hookã®ã¤ã‘られãŸã‚°ãƒ­ãƒ¼ãƒãƒ«å¤‰æ•°ã‚’定義ã™ã‚‹ï¼Žå¤‰æ•°
  ãŒå‚ç…§ã•ã‚ŒãŸæ™‚ã«ã¯getterãŒï¼Œé–¢æ•°ã«å€¤ãŒã‚»ãƒƒãƒˆã•ã‚ŒãŸæ™‚ã«ã¯
  setterãŒå‘¼ã°ã‚Œã‚‹ï¼Žgetterã‚„setterã«0を指定ã—ãŸæ™‚ã«ã¯hookã‚’
  指定ã—ãªã„ã®ã¨åŒã˜äº‹ã«ãªã‚‹ï¼Ž

void rb_global_variable(VALUE *var)

  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) ::

  メソッドを定義ã™ã‚‹ï¼Žargcã¯selfを除ã引数ã®æ•°ï¼ŽargcãŒ-1ã®æ™‚,
  関数ã«ã¯å¼•æ•°ã®æ•°(selfã‚’å«ã¾ãªã„)を第1引数, 引数ã®é…列を第2
  引数ã¨ã™ã‚‹å½¢å¼ã§ä¸Žãˆã‚‰ã‚Œã‚‹(第3引数ã¯self).argcãŒ-2ã®æ™‚,
  第1引数ãŒself, 第2引数ãŒargs(argsã¯å¼•æ•°ã‚’å«ã‚€Rubyã®é…列)ã¨
  ã„ã†å½¢å¼ã§ä¸Žãˆã‚‰ã‚Œã‚‹ï¼Ž

rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(), int argc) ::

  privateメソッドを定義ã™ã‚‹ï¼Žå¼•æ•°ã¯rb_define_method()ã¨åŒã˜ï¼Ž

rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(), int argc) ::

  特異メソッドを定義ã™ã‚‹ï¼Žå¼•æ•°ã¯rb_define_method()ã¨åŒã˜ï¼Ž

rb_scan_args(int argc, VALUE *argv, const char *fmt, ...) ::

  argc, argvå½¢å¼ã§ä¸Žãˆã‚‰ã‚ŒãŸæŒ‡å®šã•ã‚ŒãŸãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã«å¾“ã£ã¦å¼•
  数を分解ã—,続ãVALUEã¸ã®å‚ç…§ã«ã‚»ãƒƒãƒˆã—ã¾ã™ï¼Žã“ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒ
  トã¯ï¼ŒABNFã§è¨˜è¿°ã™ã‚‹ã¨ä»¥ä¸‹ã®é€šã‚Šã§ã™ï¼Ž

    scan-arg-spec  := param-arg-spec [option-hash-arg-spec] [block-arg-spec]

    param-arg-spec := pre-arg-spec [post-arg-spec] / post-arg-spec /
                      pre-opt-post-arg-spec
    pre-arg-spec   := num-of-leading-mandatory-args [num-of-optional-args]
    post-arg-spec  := sym-for-variable-length-args
                      [num-of-trailing-mandatory-args]
    pre-opt-post-arg-spec := num-of-leading-mandatory-args num-of-optional-args
                             num-of-trailing-mandatory-args
    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              := "&"   ; イテレータブロックをå–å¾—ã™ã‚‹ãŸã‚ã®
                                            ; 指定

  フォーマットãŒ"12"ã®å ´åˆï¼Œå¼•æ•°ã¯æœ€ä½Ž1ã¤ã§ï¼Œ3ã¤(1+2)ã¾ã§è¨±ã•
  れるã¨ã„ã†æ„味ã«ãªã‚Šã¾ã™ï¼Žå¾“ã£ã¦ï¼Œãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆæ–‡å­—列ã«ç¶šã„
  ã¦3ã¤ã®VALUEã¸ã®å‚照を置ãå¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Žãれらã«ã¯å–å¾—ã—ãŸ
  変数ãŒã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ï¼Žå¤‰æ•°ã¸ã®å‚ç…§ã®ä»£ã‚ã‚Šã«NULLを指定ã™ã‚‹
  ã“ã¨ã‚‚ã§ã,ãã®å ´åˆã¯å–å¾—ã—ãŸå¼•æ•°ã®å€¤ã¯æ¨ã¦ã‚‰ã‚Œã¾ã™ï¼ŽãªãŠï¼Œ
  çœç•¥å¯èƒ½å¼•æ•°ãŒçœç•¥ã•ã‚ŒãŸæ™‚ã®å¤‰æ•°ã®å€¤ã¯nil(C言語ã®ãƒ¬ãƒ™ãƒ«ã§ã¯
  Qnil)ã«ãªã‚Šã¾ã™ï¼Ž

  返り値ã¯ä¸Žãˆã‚‰ã‚ŒãŸå¼•æ•°ã®æ•°ã§ã™ï¼Žã‚ªãƒ—ションãƒãƒƒã‚·ãƒ¥ãŠã‚ˆã³ã‚¤
  テレータブロックã¯æ•°ãˆã¾ã›ã‚“.

== Rubyメソッド呼ã³å‡ºã—

VALUE rb_funcall(VALUE recv, ID mid, int narg, ...) ::

  メソッド呼ã³å‡ºã—.文字列ã‹ã‚‰midã‚’å¾—ã‚‹ãŸã‚ã«ã¯rb_intern()ã‚’
  使ã†ï¼Ž

VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) ::

  メソッド呼ã³å‡ºã—.引数をargc, argvå½¢å¼ã§æ¸¡ã™ï¼Ž

VALUE rb_eval_string(const char *str)

  文字列をRubyスクリプトã¨ã—ã¦ã‚³ãƒ³ãƒ‘イル・実行ã™ã‚‹ï¼Ž

ID rb_intern(const char *name) ::

  文字列ã«å¯¾å¿œã™ã‚‹IDã‚’è¿”ã™ï¼Ž

char *rb_id2name(ID id) ::

  IDã«å¯¾å¿œã™ã‚‹æ–‡å­—列を返ã™(デãƒãƒƒã‚°ç”¨).

char *rb_class2name(VALUE klass) ::

  クラスã®åå‰ã‚’è¿”ã™(デãƒãƒƒã‚°ç”¨).クラスãŒåå‰ã‚’æŒãŸãªã„時ã«
  ã¯, 祖先をé¡ã£ã¦åå‰ã‚’æŒã¤ã‚¯ãƒ©ã‚¹ã®åå‰ã‚’è¿”ã™ï¼Ž

int rb_respond_to(VALUE obj, ID id) ::

  objãŒidã§ç¤ºã•ã‚Œã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ã‚’æŒã¤ã‹ã©ã†ã‹ã‚’è¿”ã™ï¼Ž

== インスタンス変数

VALUE rb_iv_get(VALUE obj, const char *name) ::

  objã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å¤‰æ•°ã®å€¤ã‚’得る.`@'ã§å§‹ã¾ã‚‰ãªã„インスタン
  ス変数㯠Rubyプログラムã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„「隠れãŸã€ã‚¤ãƒ³
  スタンス変数ã«ãªã‚‹ï¼Žå®šæ•°ã¯å¤§æ–‡å­—ã®åå‰ã‚’æŒã¤ã‚¯ãƒ©ã‚¹(ã¾ãŸã¯
  モジュール)ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å¤‰æ•°ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„る.

VALUE rb_iv_set(VALUE obj, const char *name, VALUE val) ::

  objã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å¤‰æ•°ã‚’valã«ã‚»ãƒƒãƒˆã™ã‚‹ï¼Ž

== 制御構造

VALUE rb_block_call(VALUE obj, ID mid, int argc, VALUE * argv, VALUE (*func) (ANYARGS), VALUE data2) ::

  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引数ã«ã‚¤ãƒ†ãƒ¬ãƒ¼
  ã‚¿ã‹ã‚‰ä¸Žãˆã‚‰ã‚ŒãŸå€¤, 第2引数ã«arg2ãŒæ¸¡ã•ã‚Œã‚‹ï¼Ž
  
  1.9ã§rb_iterateを使ã†å ´åˆã¯, func1ã®ä¸­ã§Rubyレベルã®ãƒ¡ã‚½ãƒƒãƒ‰
  を呼ã³å‡ºã•ãªã‘ã‚Œã°ãªã‚‰ãªã„.
  1.9ã§obsoleteã¨ãªã£ãŸ. 代ã‚ã‚Šã«rb_block_callãŒç”¨æ„ã•ã‚ŒãŸ.

VALUE rb_yield(VALUE val) ::

  valを値ã¨ã—ã¦ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚¿ãƒ–ロックを呼ã³å‡ºã™ï¼Ž

VALUE rb_rescue(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) ::

  関数func1ã‚’arg1を引数ã«å‘¼ã³å‡ºã™ï¼Žfunc1ã®å®Ÿè¡Œä¸­ã«ä¾‹å¤–ãŒç™ºç”Ÿ
  ã—ãŸæ™‚ã«ã¯ func2ã‚’arg2を引数ã¨ã—ã¦å‘¼ã¶ï¼Žæˆ»ã‚Šå€¤ã¯ä¾‹å¤–ãŒç™ºç”Ÿ
  ã—ãªã‹ã£ãŸæ™‚ã¯func1ã®æˆ»ã‚Šå€¤, 例外ãŒç™ºç”Ÿã—ãŸæ™‚ã«ã¯func2ã®æˆ»
  り値ã§ã‚る.

VALUE rb_ensure(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) ::

  関数func1ã‚’arg1を引数ã¨ã—ã¦å®Ÿè¡Œã—, 実行終了後(ãŸã¨ãˆä¾‹å¤–ãŒ
  発生ã—ã¦ã‚‚) func2ã‚’arg2を引数ã¨ã—ã¦å®Ÿè¡Œã™ã‚‹ï¼Žæˆ»ã‚Šå€¤ã¯func1
  ã®æˆ»ã‚Šå€¤ã§ã‚ã‚‹(例外ãŒç™ºç”Ÿã—ãŸæ™‚ã¯æˆ»ã‚‰ãªã„).

VALUE rb_protect(VALUE (*func) (VALUE), VALUE arg, int *state) ::

  関数funcã‚’argを引数ã¨ã—ã¦å®Ÿè¡Œã—, 例外ãŒç™ºç”Ÿã—ãªã‘ã‚Œã°ãã®æˆ»
  り値を返ã™ï¼Žä¾‹å¤–ãŒç™ºç”Ÿã—ãŸå ´åˆã¯, *stateã«éž0をセットã—ã¦
  Qnilã‚’è¿”ã™ï¼Ž
  rb_jump_tag()を呼ã°ãšã«æ•æ‰ã—ãŸä¾‹å¤–を無視ã™ã‚‹å ´åˆã«ã¯ï¼Œ
  rb_set_errinfo(Qnil)ã§ã‚¨ãƒ©ãƒ¼æƒ…報をクリアã—ãªã‘ã‚Œã°ãªã‚‰ãªã„.

void rb_jump_tag(int state) ::

  rb_protect()ã‚„rb_eval_string_protect()ã§æ•æ‰ã•ã‚ŒãŸä¾‹å¤–ã‚’å†
  é€ã™ã‚‹ï¼Žstateã¯ãれらã®é–¢æ•°ã‹ã‚‰è¿”ã•ã‚ŒãŸå€¤ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„.
  ã“ã®é–¢æ•°ã¯ç›´æŽ¥ã®å‘¼ã³å‡ºã—å…ƒã«æˆ»ã‚‰ãªã„.

void rb_iter_break() ::

  ç¾åœ¨ã®æœ€ã‚‚内å´ã®ãƒ–ロックを終了ã™ã‚‹ï¼Žã“ã®é–¢æ•°ã¯ç›´æŽ¥ã®å‘¼ã³å‡º
  ã—å…ƒã«æˆ»ã‚‰ãªã„.

void rb_iter_break_value(VALUE value) ::

  ç¾åœ¨ã®æœ€ã‚‚内å´ã®ãƒ–ロックをvalueã§çµ‚了ã™ã‚‹ï¼Žãƒ–ロックã¯å¼•æ•°ã§
  与ãˆã‚‰ã‚ŒãŸvalueã‚’è¿”ã™ï¼Žã“ã®é–¢æ•°ã¯ç›´æŽ¥ã®å‘¼ã³å‡ºã—å…ƒã«æˆ»ã‚‰ãªã„.

== 例外・エラー

void rb_warning(const char *fmt, ...) ::

  rb_verbose時ã«æ¨™æº–エラー出力ã«è­¦å‘Šæƒ…報を表示ã™ã‚‹ï¼Žå¼•æ•°ã¯
  printf()ã¨åŒã˜ï¼Ž

void rb_raise(rb_eRuntimeError, const char *fmt, ...) ::

  RuntimeError例外を発生ã•ã›ã‚‹ï¼Žå¼•æ•°ã¯printf()ã¨åŒã˜ï¼Ž

void rb_raise(VALUE exception, const char *fmt, ...) ::

  exceptionã§æŒ‡å®šã—ãŸä¾‹å¤–を発生ã•ã›ã‚‹ï¼Žfmt以下ã®å¼•æ•°ã¯
  printf()ã¨åŒã˜ï¼Ž

void rb_fatal(const char *fmt, ...) ::

  致命的例外を発生ã•ã›ã‚‹ï¼Žé€šå¸¸ã®ä¾‹å¤–処ç†ã¯è¡Œãªã‚ã‚Œãš, インター
  プリタãŒçµ‚了ã™ã‚‹(ãŸã ã—ensureã§æŒ‡å®šã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ã¯çµ‚了å‰ã«
  実行ã•ã‚Œã‚‹).

void rb_bug(const char *fmt, ...) ::

  インタープリタãªã©ãƒ—ログラムã®ãƒã‚°ã§ã—ã‹ç™ºç”Ÿã™ã‚‹ã¯ãšã®ãªã„
  状æ³ã®æ™‚呼ã¶ï¼Žã‚¤ãƒ³ã‚¿ãƒ¼ãƒ—リタã¯ã‚³ã‚¢ãƒ€ãƒ³ãƒ—ã—ç›´ã¡ã«çµ‚了ã™ã‚‹ï¼Ž
  例外処ç†ã¯ä¸€åˆ‡è¡Œãªã‚ã‚Œãªã„.

注æ„: %iã¯Object#to_s('+'フラグãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã¨ãã¯Object#inspect)ã‚’
使ã£ãŸVALUEã®å‡ºåŠ›ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ãŸã‚,整数ã«ã¯%dを使用ã™ã‚‹ã“ã¨ï¼Ž

== Rubyã®åˆæœŸåŒ–・実行

Rubyをアプリケーションã«åŸ‹ã‚込む場åˆã«ã¯ä»¥ä¸‹ã®ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹
を使ã†ï¼Žé€šå¸¸ã®æ‹¡å¼µãƒ©ã‚¤ãƒ–ラリã«ã¯å¿…è¦ãªã„.

void ruby_init() ::

  Rubyインタプリタã®åˆæœŸåŒ–ã‚’è¡Œãªã†ï¼Ž

void ruby_options(int argc, char **argv) ::

  Rubyインタプリタã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å¼•æ•°ã®å‡¦ç†ã‚’è¡Œãªã†ï¼Ž

void ruby_run() ::

  Rubyインタプリタを実行ã™ã‚‹ï¼Ž

void ruby_script(char *name) ::

  Rubyã®ã‚¹ã‚¯ãƒªãƒ—トå($0)を設定ã™ã‚‹ï¼Ž

== インタプリタã®ã‚¤ãƒ™ãƒ³ãƒˆã®ãƒ•ãƒƒã‚¯

  void rb_add_event_hook(rb_event_hook_func_t func, rb_event_flag_t events,
                         VALUE data)

指定ã•ã‚ŒãŸã‚¤ãƒ³ã‚¿ãƒ—リタã®ã‚¤ãƒ™ãƒ³ãƒˆã«å¯¾ã™ã‚‹ãƒ•ãƒƒã‚¯é–¢æ•°ã‚’追加ã—ã¾ã™ï¼Ž
eventsã¯ä»¥ä¸‹ã®å€¤ã®orã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“:

  RUBY_EVENT_LINE
  RUBY_EVENT_CLASS
  RUBY_EVENT_END
  RUBY_EVENT_CALL
  RUBY_EVENT_RETURN
  RUBY_EVENT_C_CALL
  RUBY_EVENT_C_RETURN
  RUBY_EVENT_RAISE
  RUBY_EVENT_ALL

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 ã‚‚å‚ç…§ã—ã¦ãã ã•ã„.

  int rb_remove_event_hook(rb_event_hook_func_t func)

指定ã•ã‚ŒãŸãƒ•ãƒƒã‚¯é–¢æ•°ã‚’削除ã—ã¾ã™ï¼Ž

== 互æ›æ€§ã®ãŸã‚ã®ãƒžã‚¯ãƒ­

APIã®äº’æ›æ€§ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ãŸã‚ã«ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ãŒãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ï¼Ž

NORETURN_STYLE_NEW ::

  NORETURN マクロãŒé–¢æ•°åž‹ãƒžã‚¯ãƒ­ã¨ã—ã¦å®šç¾©ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã™ã‚‹ï¼Ž

HAVE_RB_DEFINE_ALLOC_FUNC ::

  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() 関数ãŒæä¾›ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã™ã‚‹ï¼Ž
  have_func("rb_reg_new_str", "ruby.h").
  ã®çµæžœã¨åŒã˜ï¼Ž

HAVE_RB_IO_T ::

  rb_io_t åž‹ãŒæä¾›ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã™ã‚‹ï¼Ž

USE_SYMBOL_AS_METHOD_NAME ::

  メソッドåã‚’è¿”ã™ãƒ¡ã‚½ãƒƒãƒ‰ï¼ŒModule#methods, #singleton_methods
  ãªã©ãŒSymbolã‚’è¿”ã™ã“ã¨ã‚’æ„味ã™ã‚‹ï¼Ž

HAVE_RUBY_*_H ::

  ruby.h ã§å®šç¾©ã•ã‚Œã¦ã„る.対応ã™ã‚‹ãƒ˜ãƒƒãƒ€ãŒæä¾›ã•ã‚Œã¦ã„ã‚‹ã“ã¨
  ã‚’æ„味ã™ã‚‹ï¼ŽãŸã¨ãˆã°ï¼ŒHAVE_RUBY_ST_H ãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯
  å˜ãªã‚‹ st.h ã§ã¯ãªã ruby/st.h を使用ã™ã‚‹ï¼Ž

RB_EVENT_HOOKS_HAVE_CALLBACK_DATA ::

  rb_add_event_hook() ãŒãƒ•ãƒƒã‚¯é–¢æ•°ã«æ¸¡ã™ data を第3引数ã¨ã—ã¦
  å—ã‘å–ã‚‹ã“ã¨ã‚’æ„味ã™ã‚‹ï¼Ž

= Appendix C. extconf.rbã§ä½¿ãˆã‚‹é–¢æ•°ãŸã¡

extconf.rbã®ä¸­ã§ã¯åˆ©ç”¨å¯èƒ½ãªã‚³ãƒ³ãƒ‘イルæ¡ä»¶ãƒã‚§ãƒƒã‚¯ã®é–¢æ•°ã¯ä»¥
下ã®é€šã‚Šã§ã‚る.

have_macro(macro, headers) ::

  ヘッダファイルheaderをインクルードã—ã¦ãƒžã‚¯ãƒ­macroãŒå®šç¾©ã•
  ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼Žãƒžã‚¯ãƒ­ãŒå®šç¾©ã•ã‚Œã¦ã„る時true
  ã‚’è¿”ã™ï¼Ž

have_library(lib, func) ::

  関数funcを定義ã—ã¦ã„るライブラリlibã®å­˜åœ¨ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼Ž
  ライブラリãŒå­˜åœ¨ã™ã‚‹æ™‚,trueã‚’è¿”ã™ï¼Ž

find_library(lib, func, path...) ::

  関数funcを定義ã—ã¦ã„るライブラリlibã®å­˜åœ¨ã‚’ -Lpath を追加
  ã—ãªãŒã‚‰ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼Žãƒ©ã‚¤ãƒ–ラリãŒè¦‹ä»˜ã‹ã£ãŸæ™‚,trueã‚’è¿”ã™ï¼Ž

have_func(func, header) ::

  ヘッダファイルheaderをインクルードã—ã¦é–¢æ•°funcã®å­˜åœ¨ã‚’ãƒã‚§
  ックã™ã‚‹ï¼ŽfuncãŒæ¨™æº–ã§ã¯ãƒªãƒ³ã‚¯ã•ã‚Œãªã„ライブラリ内ã®ã‚‚ã®ã§
  ã‚る時ã«ã¯å…ˆã«have_libraryã§ãã®ãƒ©ã‚¤ãƒ–ラリをãƒã‚§ãƒƒã‚¯ã—ã¦ãŠ
  ã事.関数ãŒå­˜åœ¨ã™ã‚‹æ™‚trueã‚’è¿”ã™ï¼Ž

have_var(var, header) ::

  ヘッダファイルheaderをインクルードã—ã¦å¤‰æ•°varã®å­˜åœ¨ã‚’ãƒã‚§ãƒƒ
  クã™ã‚‹ï¼ŽvarãŒæ¨™æº–ã§ã¯ãƒªãƒ³ã‚¯ã•ã‚Œãªã„ライブラリ内ã®ã‚‚ã®ã§ã‚
  る時ã«ã¯å…ˆã«have_libraryã§ãã®ãƒ©ã‚¤ãƒ–ラリをãƒã‚§ãƒƒã‚¯ã—ã¦ãŠã
  事.変数ãŒå­˜åœ¨ã™ã‚‹æ™‚trueã‚’è¿”ã™ï¼Ž

have_header(header) ::

  ヘッダファイルã®å­˜åœ¨ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼Žãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã™
  る時trueã‚’è¿”ã™ï¼Ž

find_header(header, path...) ::

  ヘッダファイルheaderã®å­˜åœ¨ã‚’ -Ipath を追加ã—ãªãŒã‚‰ãƒã‚§ãƒƒã‚¯
  ã™ã‚‹ï¼Žãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ä»˜ã‹ã£ãŸæ™‚,trueã‚’è¿”ã™ï¼Ž

have_struct_member(type, member[, header[, opt]]) ::

  ヘッダファイルheaderをインクルードã—ã¦åž‹typeã«ãƒ¡ãƒ³ãƒmember
  ãŒå­˜åœ¨ã™ã‚‹ã‹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼ŽtypeãŒå®šç¾©ã•ã‚Œã¦ã„ã¦ï¼Œmemberã‚’
  æŒã¤ã™ã‚‹æ™‚trueã‚’è¿”ã™ï¼Ž

have_type(type, header, opt) ::

  ヘッダファイルheaderをインクルードã—ã¦åž‹typeãŒå­˜åœ¨ã™ã‚‹ã‹ã‚’
  ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼ŽtypeãŒå®šç¾©ã•ã‚Œã¦ã„る時trueã‚’è¿”ã™ï¼Ž

check_sizeof(type, header) ::

  ヘッダファイルheaderをインクルードã—ã¦åž‹typeã®charå˜ä½ã‚µã‚¤
  ズを調ã¹ã‚‹ï¼ŽtypeãŒå®šç¾©ã•ã‚Œã¦ã„る時ãã®ã‚µã‚¤ã‚ºã‚’è¿”ã™ï¼Žå®šç¾©ã•
  ã‚Œã¦ã„ãªã„ã¨ãã¯nilã‚’è¿”ã™ï¼Ž

create_makefile(target[, target_prefix]) ::

  拡張ライブラリ用ã®Makefileを生æˆã™ã‚‹ï¼Žã“ã®é–¢æ•°ã‚’呼ã°ãªã‘ã‚Œ
  ã°ãã®ãƒ©ã‚¤ãƒ–ラリã¯ã‚³ãƒ³ãƒ‘イルã•ã‚Œãªã„.targetã¯ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«å
  を表ã™ï¼Ž

find_executable(command, path) ::

  コマンドcommandã‚’File::PATH_SEPARATORã§åŒºåˆ‡ã‚‰ã‚ŒãŸãƒ‘スåã®
  リストpathã‹ã‚‰æŽ¢ã™ï¼ŽpathãŒnilã¾ãŸã¯çœç•¥ã•ã‚ŒãŸå ´åˆã¯ï¼Œç’°å¢ƒ
  変数PATHã®å€¤ã‚’使用ã™ã‚‹ï¼Žå®Ÿè¡Œå¯èƒ½ãªã‚³ãƒžãƒ³ãƒ‰ãŒè¦‹ã¤ã‹ã£ãŸå ´åˆ
  ã¯ãƒ‘スをå«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«å,見ã¤ã‹ã‚‰ãªã‹ã£ãŸå ´åˆã¯nilã‚’è¿”ã™ï¼Ž

with_config(withval[, default=nil]) ::

  コマンドライン上ã®--with-<withval>ã§æŒ‡å®šã•ã‚ŒãŸã‚ªãƒ—ション値
  を得る.

enable_config(config, *defaults) ::
disable_config(config, *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>-include=/path/include --with-<target>-lib=/path/lib
  ã¨ç­‰ä¾¡ã§ã‚る.追加ã•ã‚ŒãŸ include ディレクトリ㨠lib ディレ
  クトリã®é…列を返ã™ï¼Ž ([include_dir, lib_dir])

pkg_config(pkg) ::

  pkg-configコマンドã‹ã‚‰ãƒ‘ッケージpkgã®æƒ…報を得る.
  pkg-configã®å®Ÿéš›ã®ã‚³ãƒžãƒ³ãƒ‰åã¯ï¼Œ--with-pkg-configコマンド
  ラインオプションã§æŒ‡å®šå¯èƒ½ï¼Ž

/*
 * Local variables:
 * fill-column: 60
 * end:
 */