Skip to content

Instantly share code, notes, and snippets.

@yingtai
Created January 29, 2012 12:52
Show Gist options
  • Save yingtai/1698686 to your computer and use it in GitHub Desktop.
Save yingtai/1698686 to your computer and use it in GitHub Desktop.
Lazy K interpreter (incomplete)
def exprs(name): # return lambda expression
if name == 'S':
return (lambda x: lambda y: lambda z: x(z)(y(z)))
elif name == 'K':
return (lambda x: lambda y: x)
elif name == 'I':
return (lambda x: x)
elif name == 'cons':
return (lambda s: lambda b: lambda f: f(s(b)))
elif name == 'car':
return (lambda p: p(lambda x: lambda y: x))
elif name == 'cdr':
return (lambda p: p(lambda x: lambda y: y))
elif name == 'false':
return (lambda x: lambda y: y)
elif name == 'succ':
return (lambda n: lambda f: lambda x: f(n(f)(x)))
elif name == 'zero':
return (lambda f: lambda x: x)
def ev(code): #eval
itr = iter(code)
f = exprs('I')
char = ''
while True:
try:
char = itr.next()
if char in 'SKI':
f = f(exprs(char))
elif char == '(':
tmp = ''; x = ''
while x != ')':
tmp += x
x = itr.next()
g = ev(tmp)
f = f(g)
except StopIteration:
break
return f
def char2church(char):
n = ord(char)
church = exprs('zero')
succ = exprs('succ')
for i in range(n):
church = succ(church)
return church
def church2char(church):
n = 0
n = church(lambda x: x+1)(n) # \f.\x.f(f x) -> +1(+1 0)
return chr(n)
if __name__ == '__main__':
import sys
path = sys.argv[1]
with open(path) as sf:
code = sf.read()
f = ev(code)
cons = exprs('cons')
car = exprs('car')
cdr = exprs('cdr')
g = exprs('false')
for i in reversed(raw_input()):
ch = char2church(i)
g = cons(ch)(g) # make a list
def _check(f):
try:
return f(True)(False)
except TypeError:
return True
out = ""
while _check(f):
h = car(g)
g = cdr(g)
out += church2char(h)
print out
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment