OSDN Git Service

Bleah.
[joypy/Thun.git] / docs / sphinx_docs / _build / html / notebooks / Zipper.html
1
2 <!DOCTYPE html>
3
4 <html>
5   <head>
6     <meta charset="utf-8" />
7     <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
8
9     <title>Traversing Datastructures with Zippers &#8212; Thun 0.4.1 documentation</title>
10     <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
11     <link rel="stylesheet" type="text/css" href="../_static/alabaster.css" />
12     <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
13     <script src="../_static/jquery.js"></script>
14     <script src="../_static/underscore.js"></script>
15     <script src="../_static/doctools.js"></script>
16     <link rel="index" title="Index" href="../genindex.html" />
17     <link rel="search" title="Search" href="../search.html" />
18     <link rel="next" title="The Blissful Elegance of Typing Joy" href="Types.html" />
19     <link rel="prev" title="Square Spiral Example Joy Code" href="Square_Spiral.html" />
20    
21   <link rel="stylesheet" href="../_static/custom.css" type="text/css" />
22   
23   
24   <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
25
26   </head><body>
27   
28
29     <div class="document">
30       <div class="documentwrapper">
31         <div class="bodywrapper">
32           
33
34           <div class="body" role="main">
35             
36   <section id="traversing-datastructures-with-zippers">
37 <h1>Traversing Datastructures with Zippers<a class="headerlink" href="#traversing-datastructures-with-zippers" title="Permalink to this headline">¶</a></h1>
38 <p>This notebook is about using the “zipper” with joy datastructures. See
39 the <a class="reference external" href="https://en.wikipedia.org/wiki/Zipper_%28data_structure%29">Zipper wikipedia
40 entry</a> or
41 the original paper: <a class="reference external" href="https://www.st.cs.uni-saarland.de/edu/seminare/2005/advanced-fp/docs/huet-zipper.pdf">“FUNCTIONAL PEARL The Zipper” by Gérard
42 Huet</a></p>
43 <p>Given a datastructure on the stack we can navigate through it, modify
44 it, and rebuild it using the “zipper” technique.</p>
45 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">notebook_preamble</span> <span class="kn">import</span> <span class="n">J</span><span class="p">,</span> <span class="n">V</span><span class="p">,</span> <span class="n">define</span>
46 </pre></div>
47 </div>
48 <section id="trees">
49 <h2>Trees<a class="headerlink" href="#trees" title="Permalink to this headline">¶</a></h2>
50 <p>In Joypy there aren’t any complex datastructures, just ints, floats,
51 strings, Symbols (strings that are names of functions) and sequences
52 (aka lists, aka quoted literals, aka aggregates, etc…), but we can build
53 <a class="reference external" href="https://en.wikipedia.org/wiki/Tree_%28data_structure%29">trees</a> out
54 of sequences.</p>
55 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 [2 [3 4 25 6] 7] 8]&#39;</span><span class="p">)</span>
56 </pre></div>
57 </div>
58 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
59 </pre></div>
60 </div>
61 </section>
62 <section id="zipper-in-joy">
63 <h2>Zipper in Joy<a class="headerlink" href="#zipper-in-joy" title="Permalink to this headline">¶</a></h2>
64 <p>Zippers work by keeping track of the current item, the already-seen
65 items, and the yet-to-be seen items as you traverse a datastructure (the
66 datastructure used to keep track of these items is the zipper.)</p>
67 <p>In Joy we can do this with the following words:</p>
68 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">z</span><span class="o">-</span><span class="n">down</span> <span class="o">==</span> <span class="p">[]</span> <span class="n">swap</span> <span class="n">uncons</span> <span class="n">swap</span>
69 <span class="n">z</span><span class="o">-</span><span class="n">up</span> <span class="o">==</span> <span class="n">swons</span> <span class="n">swap</span> <span class="n">shunt</span>
70 <span class="n">z</span><span class="o">-</span><span class="n">right</span> <span class="o">==</span> <span class="p">[</span><span class="n">swons</span><span class="p">]</span> <span class="n">cons</span> <span class="n">dip</span> <span class="n">uncons</span> <span class="n">swap</span>
71 <span class="n">z</span><span class="o">-</span><span class="n">left</span> <span class="o">==</span> <span class="n">swons</span> <span class="p">[</span><span class="n">uncons</span> <span class="n">swap</span><span class="p">]</span> <span class="n">dip</span> <span class="n">swap</span>
72 </pre></div>
73 </div>
74 <p>Let’s use them to change 25 into 625. The first time a word is used I
75 show the trace so you can see how it works. If we were going to use
76 these a lot it would make sense to write Python versions for efficiency,
77 but see below.</p>
78 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;z-down == [] swap uncons swap&#39;</span><span class="p">)</span>
79 <span class="n">define</span><span class="p">(</span><span class="s1">&#39;z-up == swons swap shunt&#39;</span><span class="p">)</span>
80 <span class="n">define</span><span class="p">(</span><span class="s1">&#39;z-right == [swons] cons dip uncons swap&#39;</span><span class="p">)</span>
81 <span class="n">define</span><span class="p">(</span><span class="s1">&#39;z-left == swons [uncons swap] dip swap&#39;</span><span class="p">)</span>
82 </pre></div>
83 </div>
84 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;[1 [2 [3 4 25 6] 7] 8] z-down&#39;</span><span class="p">)</span>
85 </pre></div>
86 </div>
87 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>                          <span class="o">.</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="n">z</span><span class="o">-</span><span class="n">down</span>
88    <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="o">.</span> <span class="n">z</span><span class="o">-</span><span class="n">down</span>
89    <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="o">.</span> <span class="p">[]</span> <span class="n">swap</span> <span class="n">uncons</span> <span class="n">swap</span>
90 <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="p">[]</span> <span class="o">.</span> <span class="n">swap</span> <span class="n">uncons</span> <span class="n">swap</span>
91 <span class="p">[]</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="o">.</span> <span class="n">uncons</span> <span class="n">swap</span>
92 <span class="p">[]</span> <span class="mi">1</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="o">.</span> <span class="n">swap</span>
93 <span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="o">.</span>
94 </pre></div>
95 </div>
96 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;[] [[2 [3 4 25 6] 7] 8] 1 z-right&#39;</span><span class="p">)</span>
97 </pre></div>
98 </div>
99 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>                                  <span class="o">.</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="n">z</span><span class="o">-</span><span class="n">right</span>
100                                <span class="p">[]</span> <span class="o">.</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="n">z</span><span class="o">-</span><span class="n">right</span>
101           <span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="o">.</span> <span class="mi">1</span> <span class="n">z</span><span class="o">-</span><span class="n">right</span>
102         <span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="o">.</span> <span class="n">z</span><span class="o">-</span><span class="n">right</span>
103         <span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="o">.</span> <span class="p">[</span><span class="n">swons</span><span class="p">]</span> <span class="n">cons</span> <span class="n">dip</span> <span class="n">uncons</span> <span class="n">swap</span>
104 <span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="mi">1</span> <span class="p">[</span><span class="n">swons</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">dip</span> <span class="n">uncons</span> <span class="n">swap</span>
105 <span class="p">[]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">1</span> <span class="n">swons</span><span class="p">]</span> <span class="o">.</span> <span class="n">dip</span> <span class="n">uncons</span> <span class="n">swap</span>
106                                <span class="p">[]</span> <span class="o">.</span> <span class="mi">1</span> <span class="n">swons</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="n">uncons</span> <span class="n">swap</span>
107                              <span class="p">[]</span> <span class="mi">1</span> <span class="o">.</span> <span class="n">swons</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="n">uncons</span> <span class="n">swap</span>
108                              <span class="p">[]</span> <span class="mi">1</span> <span class="o">.</span> <span class="n">swap</span> <span class="n">cons</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="n">uncons</span> <span class="n">swap</span>
109                              <span class="mi">1</span> <span class="p">[]</span> <span class="o">.</span> <span class="n">cons</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="n">uncons</span> <span class="n">swap</span>
110                               <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">.</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="n">uncons</span> <span class="n">swap</span>
111          <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="o">.</span> <span class="n">uncons</span> <span class="n">swap</span>
112          <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">.</span> <span class="n">swap</span>
113          <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="o">.</span>
114 </pre></div>
115 </div>
116 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1] [8] [2 [3 4 25 6] 7] z-down&#39;</span><span class="p">)</span>
117 </pre></div>
118 </div>
119 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">2</span>
120 </pre></div>
121 </div>
122 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1] [8] [] [[3 4 25 6] 7] 2 z-right&#39;</span><span class="p">)</span>
123 </pre></div>
124 </div>
125 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span>
126 </pre></div>
127 </div>
128 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1] [8] [2] [7] [3 4 25 6] z-down&#39;</span><span class="p">)</span>
129 </pre></div>
130 </div>
131 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">3</span>
132 </pre></div>
133 </div>
134 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1] [8] [2] [7] [] [4 25 6] 3 z-right&#39;</span><span class="p">)</span>
135 </pre></div>
136 </div>
137 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">4</span>
138 </pre></div>
139 </div>
140 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1] [8] [2] [7] [3] [25 6] 4 z-right&#39;</span><span class="p">)</span>
141 </pre></div>
142 </div>
143 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">25</span>
144 </pre></div>
145 </div>
146 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1] [8] [2] [7] [4 3] [6] 25 sqr&#39;</span><span class="p">)</span>
147 </pre></div>
148 </div>
149 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span>
150 </pre></div>
151 </div>
152 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;[1] [8] [2] [7] [4 3] [6] 625 z-up&#39;</span><span class="p">)</span>
153 </pre></div>
154 </div>
155 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>                              <span class="o">.</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
156                           <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
157                       <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
158                   <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
159               <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
160         <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
161     <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="o">.</span> <span class="mi">625</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
162 <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="o">.</span> <span class="n">z</span><span class="o">-</span><span class="n">up</span>
163 <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="o">.</span> <span class="n">swons</span> <span class="n">swap</span> <span class="n">shunt</span>
164 <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="mi">625</span> <span class="o">.</span> <span class="n">swap</span> <span class="n">cons</span> <span class="n">swap</span> <span class="n">shunt</span>
165 <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="mi">625</span> <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">swap</span> <span class="n">shunt</span>
166 <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="o">.</span> <span class="n">swap</span> <span class="n">shunt</span>
167 <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span> <span class="mi">3</span><span class="p">]</span> <span class="o">.</span> <span class="n">shunt</span>
168   <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="o">.</span>
169 </pre></div>
170 </div>
171 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1] [8] [2] [7] [3 4 625 6] z-up&#39;</span><span class="p">)</span>
172 </pre></div>
173 </div>
174 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span>
175 </pre></div>
176 </div>
177 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1] [8] [2 [3 4 625 6] 7] z-up&#39;</span><span class="p">)</span>
178 </pre></div>
179 </div>
180 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
181 </pre></div>
182 </div>
183 </section>
184 <section id="dip-and-infra">
185 <h2><code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">infra</span></code><a class="headerlink" href="#dip-and-infra" title="Permalink to this headline">¶</a></h2>
186 <p>In Joy we have the <code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">infra</span></code> combinators which can “target”
187 or “address” any particular item in a Joy tree structure.</p>
188 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;[1 [2 [3 4 25 6] 7] 8] [[[[[[sqr] dipd] infra] dip] infra] dip] infra&#39;</span><span class="p">)</span>
189 </pre></div>
190 </div>
191 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>                                                                <span class="o">.</span> <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="p">[[[[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span>
192                                          <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="o">.</span> <span class="p">[[[[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span>
193 <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="p">[[[[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="o">.</span> <span class="n">infra</span>
194                                            <span class="mi">8</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">1</span> <span class="o">.</span> <span class="p">[[[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[]</span> <span class="n">swaack</span>
195         <span class="mi">8</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">1</span> <span class="p">[[[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="o">.</span> <span class="n">dip</span> <span class="p">[]</span> <span class="n">swaack</span>
196                                              <span class="mi">8</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="o">.</span> <span class="p">[[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
197                   <span class="mi">8</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="p">[[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="o">.</span> <span class="n">infra</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
198                                                  <span class="mi">7</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">2</span> <span class="o">.</span> <span class="p">[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
199                             <span class="mi">7</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">2</span> <span class="p">[[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="o">.</span> <span class="n">dip</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
200                                                    <span class="mi">7</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="o">.</span> <span class="p">[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="n">infra</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
201                                       <span class="mi">7</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">25</span> <span class="mi">6</span><span class="p">]</span> <span class="p">[[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span><span class="p">]</span> <span class="o">.</span> <span class="n">infra</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
202                                                        <span class="mi">6</span> <span class="mi">25</span> <span class="mi">4</span> <span class="mi">3</span> <span class="o">.</span> <span class="p">[</span><span class="n">sqr</span><span class="p">]</span> <span class="n">dipd</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
203                                                  <span class="mi">6</span> <span class="mi">25</span> <span class="mi">4</span> <span class="mi">3</span> <span class="p">[</span><span class="n">sqr</span><span class="p">]</span> <span class="o">.</span> <span class="n">dipd</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
204                                                            <span class="mi">6</span> <span class="mi">25</span> <span class="o">.</span> <span class="n">sqr</span> <span class="mi">4</span> <span class="mi">3</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
205                                                            <span class="mi">6</span> <span class="mi">25</span> <span class="o">.</span> <span class="n">dup</span> <span class="n">mul</span> <span class="mi">4</span> <span class="mi">3</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
206                                                         <span class="mi">6</span> <span class="mi">25</span> <span class="mi">25</span> <span class="o">.</span> <span class="n">mul</span> <span class="mi">4</span> <span class="mi">3</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
207                                                           <span class="mi">6</span> <span class="mi">625</span> <span class="o">.</span> <span class="mi">4</span> <span class="mi">3</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
208                                                         <span class="mi">6</span> <span class="mi">625</span> <span class="mi">4</span> <span class="o">.</span> <span class="mi">3</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
209                                                       <span class="mi">6</span> <span class="mi">625</span> <span class="mi">4</span> <span class="mi">3</span> <span class="o">.</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
210                                                   <span class="mi">6</span> <span class="mi">625</span> <span class="mi">4</span> <span class="mi">3</span> <span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="o">.</span> <span class="n">swaack</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
211                                                   <span class="mi">7</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="o">.</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
212                                                 <span class="mi">7</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">2</span> <span class="o">.</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
213                                             <span class="mi">7</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">2</span> <span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">.</span> <span class="n">swaack</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
214                                             <span class="mi">8</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="o">.</span> <span class="mi">1</span> <span class="p">[]</span> <span class="n">swaack</span>
215                                           <span class="mi">8</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">1</span> <span class="o">.</span> <span class="p">[]</span> <span class="n">swaack</span>
216                                        <span class="mi">8</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">1</span> <span class="p">[]</span> <span class="o">.</span> <span class="n">swaack</span>
217                                         <span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span> <span class="o">.</span>
218 </pre></div>
219 </div>
220 <p>If you read the trace carefully you’ll see that about half of it is the
221 <code class="docutils literal notranslate"><span class="pre">dip</span></code> and <code class="docutils literal notranslate"><span class="pre">infra</span></code> combinators de-quoting programs and “digging” into
222 the subject datastructure. Instead of maintaining temporary results on
223 the stack they are pushed into the pending expression (continuation).
224 When <code class="docutils literal notranslate"><span class="pre">sqr</span></code> has run the rest of the pending expression rebuilds the
225 datastructure.</p>
226 </section>
227 <section id="z">
228 <h2><code class="docutils literal notranslate"><span class="pre">Z</span></code><a class="headerlink" href="#z" title="Permalink to this headline">¶</a></h2>
229 <p>Imagine a function <code class="docutils literal notranslate"><span class="pre">Z</span></code> that accepts a sequence of <code class="docutils literal notranslate"><span class="pre">dip</span></code> and
230 <code class="docutils literal notranslate"><span class="pre">infra</span></code> combinators, a quoted program <code class="docutils literal notranslate"><span class="pre">[Q]</span></code>, and a datastructure to
231 work on. It would effectively execute the quoted program as if it had
232 been embedded in a nested series of quoted programs, e.g.:</p>
233 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>   <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="p">[</span><span class="n">dip</span> <span class="n">dip</span> <span class="n">infra</span> <span class="n">dip</span> <span class="n">infra</span> <span class="n">dip</span> <span class="n">infra</span><span class="p">]</span> <span class="n">Z</span>
234 <span class="o">-------------------------------------------------------------</span>
235    <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[[[[[[[</span><span class="n">Q</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span>
236 </pre></div>
237 </div>
238 <p>The <code class="docutils literal notranslate"><span class="pre">Z</span></code> function isn’t hard to make.</p>
239 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">define</span><span class="p">(</span><span class="s1">&#39;Z == [[] cons cons] step i&#39;</span><span class="p">)</span>
240 </pre></div>
241 </div>
242 <p>Here it is in action in a simplified scenario.</p>
243 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">V</span><span class="p">(</span><span class="s1">&#39;1 [2 3 4] Z&#39;</span><span class="p">)</span>
244 </pre></div>
245 </div>
246 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>                             <span class="o">.</span> <span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="n">Z</span>
247                            <span class="mi">1</span> <span class="o">.</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="n">Z</span>
248                    <span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="o">.</span> <span class="n">Z</span>
249                    <span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="o">.</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
250     <span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="o">.</span> <span class="n">step</span> <span class="n">i</span>
251           <span class="mi">1</span> <span class="mi">2</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="o">.</span> <span class="n">i</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
252                          <span class="mi">1</span> <span class="mi">2</span> <span class="o">.</span> <span class="p">[]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
253                       <span class="mi">1</span> <span class="mi">2</span> <span class="p">[]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
254                        <span class="mi">1</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
255                        <span class="p">[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
256                  <span class="p">[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="o">.</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
257   <span class="p">[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="o">.</span> <span class="n">step</span> <span class="n">i</span>
258       <span class="p">[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="o">.</span> <span class="n">i</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
259                      <span class="p">[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span> <span class="o">.</span> <span class="p">[]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
260                   <span class="p">[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span> <span class="p">[]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
261                    <span class="p">[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
262                    <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="o">.</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
263                <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">.</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="n">step</span> <span class="n">i</span>
264 <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="o">.</span> <span class="n">step</span> <span class="n">i</span>
265   <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="mi">4</span> <span class="p">[[]</span> <span class="n">cons</span> <span class="n">cons</span><span class="p">]</span> <span class="o">.</span> <span class="n">i</span> <span class="n">i</span>
266                  <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="mi">4</span> <span class="o">.</span> <span class="p">[]</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">i</span>
267               <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="mi">4</span> <span class="p">[]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">cons</span> <span class="n">i</span>
268                <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">.</span> <span class="n">cons</span> <span class="n">i</span>
269                <span class="p">[[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="mi">4</span><span class="p">]</span> <span class="o">.</span> <span class="n">i</span>
270                              <span class="o">.</span> <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="mi">4</span>
271                    <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="o">.</span> <span class="mi">4</span>
272                  <span class="p">[[</span><span class="mi">1</span> <span class="mi">2</span><span class="p">]</span> <span class="mi">3</span><span class="p">]</span> <span class="mi">4</span> <span class="o">.</span>
273 </pre></div>
274 </div>
275 <p>And here it is doing the main thing.</p>
276 <div class="highlight-ipython2 notranslate"><div class="highlight"><pre><span></span><span class="n">J</span><span class="p">(</span><span class="s1">&#39;[1 [2 [3 4 25 6] 7] 8] [sqr] [dip dip infra dip infra dip infra] Z&#39;</span><span class="p">)</span>
277 </pre></div>
278 </div>
279 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span> <span class="p">[</span><span class="mi">2</span> <span class="p">[</span><span class="mi">3</span> <span class="mi">4</span> <span class="mi">625</span> <span class="mi">6</span><span class="p">]</span> <span class="mi">7</span><span class="p">]</span> <span class="mi">8</span><span class="p">]</span>
280 </pre></div>
281 </div>
282 </section>
283 <section id="addressing">
284 <h2>Addressing<a class="headerlink" href="#addressing" title="Permalink to this headline">¶</a></h2>
285 <p>Because we are only using two combinators we could replace the list with
286 a string made from only two characters.</p>
287 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>   <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[</span><span class="n">Q</span><span class="p">]</span> <span class="s1">&#39;ddididi&#39;</span> <span class="n">Zstr</span>
288 <span class="o">-------------------------------------------------------------</span>
289    <span class="p">[</span><span class="o">...</span><span class="p">]</span> <span class="p">[[[[[[[</span><span class="n">Q</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span><span class="p">]</span> <span class="n">dip</span><span class="p">]</span> <span class="n">infra</span>
290 </pre></div>
291 </div>
292 <p>The string can be considered a name or address for an item in the
293 subject datastructure.</p>
294 </section>
295 <section id="determining-the-right-path-for-an-item-in-a-tree">
296 <h2>Determining the right “path” for an item in a tree.<a class="headerlink" href="#determining-the-right-path-for-an-item-in-a-tree" title="Permalink to this headline">¶</a></h2>
297 <p>It’s easy to read off (in reverse) the right sequence of “d” and “i”
298 from the subject datastructure:</p>
299 <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>[ n [ n [ n n x ...
300 i d i d i d d Bingo!
301 </pre></div>
302 </div>
303 </section>
304 </section>
305
306
307           </div>
308           
309         </div>
310       </div>
311       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
312         <div class="sphinxsidebarwrapper">
313 <h1 class="logo"><a href="../index.html">Thun</a></h1>
314
315
316
317
318
319
320
321
322 <h3>Navigation</h3>
323 <ul class="current">
324 <li class="toctree-l1"><a class="reference internal" href="Intro.html">Thun: Joy in Python</a></li>
325 <li class="toctree-l1"><a class="reference internal" href="../joy.html">Joy Interpreter</a></li>
326 <li class="toctree-l1"><a class="reference internal" href="../stack.html">Stack or Quote or Sequence or List…</a></li>
327 <li class="toctree-l1"><a class="reference internal" href="../parser.html">Parsing Text into Joy Expressions</a></li>
328 <li class="toctree-l1"><a class="reference internal" href="../pretty.html">Tracing Joy Execution</a></li>
329 <li class="toctree-l1"><a class="reference internal" href="../library.html">Function Reference</a></li>
330 <li class="toctree-l1"><a class="reference internal" href="../lib.html">Functions Grouped by, er, Function with Examples</a></li>
331 <li class="toctree-l1"><a class="reference internal" href="../types.html">Type Inference of Joy Expressions</a></li>
332 <li class="toctree-l1 current"><a class="reference internal" href="index.html">Essays about Programming in Joy</a><ul class="current">
333 <li class="toctree-l2"><a class="reference internal" href="Developing.html">Developing a Program in Joy</a></li>
334 <li class="toctree-l2"><a class="reference internal" href="Quadratic.html">Quadratic formula</a></li>
335 <li class="toctree-l2"><a class="reference internal" href="Replacing.html">Replacing Functions in the Dictionary</a></li>
336 <li class="toctree-l2"><a class="reference internal" href="Recursion_Combinators.html">Recursion Combinators</a></li>
337 <li class="toctree-l2"><a class="reference internal" href="Ordered_Binary_Trees.html">Treating Trees I: Ordered Binary Trees</a></li>
338 <li class="toctree-l2"><a class="reference internal" href="Treestep.html">Treating Trees II: <code class="docutils literal notranslate"><span class="pre">treestep</span></code></a></li>
339 <li class="toctree-l2"><a class="reference internal" href="Generator_Programs.html">Using <code class="docutils literal notranslate"><span class="pre">x</span></code> to Generate Values</a></li>
340 <li class="toctree-l2"><a class="reference internal" href="Newton-Raphson.html">Newton’s method</a></li>
341 <li class="toctree-l2"><a class="reference internal" href="Square_Spiral.html">Square Spiral Example Joy Code</a></li>
342 <li class="toctree-l2 current"><a class="current reference internal" href="#">Traversing Datastructures with Zippers</a></li>
343 <li class="toctree-l2"><a class="reference internal" href="Types.html">The Blissful Elegance of Typing Joy</a></li>
344 <li class="toctree-l2"><a class="reference internal" href="TypeChecking.html">Type Checking</a></li>
345 <li class="toctree-l2"><a class="reference internal" href="NoUpdates.html">No Updates</a></li>
346 <li class="toctree-l2"><a class="reference internal" href="Categorical.html">Categorical Programming</a></li>
347 <li class="toctree-l2"><a class="reference internal" href="The_Four_Operations.html">The Four Fundamental Operations of Definite Action</a></li>
348 <li class="toctree-l2"><a class="reference internal" href="Derivatives_of_Regular_Expressions.html">∂RE</a></li>
349 </ul>
350 </li>
351 </ul>
352
353 <div class="relations">
354 <h3>Related Topics</h3>
355 <ul>
356   <li><a href="../index.html">Documentation overview</a><ul>
357   <li><a href="index.html">Essays about Programming in Joy</a><ul>
358       <li>Previous: <a href="Square_Spiral.html" title="previous chapter">Square Spiral Example Joy Code</a></li>
359       <li>Next: <a href="Types.html" title="next chapter">The Blissful Elegance of Typing Joy</a></li>
360   </ul></li>
361   </ul></li>
362 </ul>
363 </div>
364 <div id="searchbox" style="display: none" role="search">
365   <h3 id="searchlabel">Quick search</h3>
366     <div class="searchformwrapper">
367     <form class="search" action="../search.html" method="get">
368       <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
369       <input type="submit" value="Go" />
370     </form>
371     </div>
372 </div>
373 <script>$('#searchbox').show(0);</script>
374
375
376
377
378
379
380
381
382         </div>
383       </div>
384       <div class="clearer"></div>
385     </div>
386     <div class="footer" role="contentinfo">
387 <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">
388 <img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" />
389 </a>
390 <br />
391 <span xmlns:dct="http://purl.org/dc/terms/" property="dct:title">Thun Documentation</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="https://joypy.osdn.io/" property="cc:attributionName" rel="cc:attributionURL">Simon Forman</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.<br />Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://osdn.net/projects/joypy/" rel="dct:source">https://osdn.net/projects/joypy/</a>.
392       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 4.3.0.
393     </div>
394
395   </body>
396 </html>