Pythonでboost::lambda

つくった。

>>> map(_1 + 1, [1, 2, 3])
[2, 3, 4]
>>> map(_1 + _2, [1, 2, 3], [4, 5, 6])
[5, 7, 9]

いや、Pythonにはリスト内包表記があるからいらないんだけどさ、boost::lambdaのbinder?のような物を使えば「lambdaの中で代入使わせろ!!1!」という鬱屈した気持ちが癒されるのではないかと思って。

まだbinderとかはC++の側がどういう実装をしているか確認していないので作っていない。とりあえず冒頭に書いたような式が動くようにだけしておいた。

class Expr(object):
    def __add__(self, v):
        if not isinstance(v, Expr):
            v = Const(v)
        return Add(self, v)

class Const(Expr):
    "constant"
    def __init__(self, v):
        self.v = v

    def __call__(self, *args):
        return self.v

    def __repr__(self):
        return repr(self.v)

class Add(Expr):
    def __init__(self, lhs, rhs):
        self.lhs = lhs
        self.rhs = rhs

    def __call__(self, *args):
        return self.lhs(*args) + self.rhs(*args)

    def __repr__(self):
        return "%r + %r" % (self.lhs, self.rhs)

class Arg(Expr):
    def __init__(self, id):
        self.id = id

    def __call__(self, *args):
        return args[self.id]

    def __repr__(self):
        return "_%d" % (self.id + 1)

        
_1 = Arg(0)
_2 = Arg(1)