事例: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; 
}

*1:《注意》実際の iterate は、OCL_Collection で定義しています。

*2:《参考文献》OCL 2.0/7.6.5 Iterate Operation