OSDN Git Service

Py 3 handles exception propagation a little differently?
[joypy/Thun.git] / docs / 1._Basic_Use_of_Joy_in_a_Notebook.rst
1 Preamble
2 ~~~~~~~~
3
4 First, import what we need.
5
6 .. code:: ipython3
7
8     from joy.joy import run
9     from joy.library import initialize
10     from joy.utils.stack import stack_to_string
11     from joy.utils.pretty_print import TracePrinter
12
13 Define a dictionary, an initial stack, and two helper functions to run
14 Joy code and print results for us.
15
16 .. code:: ipython3
17
18     D = initialize()
19     S = ()
20     
21     
22     def J(text):
23         print(stack_to_string(run(text, S, D)[0]))
24     
25     
26     def V(text):
27         tp = TracePrinter()
28         run(text, S, D, tp.viewer)
29         tp.print_()
30
31 Run some simple programs
32 ~~~~~~~~~~~~~~~~~~~~~~~~
33
34 .. code:: ipython3
35
36     J('23 18 +')
37
38
39 .. parsed-literal::
40
41     41
42
43
44 .. code:: ipython3
45
46     J('45 30 gcd')
47
48
49 .. parsed-literal::
50
51     15
52
53
54 With Viewer
55 ~~~~~~~~~~~
56
57 A ``viewer`` records each step of the evaluation of a Joy program. The
58 ``TracePrinter`` has a facility for printing out a trace of the
59 evaluation, one line per step. Each step is aligned to the current
60 interpreter position, signified by a period separating the stack on the
61 left from the pending expression ("continuation") on the right. I find
62 these traces beautiful, like a kind of art.
63
64 .. code:: ipython3
65
66     V('23 18 +')
67
68
69 .. parsed-literal::
70
71           • 23 18 +
72        23 • 18 +
73     23 18 • +
74        41 • 
75
76
77 .. code:: ipython3
78
79     V('45 30 gcd')
80
81
82 .. parsed-literal::
83
84                                       • 45 30 gcd
85                                    45 • 30 gcd
86                                 45 30 • gcd
87                                 45 30 • 1 [tuck modulus dup 0 >] loop pop
88                               45 30 1 • [tuck modulus dup 0 >] loop pop
89        45 30 1 [tuck modulus dup 0 >] • loop pop
90                                 45 30 • tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop
91                              30 45 30 • modulus dup 0 > [tuck modulus dup 0 >] loop pop
92                                 30 15 • dup 0 > [tuck modulus dup 0 >] loop pop
93                              30 15 15 • 0 > [tuck modulus dup 0 >] loop pop
94                            30 15 15 0 • > [tuck modulus dup 0 >] loop pop
95                            30 15 True • [tuck modulus dup 0 >] loop pop
96     30 15 True [tuck modulus dup 0 >] • loop pop
97                                 30 15 • tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop
98                              15 30 15 • modulus dup 0 > [tuck modulus dup 0 >] loop pop
99                                  15 0 • dup 0 > [tuck modulus dup 0 >] loop pop
100                                15 0 0 • 0 > [tuck modulus dup 0 >] loop pop
101                              15 0 0 0 • > [tuck modulus dup 0 >] loop pop
102                            15 0 False • [tuck modulus dup 0 >] loop pop
103     15 0 False [tuck modulus dup 0 >] • loop pop
104                                  15 0 • pop
105                                    15 • 
106
107
108 Here's a longer trace.
109
110 .. code:: ipython3
111
112     V('96 27 gcd')
113
114
115 .. parsed-literal::
116
117                                       • 96 27 gcd
118                                    96 • 27 gcd
119                                 96 27 • gcd
120                                 96 27 • 1 [tuck modulus dup 0 >] loop pop
121                               96 27 1 • [tuck modulus dup 0 >] loop pop
122        96 27 1 [tuck modulus dup 0 >] • loop pop
123                                 96 27 • tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop
124                              27 96 27 • modulus dup 0 > [tuck modulus dup 0 >] loop pop
125                                 27 15 • dup 0 > [tuck modulus dup 0 >] loop pop
126                              27 15 15 • 0 > [tuck modulus dup 0 >] loop pop
127                            27 15 15 0 • > [tuck modulus dup 0 >] loop pop
128                            27 15 True • [tuck modulus dup 0 >] loop pop
129     27 15 True [tuck modulus dup 0 >] • loop pop
130                                 27 15 • tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop
131                              15 27 15 • modulus dup 0 > [tuck modulus dup 0 >] loop pop
132                                 15 12 • dup 0 > [tuck modulus dup 0 >] loop pop
133                              15 12 12 • 0 > [tuck modulus dup 0 >] loop pop
134                            15 12 12 0 • > [tuck modulus dup 0 >] loop pop
135                            15 12 True • [tuck modulus dup 0 >] loop pop
136     15 12 True [tuck modulus dup 0 >] • loop pop
137                                 15 12 • tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop
138                              12 15 12 • modulus dup 0 > [tuck modulus dup 0 >] loop pop
139                                  12 3 • dup 0 > [tuck modulus dup 0 >] loop pop
140                                12 3 3 • 0 > [tuck modulus dup 0 >] loop pop
141                              12 3 3 0 • > [tuck modulus dup 0 >] loop pop
142                             12 3 True • [tuck modulus dup 0 >] loop pop
143      12 3 True [tuck modulus dup 0 >] • loop pop
144                                  12 3 • tuck modulus dup 0 > [tuck modulus dup 0 >] loop pop
145                                3 12 3 • modulus dup 0 > [tuck modulus dup 0 >] loop pop
146                                   3 0 • dup 0 > [tuck modulus dup 0 >] loop pop
147                                 3 0 0 • 0 > [tuck modulus dup 0 >] loop pop
148                               3 0 0 0 • > [tuck modulus dup 0 >] loop pop
149                             3 0 False • [tuck modulus dup 0 >] loop pop
150      3 0 False [tuck modulus dup 0 >] • loop pop
151                                   3 0 • pop
152                                     3 • 
153