root/lang/unlambda/impl/in_python/unlambda_lambda.py @ 1767

Revision 1767, 2.0 kB (checked in by nishio, 6 years ago)

lang/unlambda/impl/in_python: remove FinalTask?, FinalCont?

Line 
1""" unlambda interpreter
2
3# test
4>>> run("`.ai")
5a
6>>> run("``i.ai")
7a
8>>> run("`i`.ai")
9a
10>>> run("`d`.ai")
11>>> run("``d`.aii")
12a
13>>> run("`.b`i`.ai")
14ab
15>>> run("`.b`d`.ai")
16b
17>>> run("``.b`d`.aii")
18ba
19>>> run("``.b`.a`ci.c")
20ababc
21>>> run("````skk.av")
22a
23"""
24import sys
25
26# Node
27I = lambda:lambda c:c(lambda X,c:c(X))
28Dot = lambda char:lambda c:c(
29    lambda X,c:sys.stdout.write(char)or c(X))
30Apply = lambda nX,nY:lambda c:\
31    lambda:nX(lambda X:
32        lambda:
33            (X == D_)and(
34                c(lambda Y,c:nY(lambda X:c(lambda X,c:X(Y,c))))
35            )or(
36                nY(lambda Y: lambda :X(Y, c))))
37D = lambda:D_
38D_ = lambda c:c(D_)
39V0 = lambda X,c:c(V0)
40V = lambda:lambda c:c(V0)
41K = lambda:lambda c:c(lambda X,c:c(lambda Y,c:c(X)))
42C = lambda:lambda c:c(lambda Y,c:lambda:Y(lambda F,c_:c(F),c))
43S = lambda:lambda c:c(
44        lambda X,c:c(
45            lambda Y,c:c(
46                lambda Z,c:lambda:(
47                    Apply(
48                        Apply(
49                            lambda c:c(X),
50                            lambda c:c(Z)),
51                        Apply(
52                            lambda c:c(Y),
53                            lambda c:c(Z))))(c))))
54
55def _parse(iter):
56    return {
57        "i": lambda: I(),
58        "d": lambda: D(),
59        "c": lambda: C(),
60        "v": lambda: V(),
61        "s": lambda: S(),
62        "k": lambda: K(),
63        "r": lambda: Dot("\n"),
64        ".": lambda: Dot(iter.next()),
65        "`": lambda: Apply(_parse(iter), _parse(iter)),
66    }.get(iter.next(), lambda: _parse(iter))()
67
68def parse(s):
69    return _parse(list(s).__iter__())
70
71# Main loop
72def run(s):
73    task = lambda:parse(s)(lambda f:lambda:None)
74    while task:
75        task = task()
76
77# Test
78def _test():
79    import doctest
80    reload(doctest)
81    doctest.testmod()
82
83def fib():
84    "show Fibonacci numbers"
85    run("""
86    ```s``s``sii`ki
87      `k.*``s``s`ks
88     ``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
89      `k``s`ksk
90      """)
91
Note: See TracBrowser for help on using the browser.