OSDN Git Service

Minor docs edit.
[joypy/Thun.git] / docs / 4. Replacing Functions in the Dictionary.ipynb
1 {
2  "cells": [
3   {
4    "cell_type": "markdown",
5    "metadata": {},
6    "source": [
7     "# Replacing Functions in the Dictionary"
8    ]
9   },
10   {
11    "cell_type": "code",
12    "execution_count": 1,
13    "metadata": {},
14    "outputs": [],
15    "source": [
16     "from notebook_preamble import D, J, V"
17    ]
18   },
19   {
20    "cell_type": "markdown",
21    "metadata": {},
22    "source": [
23     "## A long trace"
24    ]
25   },
26   {
27    "cell_type": "code",
28    "execution_count": 2,
29    "metadata": {
30     "scrolled": true
31    },
32    "outputs": [
33     {
34      "name": "stdout",
35      "output_type": "stream",
36      "text": [
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",
76       "                             41.0 . 2 /\n",
77       "                           41.0 2 . /\n",
78       "                             20.5 . \n"
79      ]
80     }
81    ],
82    "source": [
83     "V('[23 18] average')"
84    ]
85   },
86   {
87    "cell_type": "markdown",
88    "metadata": {},
89    "source": [
90     "## Replacing `size` with a Python version\n",
91     "\n",
92     "Both `sum` and `size` each convert a sequence to a single value."
93    ]
94   },
95   {
96    "cell_type": "markdown",
97    "metadata": {},
98    "source": [
99     "     sum == 0 swap [+] step\n",
100     "    size == 0 swap [pop ++] step"
101    ]
102   },
103   {
104    "cell_type": "markdown",
105    "metadata": {},
106    "source": [
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."
108    ]
109   },
110   {
111    "cell_type": "code",
112    "execution_count": 3,
113    "metadata": {},
114    "outputs": [],
115    "source": [
116     "from joy.library import SimpleFunctionWrapper\n",
117     "from joy.utils.stack import iter_stack\n",
118     "\n",
119     "\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",
124     "    n = 0\n",
125     "    for _ in iter_stack(sequence):\n",
126     "        n += 1\n",
127     "    return n, stack"
128    ]
129   },
130   {
131    "cell_type": "markdown",
132    "metadata": {},
133    "source": [
134     "Now we replace the old version in the dictionary with the new version, and re-evaluate the expression."
135    ]
136   },
137   {
138    "cell_type": "code",
139    "execution_count": 4,
140    "metadata": {},
141    "outputs": [],
142    "source": [
143     "D['size'] = size"
144    ]
145   },
146   {
147    "cell_type": "markdown",
148    "metadata": {},
149    "source": [
150     "## A shorter trace\n",
151     "You can see that `size` now executes in a single step."
152    ]
153   },
154   {
155    "cell_type": "code",
156    "execution_count": 5,
157    "metadata": {},
158    "outputs": [
159     {
160      "name": "stdout",
161      "output_type": "stream",
162      "text": [
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",
189       "                             41.0 . 2 /\n",
190       "                           41.0 2 . /\n",
191       "                             20.5 . \n"
192      ]
193     }
194    ],
195    "source": [
196     "V('[23 18] average')"
197    ]
198   }
199  ],
200  "metadata": {
201   "kernelspec": {
202    "display_name": "Python 2",
203    "language": "python",
204    "name": "python2"
205   },
206   "language_info": {
207    "codemirror_mode": {
208     "name": "ipython",
209     "version": 2
210    },
211    "file_extension": ".py",
212    "mimetype": "text/x-python",
213    "name": "python",
214    "nbconvert_exporter": "python",
215    "pygments_lexer": "ipython2",
216    "version": "2.7.12"
217   }
218  },
219  "nbformat": 4,
220  "nbformat_minor": 2
221 }