2008年2月24日

RuleDispatch


名前だけは知っていたけど、いまいち情報が少なくてどんなものか分からなかったRuleDispatch。
developerWorksに解説記事があったのでメモ。


Charming Python: Scaling a new PEAK


呼び出し時の引数パターンで、複数の実装に振り分けるもののようです。
引数の型で振り分けるだけなら、JavaとかC++のオーバーロードがあるけど、HaskellやOCamlよりのパターンマッチングができる。




ジェネリックファンクションの例

import dispatch
@dispatch.generic()
def doIt(foo, other):
"Base generic function of 'doIt()'"
@doIt.when("isinstance(foo,int) and isinstance(other,str)")
def doIt(foo, other):
print "foo is an unrestricted int |", foo, other
@doIt.when("isinstance(foo,str) and isinstance(other,int)")
def doIt(foo, other):
print "foo is str, other an int |", foo, other
@doIt.when("isinstance(foo,int) and 3<=foo<=17 and isinstance(other,str)")
def doIt(foo, other):
print "foo is between 3 and 17 |", foo, other
@doIt.when("isinstance(foo,int) and 0<=foo<=1000 and isinstance(other,str)")
def doIt(foo, other):
print "foo is between 0 and 1000 |", foo, other



ルール部分に、条件式まで書けてしまうのですねい\(^o^)/
条件式が文字列というのは気分的につらいのだけど、
Python3000では、引数に注釈(Pythonオブジェクトならなんでもいいらしい)をつけられるとのことで、もっとスマートに書けるのを期待。