Show
Ignore:
Timestamp:
11/19/07 01:38:11 (6 years ago)
Author:
nishio
Message:

lang/unlambda/impl/in_python: prettify

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/unlambda/impl/in_python/unlambda_lambda.py

    r1763 r1764  
    2222a 
    2323""" 
     24import sys 
     25 
    2426# Main loop 
    2527# 
     
    3335 
    3436# Continuation 
    35 # __call__(Func) returns Task 
    36 def FinalCont(f): 
    37     return FinalTask 
     37FinalCont = lambda f:FinalTask 
    3838 
    3939# Task 
     
    4343    raise StopIteration() 
    4444 
    45 def EvalTask(node, cont): 
    46     def run(): 
    47         if Debug.show_node: print node 
    48         return node(cont) 
    49     return run 
    50  
    51 def ApplyTask(operator, operand, cont): 
    52     def run(): 
    53         return operator(operand, cont) 
    54     return run 
     45EvalTask = lambda node,c:lambda:node(c) 
     46ApplyTask = lambda X,Y,c:lambda:X(Y,c) 
    5547 
    5648# Node 
    5749# 
    58 class Node(object): 
    59     "parsed element" 
    60  
    61 I = lambda: lambda c: c(lambda X, c: c(X)) 
    62  
    63 import sys 
     50I = lambda: lambda c:c(lambda X,c:c(X)) 
    6451Dot = lambda char: (lambda c: c(lambda X, c: sys.stdout.write(char) or c(X))) 
    65  
    66 Apply = lambda nX,nY:\ 
    67     lambda c:\ 
    68         EvalTask(nX, 
    69             lambda X:\ 
    70                 lambda:\ 
    71                     (X == D_)and( 
    72                         c(lambda Y,c:nY(lambda X:c(lambda X,c:X(Y,c)))) 
    73                     )or( 
    74                         nY(lambda Y: lambda :X(Y, c)) 
    75                     ) 
    76  
    77             ) 
    78  
     52Apply = lambda nX,nY:lambda c:\ 
     53    EvalTask(nX, lambda X:\ 
     54        lambda:\ 
     55            (X == D_)and( 
     56                c(lambda Y,c:nY(lambda X:c(lambda X,c:X(Y,c)))) 
     57            )or( 
     58                nY(lambda Y: lambda :X(Y, c)))) 
    7959D_ = lambda c:c(D_) 
    8060D = lambda :D_ 
    81  
    8261C = lambda :lambda c:c(lambda Y,c: lambda :Y(lambda F,c_:c(F),c)) 
    83  
    8462V0 = lambda X,c:c(V0) 
    8563V = lambda:lambda c:c(V0) 
    86  
    8764K = lambda:lambda c:c(lambda X,c:c(lambda Y,c:c(X))) 
    88  
    8965S = lambda:lambda c:c( 
    9066        lambda X,c:c( 
     
    9975                            Func2Node(Z))), c)))) 
    10076 
    101 class Func2Node(Node): 
    102     def __str__(self): return "%s" % self.f.func_name 
    103     def __init__(self, f): 
    104         self.f = f 
    105     def __call__(self, cont): 
    106         return cont(self.f) 
     77Func2Node = lambda f: lambda c:c(f) 
    10778 
    108 class At(Node): 
    109     def __str__(self): return "At" 
    110     def __call__(self, cont): 
    111         def At0(X, cont): 
    112             import sys 
    113             try: 
    114                 #At.c = sys.stdin.read(1) 
    115                 At.c = raw_input(">>> ")[0] 
    116                 switch = I() 
    117             except: 
    118                 switch = V() 
    119  
    120             return EvalTask( 
    121                     Apply( 
    122                         Func2Node(X), 
    123                         switch), 
    124                     cont) 
    125         return cont(At0) 
    126              
    127 class Qu(Node): 
    128     def __str__(self): return "(? %r)" % self.c 
    129     def __init__(self, c): 
    130         self.c = c 
    131  
    132     def __call__(self, cont): 
    133         def Qu0(X, cont): 
    134             if At.c == self.c: 
    135                 switch = I() 
    136             else: 
    137                 switch = V() 
    138  
    139             return EvalTask(Apply(Func2Node(X), switch), cont) 
    140         return cont(Qu0) 
    141  
    142 class Pipe(Node): 
    143     def __call__(self, cont): 
    144         def Pipe0(X, cont): 
    145             if At.c != -1: 
    146                 switch = Dot(At.c) 
    147             else: 
    148                 switch = V() 
    149  
    150             return ApplyTask(X, switch, cont) 
    151         return Pipe0 
    152  
    153 class E(Node): 
    154     def __call__(self, cont): 
    155         def E0(X, cont): 
    156             return FinalTask(X) 
    157         return E0 
    158      
    15979def _parse(iter): 
    160     c = iter.next() 
    161     result = { 
     80    return { 
    16281        "i": lambda: I(), 
    16382        ".": lambda: Dot(iter.next()), 
     
    16988        "s": lambda: S(), 
    17089        "k": lambda: K(), 
    171         "@": lambda: At(), 
    172         "?": lambda: Qu(iter.next()), 
    173         "|": lambda: Pipe(), 
    174         "e": lambda: E(), 
    175     }.get(c, lambda: _parse(iter))() 
    176     return result 
     90    }.get(iter.next(), lambda: _parse(iter))() 
    17791 
    17892def parse(s): 
    17993    return _parse(list(s).__iter__()) 
    180  
    181 class Debug(): 
    182     show_node = False 
    18394 
    18495def _test(): 
     
    196107      """) 
    197108 
    198 #Debug.show_node = True 
    199 #run("`````@?a.oi.kv") 
    200