Quick Lambdas¶
from macropy.quick_lambda import macros, f, _
print(map(f[_ + 1], [1, 2, 3])) # [2, 3, 4]
print(reduce(f[_ * _], [1, 2, 3])) # 6
Macropy provides a syntax for lambda expressions similar to Scala’s anonymous functions. Essentially, the transformation is:
f[_ * _] -> lambda a, b: a * b
where the underscores get replaced by identifiers, which are then set
to be the parameters of the enclosing lambda
. This works too:
print(map(f[_.split(' ')[0]], ["i am cow", "hear me moo"]))
# ['i', 'hear']
Quick Lambdas can be also used as a concise, lightweight,
more-readable substitute for functools.partial
from macropy.quick_lambda import macros, f
basetwo = f[int(_, base=2)]
print(basetwo('10010')) # 18
is equivalent to
import functools
basetwo = functools.partial(int, base=2)
print(basetwo('10010')) # 18
Quick Lambdas can also be used entirely without the _
placeholders,
in which case they wrap the target in a no argument lambda: ...
thunk:
from random import random
thunk = f[random() * 2 + 3]
print(thunk()) # 4.522011062548173
print(thunk()) # 4.894243231792029
This cuts out reduces the number of characters needed to make a thunk
from 7 (using lambda
) to 2, making it much easier to use thunks to
do things like emulating by name parameters. The implementation of
quicklambda is about 30 lines of code, and is worth a look if you want to see how
a simple (but extremely useful!) macro can be written.