about summary refs log tree commit diff stats
path: root/html/044space_surround.cc.html
blob: b6455877f07c1efd85ada34d9ebccbd4597b0f1c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 044space_surround.cc</title>
<meta name="Generator" content="Vim/7.4">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="cpp">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
a { text-decoration: none; }
a:hover { text-decoration: underline; }
* { font-size: 12pt; font-size: 1em; }
.Constant { color: #00a0a0; }
.Special { color: #c00000; }
.muRecipe { color: #ff8700; }
.cSpecial { color: #008000; }
.Comment { color: #9090ff; }
.Delimiter { color: #800080; }
.LineNr { color: #444444; }
.traceContains { color: #008000; }
.Normal { color: #eeeeee; background-color: #080808; padding-bottom: 1px; }
.Identifier { color: #c0a020; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: So far you can have global variables by not setting default-space, and</span>
<span id="L2" class="LineNr"> 2 </span><span class="Comment">//: local variables by setting default-space. You can isolate variables</span>
<span id="L3" class="LineNr"> 3 </span><span class="Comment">//: between those extremes by creating 'surrounding' spaces.</span>
<span id="L4" class="LineNr"> 4 </span><span class="Comment">//:</span>
<span id="L5" class="LineNr"> 5 </span><span class="Comment">//: (Surrounding spaces are like lexical scopes in other languages.)</span>
<span id="L6" class="LineNr"> 6 </span>
<span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(scenario surrounding_space)</span>
<span id="L8" class="LineNr"> 8 </span><span class="Comment"># location 1 in space 1 refers to the space surrounding the default space, here 20.</span>
<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L10" class="LineNr">10 </span>  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
<span id="L11" class="LineNr">11 </span>  <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
<span id="L12" class="LineNr">12 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
<span id="L13" class="LineNr">13 </span>  <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
<span id="L14" class="LineNr">14 </span>  <span class="Constant">20</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># refcount</span>
<span id="L15" class="LineNr">15 </span>  <span class="Constant">21</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>  <span class="Comment"># length</span>
<span id="L16" class="LineNr">16 </span>  <span class="Comment"># actual start of this recipe</span>
<span id="L17" class="LineNr">17 </span>  <span class="Normal">default</span>-space:space<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe
<span id="L18" class="LineNr">18 </span>  <span class="Comment">#: later layers will explain the /names: property</span>
<span id="L19" class="LineNr">19 </span>  <span class="Constant">0</span>:space/names:dummy<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe
<span id="L20" class="LineNr">20 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">32</span>
<span id="L21" class="LineNr">21 </span>  <span class="Constant">1</span>:num/space:<span class="Constant">1</span><span class="Special"> &lt;- </span>copy <span class="Constant">33</span>
<span id="L22" class="LineNr">22 </span>]
<span id="L23" class="LineNr">23 </span><span class="muRecipe">def</span> dummy [  <span class="Comment"># just for the /names: property above</span>
<span id="L24" class="LineNr">24 </span>]
<span id="L25" class="LineNr">25 </span><span class="Comment"># chain space: 10 + (refcount and length) 2</span>
<span id="L26" class="LineNr">26 </span><span class="traceContains">+mem: storing 20 in location 12</span>
<span id="L27" class="LineNr">27 </span><span class="Comment"># store to default space: 10 + (skip refcount and length) 2 + (index) 1</span>
<span id="L28" class="LineNr">28 </span><span class="traceContains">+mem: storing 32 in location 13</span>
<span id="L29" class="LineNr">29 </span><span class="Comment"># store to chained space: (contents of location 12) 20 + (refcount and length) 2 + (index) 1</span>
<span id="L30" class="LineNr">30 </span><span class="traceContains">+mem: storing 33 in location 23</span>
<span id="L31" class="LineNr">31 </span>
<span id="L32" class="LineNr">32 </span><span class="Delimiter">:(before &quot;End Checks For Reclaiming Locals&quot;)</span>
<span id="L33" class="LineNr">33 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='044space_surround.cc.html#L52'>space_index</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L34" class="LineNr">34 </span>
<span id="L35" class="LineNr">35 </span><span class="Comment">//: If you think of a space as a collection of variables with a common</span>
<span id="L36" class="LineNr">36 </span><span class="Comment">//: lifetime, surrounding allows managing shorter lifetimes inside a longer</span>
<span id="L37" class="LineNr">37 </span><span class="Comment">//: one.</span>
<span id="L38" class="LineNr">38 </span>
<span id="L39" class="LineNr">39 </span><span class="Delimiter">:(replace{} &quot;int space_base(const reagent&amp; x)&quot;)</span>
<span id="L40" class="LineNr">40 </span><span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L41" class="LineNr">41 </span>  <span class="Normal">int</span> base = current_call<span class="Delimiter">().</span>default_space ? <span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">)</span> : <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L42" class="LineNr">42 </span>  <span class="Identifier">return</span> space_base<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <a href='044space_surround.cc.html#L52'>space_index</a><span class="Delimiter">(</span>x<span class="Delimiter">),</span> base<span class="Delimiter">);</span>
<span id="L43" class="LineNr">43 </span><span class="Delimiter">}</span>
<span id="L44" class="LineNr">44 </span>
<span id="L45" class="LineNr">45 </span><span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">int</span> <a href='044space_surround.cc.html#L52'>space_index</a><span class="Delimiter">,</span> <span class="Normal">int</span> base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L46" class="LineNr">46 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='044space_surround.cc.html#L52'>space_index</a> == <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L47" class="LineNr">47 </span>    <span class="Identifier">return</span> base<span class="Delimiter">;</span>
<span id="L48" class="LineNr">48 </span>  <span class="Normal">int</span> result = space_base<span class="Delimiter">(</span>x<span class="Delimiter">,</span> space_index-<span class="Constant">1</span><span class="Delimiter">,</span> <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base+<span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">))</span>+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L49" class="LineNr">49 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L50" class="LineNr">50 </span><span class="Delimiter">}</span>
<span id="L51" class="LineNr">51 </span>
<span id="L52" class="LineNr">52 </span><span class="Normal">int</span> <a href='044space_surround.cc.html#L52'>space_index</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L53" class="LineNr">53 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L54" class="LineNr">54 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first == <span class="Constant">&quot;space&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L55" class="LineNr">55 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second || x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span>
<span id="L56" class="LineNr">56 </span>        <a href='003trace.cc.html#L178'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;/space metadata should take exactly one value in '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span>
<span id="L57" class="LineNr">57 </span>      <span class="Identifier">return</span> <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
<span id="L58" class="LineNr">58 </span>    <span class="Delimiter">}</span>
<span id="L59" class="LineNr">59 </span>  <span class="Delimiter">}</span>
<span id="L60" class="LineNr">60 </span>  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L61" class="LineNr">61 </span><span class="Delimiter">}</span>
<span id="L62" class="LineNr">62 </span>
<span id="L63" class="LineNr">63 </span><span class="Delimiter">:(scenario permit_space_as_variable_name)</span>
<span id="L64" class="LineNr">64 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L65" class="LineNr">65 </span>  <span class="Normal">space</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
<span id="L66" class="LineNr">66 </span>]
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->