【メソッドをより便利に】通常、 メソッドでは受信オブジェクト(receiving object)に頻繁にアクセスします。
メソッドをプレーンなコロン定義(:noname
など)として定義する場合、 多くのスタック体操が必要になる場合があります。
これを回避するには、 m: ... ;m
を使用してメソッドを定義します。たとえば、 以下を使用して circle
を
draw
するメソッドを定義できます
m: ( x y circle -- ) ( x y ) this circle-radius @ draw-circle ;m
このメソッドが実行されるときは、 受信オブジェクト(receiver object)(上記例の circle)がスタックから取り除かれます。
その代わりに、 m: 〜 ;m の間は this
を使用して受信オブジェクトにアクセスできます(ええ、 確かに、この例では
m: ... ;m
を使用する利点ないかもしれませんね)。 注意: しかし、 スタック・コメントとしては m:
と
;m
の間のコードだけでなく、 メソッド全体(つまり、
受信オブジェクトを含むメソッド全体)のスタック効果を指定していることに注意してください。 なお、 m:...;m
では
exit
を使用できません。 代わりに、 exitm
を使用してください32。
あなたは this "field"
という形式のシーケンスを頻繁に使用するハメになると思います(上記例では: this
circle-radius
)。 そこで、 この方法でのみフィールドを使用する場合は、 inst-var
を使用してフィールドを定義し、
フィールド名の前の this
を削れます。 たとえば、 上記例の circle
クラスは以下のように定義することもできます:
graphical class cell% inst-var radius m: ( x y circle -- ) radius @ draw-circle ;m overrides draw m: ( n-radius circle -- ) radius ! ;m overrides construct end-class circle
radius
は、 circle
や、 その子孫クラスと、 それらの m:...;m
内でのみ使用できます。
inst-value
を使用してフィールドを定義することもできます。 これは、 variable
に対して
value
があるのと同様に、 inst-var
に対して inst-value
があるのです。
このようなフィールドの値は [to-inst]
を使用して変更できます。 たとえば、 クラス circle
を以下のように定義することもできます:
graphical class inst-value radius m: ( x y circle -- ) radius draw-circle ;m overrides draw m: ( n-radius circle -- ) [to-inst] radius ;m overrides construct end-class circle
さらに、
catch
を呼び出すワードや、 objects.fs
をロードする前に定義されているワードについては、
catch
を再定義したように、 これらも再定義する必要があります: : catch this >r catch r>
to-this ;