4 "cell_type": "markdown",
7 "# Replacing Functions in the Dictionary"
16 "from notebook_preamble import D, J, V"
20 "cell_type": "markdown",
35 "output_type": "stream",
37 " . [23 18] average\n",
38 " [23 18] . average\n",
39 " [23 18] . [sum 1.0 *] [size] cleave /\n",
40 " [23 18] [sum 1.0 *] . [size] cleave /\n",
41 " [23 18] [sum 1.0 *] [size] . cleave /\n",
42 " [23 18] [sum 1.0 *] [size] . [i] app2 [popd] dip /\n",
43 " [23 18] [sum 1.0 *] [size] [i] . app2 [popd] dip /\n",
44 "[23 18] [[sum 1.0 *] [23 18]] [i] . infra first [[size] [23 18]] [i] infra first [popd] dip /\n",
45 " [23 18] [sum 1.0 *] . i [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
46 " [23 18] . sum 1.0 * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
47 " 41 . 1.0 * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
48 " 41 1.0 . * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
49 " 41.0 . [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
50 " 41.0 [[23 18]] . swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
51 " [23 18] [41.0] . first [[size] [23 18]] [i] infra first [popd] dip /\n",
52 " [23 18] 41.0 . [[size] [23 18]] [i] infra first [popd] dip /\n",
53 " [23 18] 41.0 [[size] [23 18]] . [i] infra first [popd] dip /\n",
54 "[23 18] 41.0 [[size] [23 18]] [i] . infra first [popd] dip /\n",
55 " [23 18] [size] . i [41.0 [23 18]] swaack first [popd] dip /\n",
56 " [23 18] . size [41.0 [23 18]] swaack first [popd] dip /\n",
57 " [23 18] . 0 swap [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
58 " [23 18] 0 . swap [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
59 " 0 [23 18] . [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
60 " 0 [23 18] [pop ++] . step [41.0 [23 18]] swaack first [popd] dip /\n",
61 " 0 23 [pop ++] . i [18] [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
62 " 0 23 . pop ++ [18] [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
63 " 0 . ++ [18] [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
64 " 1 . [18] [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
65 " 1 [18] . [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
66 " 1 [18] [pop ++] . step [41.0 [23 18]] swaack first [popd] dip /\n",
67 " 1 18 [pop ++] . i [41.0 [23 18]] swaack first [popd] dip /\n",
68 " 1 18 . pop ++ [41.0 [23 18]] swaack first [popd] dip /\n",
69 " 1 . ++ [41.0 [23 18]] swaack first [popd] dip /\n",
70 " 2 . [41.0 [23 18]] swaack first [popd] dip /\n",
71 " 2 [41.0 [23 18]] . swaack first [popd] dip /\n",
72 " [23 18] 41.0 [2] . first [popd] dip /\n",
73 " [23 18] 41.0 2 . [popd] dip /\n",
74 " [23 18] 41.0 2 [popd] . dip /\n",
75 " [23 18] 41.0 . popd 2 /\n",
83 "V('[23 18] average')"
87 "cell_type": "markdown",
90 "## Replacing `size` with a Python version\n",
92 "Both `sum` and `size` each convert a sequence to a single value."
96 "cell_type": "markdown",
99 " sum == 0 swap [+] step\n",
100 " size == 0 swap [pop ++] step"
104 "cell_type": "markdown",
107 "An efficient `sum` function is already in the library. But for `size` we can use a “compiled” version hand-written in Python to speed up evaluation and make the trace more readable."
112 "execution_count": 3,
116 "from joy.library import SimpleFunctionWrapper\n",
117 "from joy.utils.stack import iter_stack\n",
120 "@SimpleFunctionWrapper\n",
121 "def size(stack):\n",
122 " '''Return the size of the sequence on the stack.'''\n",
123 " sequence, stack = stack\n",
125 " for _ in iter_stack(sequence):\n",
131 "cell_type": "markdown",
134 "Now we replace the old version in the dictionary with the new version, and re-evaluate the expression."
139 "execution_count": 4,
147 "cell_type": "markdown",
150 "## A shorter trace\n",
151 "You can see that `size` now executes in a single step."
156 "execution_count": 5,
161 "output_type": "stream",
163 " . [23 18] average\n",
164 " [23 18] . average\n",
165 " [23 18] . [sum 1.0 *] [size] cleave /\n",
166 " [23 18] [sum 1.0 *] . [size] cleave /\n",
167 " [23 18] [sum 1.0 *] [size] . cleave /\n",
168 " [23 18] [sum 1.0 *] [size] . [i] app2 [popd] dip /\n",
169 " [23 18] [sum 1.0 *] [size] [i] . app2 [popd] dip /\n",
170 "[23 18] [[sum 1.0 *] [23 18]] [i] . infra first [[size] [23 18]] [i] infra first [popd] dip /\n",
171 " [23 18] [sum 1.0 *] . i [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
172 " [23 18] . sum 1.0 * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
173 " 41 . 1.0 * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
174 " 41 1.0 . * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
175 " 41.0 . [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
176 " 41.0 [[23 18]] . swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
177 " [23 18] [41.0] . first [[size] [23 18]] [i] infra first [popd] dip /\n",
178 " [23 18] 41.0 . [[size] [23 18]] [i] infra first [popd] dip /\n",
179 " [23 18] 41.0 [[size] [23 18]] . [i] infra first [popd] dip /\n",
180 "[23 18] 41.0 [[size] [23 18]] [i] . infra first [popd] dip /\n",
181 " [23 18] [size] . i [41.0 [23 18]] swaack first [popd] dip /\n",
182 " [23 18] . size [41.0 [23 18]] swaack first [popd] dip /\n",
183 " 2 . [41.0 [23 18]] swaack first [popd] dip /\n",
184 " 2 [41.0 [23 18]] . swaack first [popd] dip /\n",
185 " [23 18] 41.0 [2] . first [popd] dip /\n",
186 " [23 18] 41.0 2 . [popd] dip /\n",
187 " [23 18] 41.0 2 [popd] . dip /\n",
188 " [23 18] 41.0 . popd 2 /\n",
196 "V('[23 18] average')"
202 "display_name": "Python 2",
203 "language": "python",
211 "file_extension": ".py",
212 "mimetype": "text/x-python",
214 "nbconvert_exporter": "python",
215 "pygments_lexer": "ipython2",