OSDN Git Service

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