Next: Up: Previous:

状態を更新する

 

オブジェクトの状態の更新は, 式全体の結果とともに, 全ての更新されるスロットに ついて新しい値を明示する become コンストラクトに よって表現される. 我々の become は結果の値を明示し, 状態変数のみの変更を許しているという点において Actor [1] のそれとは異なる. このコンストラクトはもともとfinallyコンストラクトという 名前で Aridor [2] によって提案された. 例えば, 次のメソッドは x と y をそれぞれ dx と dy でインクリメントする.

(defmethod point move! (dx dy)
  (become (redraw! self) :x (+ x dx) :y (+ y dy)))
become の最初の引数は become の結果式と 呼ばれ, become が評価後どのような値をとるかを明示する. 残りの部分はインスタンス変数が更新される値である.

Become はメソッドのボディのすべての場所に存在することはできない. become はメソッドボディの末尾にのみ現れてよい. メソッドボディの末尾とは末尾関数呼び出しが置かれる場所である. 例えば,

(defmethod class method (...)
  (if ...
      (become ...)
      (become ...)))
と
(defmethod class method (...)
  (let ((x ...))
    ...
    (become ...))),
は許される. なぜならこれらの become は, もし 関数呼び出しで置き換えられたならば, 末尾呼びだしであるからである. 一方, 我々は
(defmethod class method (...)
  (+ (become ...) 10)).
は拒絶する. この制限によって, becomeがメソッド起動の中で 高々一回しか行なわれないことを保証する. 文法的な制限の 正確な定義はここでは与えられない. それは各文法と組み込みの マクロに対して正確な場所を定義している.



Mitsubishi Research Institute,Inc.
Mon Feb 24 19:24:01 JST 1997