OSDN Git Service

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