Pythonで複数行lambda

Pythonでのlambdaの構文自体は中途の改行を許さないけど、括弧でくくれば途中ではインデントも改行ありなしも関係なくなる:

print (lambda x:
  x + x) (10) #=> 20

そう考えると、PythonでもいわゆるDSL風なことも結構できるんじゃないだろうかと思う。

たとえば、以下のような関数を用意すると:

def let(val, func): 
  return func(val)

def rec(fun):
    def recfun(*args):
        return fun(recfun)(*args)
    return recfun


これによって以下のような式も書けたりもする:

print let(10, lambda x:
      let(x * 2, lambda y:
          x + y)) # => 30

print let(rec(lambda fact:
              (lambda n: n == 0 and 1 or n*fact(n-1))), lambda fact:
          fact(10)) #=> 3628800

(Haskell Monad風な命名ならbind/mfixてとこか)