Changeset 1757 for lang/unlambda/impl

Show
Ignore:
Timestamp:
11/19/07 00:40:32 (6 years ago)
Author:
nishio
Message:

lang/unlambda/impl/in_python: support all function in Unlambda2.0

Files:
1 modified

Legend:

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

    r1754 r1757  
    4141# __call__(Func) returns Task 
    4242def FinalCont(f): 
    43     def FinalTask(): 
    44         raise StopIteration 
    4543    return FinalTask 
    4644 
    4745# Task 
    4846# 
    49 class Task(object): pass 
     47 
     48def FinalTask(X=None): 
     49    raise StopIteration() 
    5050 
    5151def EvalTask(node, cont): 
     
    5555    return run 
    5656 
     57def ApplyTask(operator, operand, cont): 
     58    def run(): 
     59        return operator(operand, cont) 
     60    return run 
     61 
    5762# Node 
    5863# 
     
    6166 
    6267class I(Node): 
    63     "identity" 
     68    "identity: `iX = X" 
    6469    def __str__(self): 
    6570        return "I" 
     
    107112                def next(Y): 
    108113                    def _App2(): # task 
     114                        "evaluated X and Y" 
    109115                        return X(Y, cont) 
    110116                    return _App2 
     
    119125    def eval(self, cont): 
    120126        return cont(self) 
    121     def __call__(self, Y, cont): 
    122         raise NotImplemented 
     127     
    123128 
    124129class C(Node): 
     
    138143 
    139144class V(Node): 
    140     "void" 
     145    """void: v(x) == v 
     146    equivalent to ` ``s``s`kskk ``s``s`kskk""" 
    141147    def __str__(self): 
    142148        return "V" 
     
    174180 
    175181class Func2Node(Node): 
     182    def __str__(self): return "%s" % self.f.func_name 
    176183    def __init__(self, f): 
    177184        self.f = f 
    178185    def eval(self, cont): 
    179186        return cont(self.f) 
     187 
     188class 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             
     207class 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 
     222class 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 
     233class E(Node): 
     234    def eval(self, cont): 
     235        def E0(X, cont): 
     236            return FinalTask(X) 
     237        return E0 
    180238     
    181239def _parse(iter): 
     
    191249        "s": lambda: S(), 
    192250        "k": lambda: K(), 
     251        "@": lambda: At(), 
     252        "?": lambda: Qu(iter.next()), 
     253        "|": lambda: Pipe(), 
     254        "e": lambda: E(), 
    193255    }.get(c, lambda: _parse(iter))() 
    194256    return result 
     
    213275      `k``s`ksk 
    214276      """) 
     277 
     278#Debug.show_node = True 
     279#run("`````@?a.oi.kv") 
     280