cky-matrix-element
クラスの実現cky-matrix-element
を実現することを考える. こ
こでの記述は一人の生産者がデータを生成し, それを全ての消費者に渡すため
のテンプレートになっている.
これを実現するもっとも無駄のない方法は, ABCL/fのfirst class reply box の機能を使って, 「ある条件が満たされるまで返事を返さない」様なmethodを 書くことである. 具体的には以下のようにする.
(defmethod! cky-matrix-element sync-get! (i j) :reply-to r (declare (fixnum i j) (reply-type (list fixnum))) (if present (become (reply val r)) (become unit :waitors (cons r waitors))))まず最初の,
:reply-to r
は, このmethodが起動された時に受けとった,
reply boxを表していて, その型は, (list fixnum)
を返すmethodの場
合, (future (list fixnum))
となる. 呼出側が普通に,
(sync-get! x i j)のように
sync-get!
を起動した場合, r
に渡されれるものは, 新
しい空のreply boxである. Methodの本体では, present
が真の場合,
r
にvalue
を返している. これによって呼出側はすぐさま
value
を呼び出しの返り値として受けとる. 一方present
が偽の
場合, それはwaitors
というlistにつながれ, このmethod内では返事は
返されない. これによって呼出側はしばらくの間待ち続けることになる. 後か
ら, sync-put!
によって返事が供給された時に, 以下のように返事が返
される.
(defmethod! cky-matrix-element sync-put! (v i j) (declare ((list fixnum) v) (fixnum i j) (reply-type unit)) (become (dolist (r waitors) (reply v r))) :present true :val v :waitors '())Mitsubishi Research Institute,Inc.