frame := { _proto: ftame, _parent: fpame, msg1: func() foo:=11, msg2: func() self.foo:=12, msg3: func() SetVariable(self,'foo,13), msg4: func() bar:=24, msg5: func() self.bar:=25, msg6: func() SetVariable(self,'bar,26)}; ftame := { bar: 20 }; fpame := { foo: 10 }; fcame := { _parent: frame };という状態で、次のようなことが起ります。
fcame:msg1() --> fpame の foo を 11 に変更 fcame:msg2() --> fcame に foo: 12 を新設(self、すなわちレシーバに新設) RemoveSlot(fcame,'foo); fcame:msg3() --> fpame の foo を 13 に変更 fcame:msg4() --> frame に bar: 24 を新設(_proto のスロットは書き換えられないのでその手前に新設) RemoveSlot(frame,'bar) fcame:msg5() --> fcame に bar: 25 を新設(self、すなわちレシーバに新設) RemoveSlot(fcame,'bar); fcame:msg6() --> frame に bar: 26 を新設(_proto のスロットは書き換えられないのでその手前に新設) RemoveSlot(frame,'bar)あと、NewtonScript に限っては戯さんのトリッキーな話も当たっているような印象をうけました and 私の Call With 構文に関する記述は間違っていました。まず、メソッド、つまり関数オブジェクトは独自の self スロットを持っていて、自分が生成されたときの self の状態を保持しています(つまり、Self と違い、NewtonScript の関数オブジェクトの self スロットはプロトタイプスロットではない定数スロットのような振る舞いをする)。通常の起動方法では、この self スロットを参照するとレシーバが返ります(戯さんのトリックが使われているかもしれません)。
このページを編集 (17444 bytes)
以下の 2 ページから参照されています。 |
This page has been visited 7322 times.