事例:Collection.iterate
OCL で規定された iterate 操作 *1 に準拠した機能を実現します。
class OCL_Sequence: def __init__(self, items): self.items = items def iterate(self, f, acc): for e in self.items: acc = apply(f, (e, acc)) return acc >>> OCL_Sequence(range(10)).iterate(lambda e, acc: acc+e, 0) 45 >>> OCL_Sequence("ABC").iterate(lambda e, acc: e+acc, "") CBA
OCL_Sequence をラッパーと見なすと、Python に組み込みのシーケンスに対するメソッドとして、任意の反復処理を記述できます。inject:into:/Smalltalk のような汎用性はありませんが、軽微な問題解決を図りたいときには重宝します。
《Note》OCL では、iterate 操作 *2 の動作を(疑似コードを使って)次のように規定しています。
iterate(elem: T; acc: T2 = value) { acc = value; for (Enumeration e = collection.elements(); e.hasMoreElements(); ){ elem = e.nextElement(); acc =} return acc; }
□