Changeset 1757
- Timestamp:
- 11/19/07 00:40:32 (14 months ago)
- Files:
-
- 1 modified
-
lang/unlambda/impl/in_python/unlambda.py (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/unlambda/impl/in_python/unlambda.py
r1754 r1757 41 41 # __call__(Func) returns Task 42 42 def FinalCont(f): 43 def FinalTask():44 raise StopIteration45 43 return FinalTask 46 44 47 45 # Task 48 46 # 49 class Task(object): pass 47 48 def FinalTask(X=None): 49 raise StopIteration() 50 50 51 51 def EvalTask(node, cont): … … 55 55 return run 56 56 57 def ApplyTask(operator, operand, cont): 58 def run(): 59 return operator(operand, cont) 60 return run 61 57 62 # Node 58 63 # … … 61 66 62 67 class I(Node): 63 "identity "68 "identity: `iX = X" 64 69 def __str__(self): 65 70 return "I" … … 107 112 def next(Y): 108 113 def _App2(): # task 114 "evaluated X and Y" 109 115 return X(Y, cont) 110 116 return _App2 … … 119 125 def eval(self, cont): 120 126 return cont(self) 121 def __call__(self, Y, cont): 122 raise NotImplemented 127 123 128 124 129 class C(Node): … … 138 143 139 144 class V(Node): 140 "void" 145 """void: v(x) == v 146 equivalent to ` ``s``s`kskk ``s``s`kskk""" 141 147 def __str__(self): 142 148 return "V" … … 174 180 175 181 class Func2Node(Node): 182 def __str__(self): return "%s" % self.f.func_name 176 183 def __init__(self, f): 177 184 self.f = f 178 185 def eval(self, cont): 179 186 return cont(self.f) 187 188 class At(Node): 189 def __str__(self): return "At" 190 def eval(self, cont): 191 def At0(X, cont): 192 import sys 193 try: 194 #At.c = sys.stdin.read(1) 195 At.c = raw_input(">>> ")[0] 196 switch = I() 197 except: 198 switch = V() 199 200 return EvalTask( 201 Apply( 202 Func2Node(X), 203 switch), 204 cont) 205 return cont(At0) 206 207 class Qu(Node): 208 def __str__(self): return "(? %r)" % self.c 209 def __init__(self, c): 210 self.c = c 211 212 def eval(self, cont): 213 def Qu0(X, cont): 214 if At.c == self.c: 215 switch = I() 216 else: 217 switch = V() 218 219 return EvalTask(Apply(Func2Node(X), switch), cont) 220 return cont(Qu0) 221 222 class Pipe(Node): 223 def eval(self, cont): 224 def Pipe0(X, cont): 225 if At.c != -1: 226 switch = Dot(At.c) 227 else: 228 switch = V() 229 230 return ApplyTask(X, switch, cont) 231 return Pipe0 232 233 class E(Node): 234 def eval(self, cont): 235 def E0(X, cont): 236 return FinalTask(X) 237 return E0 180 238 181 239 def _parse(iter): … … 191 249 "s": lambda: S(), 192 250 "k": lambda: K(), 251 "@": lambda: At(), 252 "?": lambda: Qu(iter.next()), 253 "|": lambda: Pipe(), 254 "e": lambda: E(), 193 255 }.get(c, lambda: _parse(iter))() 194 256 return result … … 213 275 `k``s`ksk 214 276 """) 277 278 #Debug.show_node = True 279 #run("`````@?a.oi.kv") 280
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)