Context Self Lookup (last-mod: 2010-06-29)

ver0.6よりローカルコンテキストに並列に定義されたメソッド同士が呼び合う場合、selfを使う必要がありますが、ver0.6.2よりContextがcallされた際にselfも探索対象になったため、context callは書き換える必要はありません。ver0.6.3よりcallだけでなくsetとgetも対象になりましたので、それなりに見た目どおり(lexical)に動作します。*_safeは対象外です。get_or_def等も実質はget_safe_or_defなので対象外です。ver0.6.5より、*_safeも対象になりました。Object.get_safe_self_unawareが旧来のget_safeで、get_safe_self_awareが新しいget_safeです。

  m1: `[m2]
  m2: `[m1$]
  m1 //旧バージョンと0.6.3以降ではm1が帰るが、0.6.1はm2が見つからないとしてエラー、0.6.2はcontext call時self省略によりm2は見つかるものの、m1$はcontext callでは無いのでエラー

  m1: `[caller.m2]
  m2: `[caller.m1$]
  m1 //caller.m2は呼べるが、m2のcallerはm1のコンテキストであるため、caller.m1$に失敗する

  m1: `[self.m2]
  m2: `[self.m1$]
  m1 //selfがローカルコンテキストになるので問題なくm1が帰る

高階関数として使うときにclosureかdelegateが必要になる場合があります。call/invokeとclosure/delegateの組み合わせにおいて、より汎用的にするため、selfは明示しない方が賢明です。

  //call and implicit-self
  m1: `f[f]
  m2: `['success']
  m3: `[m2]
  m1(m3$) //0.6ではm2が見つからない
  m1(m3$.closure) //全てでsuccess
  m1(delegate(:m3)) //0.6.1ではm2が見つからない

  //call and self
  m3@ `[self.m2]
  m1(m3$.closure) //0.6ではm2が見つからない; このcontextのselfに依存する
  m1(delegate(:m3)) //全てでsuccess

  //invoke and self
  m1@ `f[f$.invoke]
  m1(m3$.closure) //0.6ではm2が見つからない; このcontextのselfに依存する
  m1(delegate(:m3)) //全てでsuccess

  //invoke and implicit-self
  m3@ `[m2]
  m1(m3$.closure) //全てでsuccess
  m1(delegate(:m3)) //全てでsuccess