IS_A
ひら終了してレビューの依頼が。
こんなソレは見たことないな、と言いつつ R5RS 見たら無い。ええと IS_A のコンテンツには、Gauche ユーザリファレンスの is-a? へのリンクがある。
これを見つつ gosh で確認。
gosh> is-a? #<subr is-a?> gosh> (define a (list 1 2 3)) a gosh> (is-a? a <list>) #t gosh> <list> #<class <list>> gosh>
むーん。IS_A 難解。knishii2156 さんよく掘ったなぁ。
ってか
よく考えたら自分でざくざく掘らんでも_ひら_で掘ったナニを見つつソースを追い掛ければ良いコトに気づく。あるいはレビューも全部理解してないとデキない、というソレではなくって、勉強しながら、なアレを意識してるんだろうか、という事に思い当ってたりするんですが、それは考え杉かも (を
で
とりあえず ScmClassRec 構造体の redefined な属性に付いてるコメントが以下。
ScmObj redefined; /* if this class is obsoleted by class redefinition, points to the new class. if this class is being redefined, points to a thread that is handling the redefinition. (it won't be seen by Scheme; see class.c) otherwise #f */
とほほ。今から掘ったソレをチェックしつつ再度ソース確認します。
難解
とは言え難解なのはこのケイス
/* be careful to handle class redifinition case */ if (!SCM_FALSEP(Scm_ClassOf(obj)->redefined)) { CHECK_STACK(CONT_FRAME_SIZE); PUSH_CONT(PC); PC = PC_TO_RETURN; VAL0 = Scm_VMIsA(obj, c); } else {
で、件の Scm_VMIsA() な関数定義なコメントが以下
/* * (is-a? obj class) * - if obj's class is redefined, first updates obj. */
obj のクラスが再定義されてたら、まず obj をアプデイト、と。これはココにも同様の記述がありますな。
obj のクラスが再定義されてしまうと、これらの手続きは、最初に obj のクラスを新しいクラスに再定義します。
よく見りゃそのまんまだな。(を
微妙
class.c にヒミツがありそげ、なのですが限界ッス。