Changeset 1749
- Timestamp:
- 11/18/07 20:25:38 (14 months ago)
- Files:
-
- 1 modified
-
lang/unlambda/impl/in_python/unlambda.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/unlambda/impl/in_python/unlambda.py
r1689 r1749 1 """ 2 unlambda interpreter 1 """ unlambda interpreter 3 2 4 # doctest 5 >>> p = parse("``skk").eval() # SKK = I 6 >>> p(1) 7 1 8 9 >>> p = parse("`.a.b").eval() 3 # test 4 >>> run("`.ai") 10 5 a 11 6 12 >>> run("`.a`rr") # carriage return 13 <BLANKLINE> 14 a 7 """ 8 globals().clear() 9 # Main loop 10 # 11 def run(s): 12 task = EvalTask(parse(s), FinalCont) 13 try: 14 while True: 15 task = task() 16 except StopIteration, e: 17 return 15 18 16 >>> run("`vv").func_name # blackhole 17 'V0' 18 """ 19 # Continuation 20 # __call__(Func) returns Task 21 def FinalCont(f): 22 def FinalTask(): 23 raise StopIteration 24 return FinalTask 19 25 26 # Task 27 # 28 class Task(object): pass 29 30 def EvalTask(node, cont): 31 def run(): 32 return node.eval(cont) 33 return run 34 35 # Node 36 # 20 37 class Node(object): 21 38 "parsed element" 22 23 class Apply(Node): 24 "apply: `FG = F(G)" 25 def __init__(self, f, g): 26 self.f = f 27 self.g = g 28 def eval(self): 29 f, g = self.f, self.g 30 if f == "(delay)": # special form 31 def Promise0(Y): 32 g.eval() 33 def Promise1(X): 34 return X(Y) 35 return Promise1 36 return Promise0 37 return f.eval()(g.eval()) 39 40 class I(Node): 41 "identity" 42 def eval(self, cont): 43 def I0(X, cont): 44 return cont.invoke(X) 45 return cont(I0) 38 46 39 47 class Dot(Node): … … 41 49 def __init__(self, c): 42 50 self.c = c 43 def eval(self ):44 def Dot0(X ):51 def eval(self, cont): 52 def Dot0(X, cont): 45 53 import sys 46 54 sys.stdout.write(self.c) 47 return X 48 return Dot0 55 return cont(X) 56 return cont(Dot0) 57 58 class Apply(Node): 59 "apply: `FG = F(G)" 60 def __init__(self, X, Y): 61 "take 2 not-evaluated node" 62 self.nX = X 63 self.nY = Y 64 def eval(self, cont): 65 nY = self.nY 66 def next(X): 67 def _App1(): # task 68 "evalated X and not-evaluated Y" 49 69 50 class R(Node): 51 "carriage return: `rX => newline" 52 def eval(self): 53 def R0(X): 54 print 55 return X 56 return R0 70 # if X.isDelay: 71 # return self.cont.invoke(D1Function(self.nY)) 57 72 58 class K(Node): 59 "constant: ``kXY = X" 60 def eval(self): 61 def K0(X): 62 def K1(Y): 63 return X 64 return K1 65 return K0 66 67 class S(Node): 68 "substitution: ```sXYZ = ``XZ`YZ" 69 def eval(self): 70 def S0(X): 71 def S1(Y): 72 def S2(Z): 73 return X(Z)(Y(Z)) 74 return S2 75 return S1 76 return S0 77 78 class I(Node): 79 "identity" 80 def eval(self): 81 def I0(X): 82 return X 83 return I0 84 85 class V(Node): 86 """void: v(x) == v 87 equivalent to ` ``s``s`kskk ``s``s`kskk""" 88 def eval(self): 89 def V0(X): 90 return V0 91 return V0 92 73 def next(Y): 74 def _App2(): # task 75 return X(Y, cont) 76 return _App2 77 return nY.eval(next) 78 return _App1 79 return EvalTask(self.nX, next) 80 93 81 def _parse(iter): 94 82 c = iter.next() 95 83 result = { 84 "i": lambda: I(), 85 ".": lambda: Dot(iter.next()), 96 86 "`": lambda: (lambda f=_parse(iter): Apply(f, _parse(iter)))(), 97 "i": lambda: I(), 98 "s": lambda: S(), 99 "k": lambda: K(), 100 ".": lambda: Dot(iter.next()), 87 101 88 "r": lambda: R(), 102 89 "v": lambda: V(), 103 90 "d": lambda: "(delay)", # special form 91 "c": lambda: C(), 92 "s": lambda: S(), 93 "k": lambda: K(), 104 94 }.get(c, lambda: _parse(iter))() 105 95 return result … … 108 98 return _parse(list(s).__iter__()) 109 99 110 def run(s):111 return parse(s).eval()112 113 100 def _test(): 114 101 import doctest 115 102 reload(doctest) 116 103 doctest.testmod() 104 105 run("`.ai")
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)