ABCL/f は次の二つの方法で伝統的な排他制御モデルを洗練している.
move!
メソッド
(defmethod point move! (dx dy) (become (redraw! self) :x (+ x dx) :y (+ y dy)))では, 前処理は
(+ x dx)
と (+ y dy)
を
評価することと, インスタンス変数の更新からなる.
後段階は自分に対して redraw!
メソッドを起動する.
我々の緩められた排他制御規則は, 起動の前段階は他の起動の
前段階とオーバーラップできない, しかし後段階は他の前段階および
後段階とオーバーラップできるというものである. ゆえに,
この例は, 自分への呼び出しをしているにもかかわらずデッドロックしない.
(defmethod cell current-value () value) (defmethod cell step! () (let ((lv (current-value left)) (rv (current-value right))) (become #t :new-value (/ (- (+ lv rv) (* 2 value)) 2))))current-value はボディ中で become を使用しないので, 読みだし専用メソッドである. それゆえに, 各セル オブジェクトに
step!
メソッドを並列に起動することは
決してデッドロックをひき起こさない.
1 (defmethod! bintree-node insert! (k val) 2 (cond ((< k key) 3 (if left 4 (become (insert! left k val)) 5 (become #t :left (make-leaf-bintree-node k val))) 6 ((= k key) 7 (format #t "Warning conflicting key (‾s ‾s)‾¥%" key value) 8 (become #f)) 9 (else 10 (if right 11 (become (insert! right k val)) 12 (become #t :right (make-leaf-bintree-node k val))))))) 図2.2: Insert Method in ABCL/f
二番目の規則は書き込みメソッドは自分の終了よりも早く
オブジェクトにつけられた mutex を解放することができる
ことを言っている.
2.2.3 (2)節の二分木の例は, ノードオブジェクトは
子オブジェクトを呼び出すことを決めるとすぐにひき続く
メソッドを受け入れることができるので,
複数の insert!
が一つの木に並列に動作することを許している.
これは ABCL/f では図2.2のように記述される.
ABCL/f と, assignment によって変数を変更するより伝統的な文法 との文法的な差異は, ABCL/f では, 更新は become コンストラクトに よって行なわれ, 再帰呼び出しはその become の結果式として書かれる ということである. 再帰呼び出しを結果式の中に入れることによって( 5 行目, 12 行目), そのプロセスが再帰呼び出しをする直前にそのノードは アンロックされる.