Changeset 1749 for lang/unlambda

Show
Ignore:
Timestamp:
11/18/07 20:25:38 (12 months ago)
Author:
nishio
Message:

lang/unlambda/impl/in_python: brandnew version to support call/cc[c], currently supports [`.xi]

Files:
1 modified

Legend:

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

    r1689 r1749  
    1 """ 
    2 unlambda interpreter 
     1""" unlambda interpreter 
    32 
    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") 
    105a 
    116 
    12 >>> run("`.a`rr") # carriage return 
    13 <BLANKLINE> 
    14 a 
     7""" 
     8globals().clear() 
     9# Main loop 
     10# 
     11def run(s): 
     12    task = EvalTask(parse(s), FinalCont) 
     13    try: 
     14        while True: 
     15            task = task() 
     16    except StopIteration, e: 
     17        return 
    1518 
    16 >>> run("`vv").func_name # blackhole 
    17 'V0' 
    18 """ 
     19# Continuation 
     20# __call__(Func) returns Task 
     21def FinalCont(f): 
     22    def FinalTask(): 
     23        raise StopIteration 
     24    return FinalTask 
    1925 
     26# Task 
     27# 
     28class Task(object): pass 
     29 
     30def EvalTask(node, cont): 
     31    def run(): 
     32        return node.eval(cont) 
     33    return run 
     34 
     35# Node 
     36# 
    2037class Node(object): 
    2138    "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 
     40class I(Node): 
     41    "identity" 
     42    def eval(self, cont): 
     43        def I0(X, cont): 
     44            return cont.invoke(X) 
     45        return cont(I0) 
    3846 
    3947class Dot(Node): 
     
    4149    def __init__(self, c): 
    4250        self.c = c 
    43     def eval(self): 
    44         def Dot0(X): 
     51    def eval(self, cont): 
     52        def Dot0(X, cont): 
    4553            import sys 
    4654            sys.stdout.write(self.c) 
    47             return X 
    48         return Dot0 
     55            return cont(X) 
     56        return cont(Dot0) 
     57     
     58class 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" 
    4969 
    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)) 
    5772 
    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     
    9381def _parse(iter): 
    9482    c = iter.next() 
    9583    result = { 
     84        "i": lambda: I(), 
     85        ".": lambda: Dot(iter.next()), 
    9686        "`": 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 
    10188        "r": lambda: R(), 
    10289        "v": lambda: V(), 
    10390        "d": lambda: "(delay)", # special form 
     91        "c": lambda: C(), 
     92        "s": lambda: S(), 
     93        "k": lambda: K(), 
    10494    }.get(c, lambda: _parse(iter))() 
    10595    return result 
     
    10898    return _parse(list(s).__iter__()) 
    10999 
    110 def run(s): 
    111     return parse(s).eval() 
    112  
    113100def _test(): 
    114101    import doctest 
    115102    reload(doctest) 
    116103    doctest.testmod() 
     104 
     105run("`.ai")