Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@dabeaz
Last active January 2, 2023 04:20
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save dabeaz/c331303526825c06b010203b50983b10 to your computer and use it in GitHub Desktop.
Save dabeaz/c331303526825c06b010203b50983b10 to your computer and use it in GitHub Desktop.
Some lambdas
# Author: David Beazley (https://www.dabeaz.com)
# Twitter: @dabeaz
from functools import reduce
run = lambda s: reduce(lambda *_:..., iter(lambda s=[s]:
(_:=s.pop()(),s.append(_))[0], None))
const = lambda v,c : lambda: c(v)
add = lambda x,y,c : lambda: c(x+y)
mul = lambda x,y,c : lambda: c(x*y)
gt = lambda x,y,c : lambda: c(x>y)
display = lambda v,c : lambda: (print(v), c)[1]
cbranch = lambda t,c,a : (a,c)[bool(t)]
branch = lambda c : c
ret = lambda c,r : lambda: c(r)
halt = lambda *_ : None
_ = lambda *t : lambda: t[0]()
fact = lambda n, c: _(
init:= _(
const (1, lambda r0:
const (1, lambda r1:
branch (loop(r0, r1))))
),
loop:= lambda x, result: _(
gt (x, n, lambda r2:
cbranch (r2, exit, body)),
body:= _(
mul (x, result, lambda r3:
const (1, lambda r4:
add (x, r4, lambda r5:
branch (loop(r5, r3)))))
),
exit:= _(
ret (c, result),
),
)
)
run(const (5, lambda r1:
fact (r1, lambda r2:
display (r2,
halt))))
print_n_fact = lambda n, c: _(
init:= _(
const (1, lambda r0:
branch (loop(r0)))
),
loop:= lambda x: _(
gt (x, n, lambda r1:
cbranch (r1, exit, body)),
body := _(
fact (x, lambda r2:
display (r2, lambda:
const (1, lambda r3:
add (x, r3, lambda r4:
branch (loop(r4))))))
)
),
exit:= _(
ret (c, None)
)
)
run(const (10, lambda r1:
print_n_fact (r1,
halt)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment