4 "cell_type": "markdown",
7 "# Replacing Functions in the Dictionary"
16 "from notebook_preamble import D, J, V"
20 "cell_type": "markdown",
33 "output_type": "stream",
35 " . [23 18] average\n",
36 " [23 18] . average\n",
37 " [23 18] . [sum 1.0 *] [size] cleave /\n",
38 " [23 18] [sum 1.0 *] . [size] cleave /\n",
39 " [23 18] [sum 1.0 *] [size] . cleave /\n",
40 " [23 18] [sum 1.0 *] [size] . [i] app2 [popd] dip /\n",
41 " [23 18] [sum 1.0 *] [size] [i] . app2 [popd] dip /\n",
42 "[23 18] [[sum 1.0 *] [23 18]] [i] . infra first [[size] [23 18]] [i] infra first [popd] dip /\n",
43 " [23 18] [sum 1.0 *] . i [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
44 " [23 18] . sum 1.0 * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
45 " 41 . 1.0 * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
46 " 41 1.0 . * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
47 " 41.0 . [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
48 " 41.0 [[23 18]] . swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
49 " [23 18] [41.0] . first [[size] [23 18]] [i] infra first [popd] dip /\n",
50 " [23 18] 41.0 . [[size] [23 18]] [i] infra first [popd] dip /\n",
51 " [23 18] 41.0 [[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] [size] . i [41.0 [23 18]] swaack first [popd] dip /\n",
54 " [23 18] . size [41.0 [23 18]] swaack first [popd] dip /\n",
55 " [23 18] . 0 swap [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
56 " [23 18] 0 . swap [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
57 " 0 [23 18] . [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
58 " 0 [23 18] [pop ++] . step [41.0 [23 18]] swaack first [popd] dip /\n",
59 " 0 23 [pop ++] . i [18] [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
60 " 0 23 . pop ++ [18] [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
61 " 0 . ++ [18] [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
62 " 1 . [18] [pop ++] step [41.0 [23 18]] swaack first [popd] dip /\n",
63 " 1 [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 ++] . i [41.0 [23 18]] swaack first [popd] dip /\n",
66 " 1 18 . pop ++ [41.0 [23 18]] swaack first [popd] dip /\n",
67 " 1 . ++ [41.0 [23 18]] swaack first [popd] dip /\n",
68 " 2 . [41.0 [23 18]] swaack first [popd] dip /\n",
69 " 2 [41.0 [23 18]] . swaack first [popd] dip /\n",
70 " [23 18] 41.0 [2] . first [popd] dip /\n",
71 " [23 18] 41.0 2 . [popd] dip /\n",
72 " [23 18] 41.0 2 [popd] . dip /\n",
73 " [23 18] 41.0 . popd 2 /\n",
81 "V('[23 18] average')"
85 "cell_type": "markdown",
88 "## Replacing `size` with a Python version\n",
90 "Both `sum` and `size` each convert a sequence to a single value."
94 "cell_type": "markdown",
97 " sum == 0 swap [+] step\n",
98 " size == 0 swap [pop ++] step"
102 "cell_type": "markdown",
105 "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."
110 "execution_count": 3,
114 "from joy.library import SimpleFunctionWrapper\n",
115 "from joy.utils.stack import iter_stack\n",
118 "@SimpleFunctionWrapper\n",
119 "def size(stack):\n",
120 " '''Return the size of the sequence on the stack.'''\n",
121 " sequence, stack = stack\n",
123 " for _ in iter_stack(sequence):\n",
129 "cell_type": "markdown",
132 "Now we replace the old version in the dictionary with the new version, and re-evaluate the expression."
137 "execution_count": 4,
145 "cell_type": "markdown",
148 "## A shorter trace\n",
149 "You can see that `size` now executes in a single step."
154 "execution_count": 5,
159 "output_type": "stream",
161 " . [23 18] average\n",
162 " [23 18] . average\n",
163 " [23 18] . [sum 1.0 *] [size] cleave /\n",
164 " [23 18] [sum 1.0 *] . [size] cleave /\n",
165 " [23 18] [sum 1.0 *] [size] . cleave /\n",
166 " [23 18] [sum 1.0 *] [size] . [i] app2 [popd] dip /\n",
167 " [23 18] [sum 1.0 *] [size] [i] . app2 [popd] dip /\n",
168 "[23 18] [[sum 1.0 *] [23 18]] [i] . infra first [[size] [23 18]] [i] infra first [popd] dip /\n",
169 " [23 18] [sum 1.0 *] . i [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
170 " [23 18] . sum 1.0 * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
171 " 41 . 1.0 * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
172 " 41 1.0 . * [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
173 " 41.0 . [[23 18]] swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
174 " 41.0 [[23 18]] . swaack first [[size] [23 18]] [i] infra first [popd] dip /\n",
175 " [23 18] [41.0] . first [[size] [23 18]] [i] infra first [popd] dip /\n",
176 " [23 18] 41.0 . [[size] [23 18]] [i] infra first [popd] dip /\n",
177 " [23 18] 41.0 [[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] [size] . i [41.0 [23 18]] swaack first [popd] dip /\n",
180 " [23 18] . size [41.0 [23 18]] swaack first [popd] dip /\n",
181 " 2 . [41.0 [23 18]] swaack first [popd] dip /\n",
182 " 2 [41.0 [23 18]] . swaack first [popd] dip /\n",
183 " [23 18] 41.0 [2] . first [popd] dip /\n",
184 " [23 18] 41.0 2 . [popd] dip /\n",
185 " [23 18] 41.0 2 [popd] . dip /\n",
186 " [23 18] 41.0 . popd 2 /\n",
194 "V('[23 18] average')"
200 "display_name": "Python 2",
201 "language": "python",
209 "file_extension": ".py",
210 "mimetype": "text/x-python",
212 "nbconvert_exporter": "python",
213 "pygments_lexer": "ipython2",