Skip to content

Instantly share code, notes, and snippets.

@0e4ef622
Last active November 20, 2019 02:42
Show Gist options
  • Select an option

  • Save 0e4ef622/a5b2b92c0c1c72962e9384a8d5a344ce to your computer and use it in GitHub Desktop.

Select an option

Save 0e4ef622/a5b2b92c0c1c72962e9384a8d5a344ce to your computer and use it in GitHub Desktop.
what have you done
from hell import *
y (lambda f: lambda n:
n
(lambda x: lambda x:
f (pred (n)) (lambda x:
and_ (dividesBy (n) (nm(3))) (dividesBy (n) (nm(5)))
(prnts ("FizzBuzz"))
(dividesBy (n) (nm(3))
(prnts ("Fizz"))
(dividesBy (n) (nm(5))
(prnts ("Buzz"))
(prntn (n))))))
(lambda x: ret (None))
(n)) (nm(100)) (lambda x: x)
# Conversion to/from Church numerals
def nm(n):
if n == 0: return lambda f: lambda x: x
else: return lambda f: lambda x: f(nm(n-1)(f)(x))
def unnm(n): return n(lambda x: x+1)(0)
true = lambda a: lambda b: a
false = lambda a: lambda b: b
and_ = lambda a: lambda b: a (b) (a)
or_ = lambda a: lambda b: a (a) (b)
succ = lambda n: lambda f: lambda x: f(n(f)(x))
add = lambda n: lambda m: lambda f: lambda x: n(f)(m(f)(x))
pred = lambda n: lambda f: lambda x: n (lambda g: lambda h: h (g (f)))(lambda u: x)(lambda u: u)
minus = lambda n: lambda m: m (pred) (n)
mul = lambda n: lambda m: lambda f: lambda x: n (m (f)) (x)
add = lambda n: lambda m: lambda f: lambda x: n (f) (m (f) (x))
is_zero = lambda n: n (lambda x: false) (true)
y = lambda f: (lambda x: x (x))(lambda x: f (lambda v: x (x) (v)))
# List with Scott's encoding
nil = lambda n: lambda c: n
cons = lambda h: lambda t: lambda n: lambda c: c (h) (t)
head = lambda l: l (nil) (lambda h: lambda t: h)
tail = lambda l: l (nil) (lambda h: lambda t: t)
map = lambda F: lambda l: y (lambda f: lambda l: l (lambda x: nil) (lambda h: lambda t: lambda x: cons (F (h)) (f (t))) (l)) (l)
# Conversion for lists containing numbers
def lsn(l):
if len(l) == 0: return nil
else: return cons(nm(l[0]))(lsn(l[1:]))
def unlsn(l): return l([])(lambda h: lambda t: [unnm(h)] + unlsn(t))
dividesBy = (lambda n: lambda d:
y (lambda f: lambda n:
is_zero (n)
(lambda x: false)
(and_ (is_zero (minus (n) (d))) (is_zero (minus (d) (n)))
(lambda x: true)
(lambda x: f (minus (n) (d))))
(n))
(n))
prntn = lambda n: lambda f: f (print(unnm(n)))
prnts = lambda s: lambda f: f (print(s))
inp = lambda s: lambda f: f (input(s))
ret = lambda a: lambda f: f (a)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment