関数にコードブロックを渡す

PythonRubyのようにコードブロックを渡すやり方。デコレータを利用する。

>>> def each(L):
...     def each_(func):
...         for x in L:
...             func(x)
...     return each_
...
>>> L = range(10)
>>>
>>> @each(L)
... def pr(x):
...     print '<', x, '>'
...
< 0 >
< 1 >
< 2 >
< 3 >
< 4 >
< 5 >
< 6 >
< 7 >
< 8 >
< 9 >
>>>
>>> def map(L):
...     L2 = []
...     def map_(func):
...         for x in L:
...             L2.append(func(x))
...         return L2
...     return map_
...
>>> @map(L)
... def dbl(x):
...     return x*2
...
>>> dbl
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

戻り値がある場合は関数オブジェクトの変数(この例の場合dbl変数)に戻されるのでその部分は分かりずらいが、構文は結構似ている。もちろんリソース管理もwithを使用しなくても可能。


Perl6やSchemeのように(?)シンタックスシュガーを作れれば、Rubyのコードブロックと同様な構文で実現できるかもしれない。C++ではどこまでRubyと構文上や機能上似させることができるのだろう?