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
132
133
134
|
<!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/8.0">
<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-light">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Constant { color: #008787; }
.muRecipe { color: #ff8700; }
.Delimiter { color: #c000c0; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Comment { color: #005faf; }
.traceContains { color: #005f00; }
-->
</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();'>
<a href='https://github.com/akkartik/mu/blob/master/044space_surround.cc'>https://github.com/akkartik/mu/blob/master/044space_surround.cc</a>
<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 2 in space 1 (remember that locations 0 and 1 are reserved in all</span>
<span id="L9" class="LineNr"> 9 </span><span class="Comment"># spaces) refers to the space surrounding the default space, here 20.</span>
<span id="L10" class="LineNr">10 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L11" class="LineNr">11 </span> <span class="Comment"># prepare default-space address</span>
<span id="L12" class="LineNr">12 </span> <span class="Constant">10</span>:num/alloc-id<span class="Delimiter">,</span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1000</span>
<span id="L13" class="LineNr">13 </span> <span class="Comment"># prepare default-space payload</span>
<span id="L14" class="LineNr">14 </span> <span class="Constant">1000</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># alloc id of payload</span>
<span id="L15" class="LineNr">15 </span> <span class="Constant">1001</span>:num<span class="Special"> <- </span>copy <span class="Constant">5</span> <span class="Comment"># length</span>
<span id="L16" class="LineNr">16 </span> <span class="Comment"># prepare address of chained space</span>
<span id="L17" class="LineNr">17 </span> <span class="Constant">20</span>:num/alloc-id<span class="Delimiter">,</span> <span class="Constant">21</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">2000</span>
<span id="L18" class="LineNr">18 </span> <span class="Comment"># prepare payload of chained space</span>
<span id="L19" class="LineNr">19 </span> <span class="Constant">2000</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># alloc id of payload</span>
<span id="L20" class="LineNr">20 </span> <span class="Constant">2001</span>:num<span class="Special"> <- </span>copy <span class="Constant">5</span> <span class="Comment"># length</span>
<span id="L21" class="LineNr">21 </span> <span class="Comment"># actual start of this recipe</span>
<span id="L22" class="LineNr">22 </span> <span class="Normal">default</span>-space:space<span class="Special"> <- </span>copy <span class="Constant">10</span>:space
<span id="L23" class="LineNr">23 </span> <span class="Comment">#: later layers will explain the /names: property</span>
<span id="L24" class="LineNr">24 </span> <span class="Constant">0</span>:space/names:dummy<span class="Special"> <- </span>copy <span class="Constant">20</span>:space/<span class="Special">raw</span>
<span id="L25" class="LineNr">25 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">94</span>
<span id="L26" class="LineNr">26 </span> <span class="Constant">2</span>:num/space:<span class="Constant">1</span><span class="Special"> <- </span>copy <span class="Constant">95</span>
<span id="L27" class="LineNr">27 </span>]
<span id="L28" class="LineNr">28 </span><span class="muRecipe">def</span> dummy [ <span class="Comment"># just for the /names: property above</span>
<span id="L29" class="LineNr">29 </span>]
<span id="L30" class="LineNr">30 </span><span class="Comment"># chain space: 1000 + (alloc id) 1 + (length) 1</span>
<span id="L31" class="LineNr">31 </span><span class="traceContains">+mem: storing 0 in location 1002</span>
<span id="L32" class="LineNr">32 </span><span class="traceContains">+mem: storing 2000 in location 1003</span>
<span id="L33" class="LineNr">33 </span><span class="Comment"># store to default space: 1000 + (alloc id) 1 + (length) 1 + (index) 2</span>
<span id="L34" class="LineNr">34 </span><span class="traceContains">+mem: storing 94 in location 1004</span>
<span id="L35" class="LineNr">35 </span><span class="Comment"># store to chained space: (contents of location 1003) 2000 + (alloc id) 1 + (length) 1 + (index) 2</span>
<span id="L36" class="LineNr">36 </span><span class="traceContains">+mem: storing 95 in location 2004</span>
<span id="L37" class="LineNr">37 </span>
<span id="L38" class="LineNr">38 </span><span class="Comment">//: If you think of a space as a collection of variables with a common</span>
<span id="L39" class="LineNr">39 </span><span class="Comment">//: lifetime, surrounding allows managing shorter lifetimes inside a longer</span>
<span id="L40" class="LineNr">40 </span><span class="Comment">//: one.</span>
<span id="L41" class="LineNr">41 </span>
<span id="L42" class="LineNr">42 </span><span class="Delimiter">:(replace{} "int space_base(const reagent& x)")</span>
<span id="L43" class="LineNr">43 </span><span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L44" class="LineNr">44 </span> <span class="Normal">int</span> base = <a href='026call.cc.html#L83'>current_call</a><span class="Delimiter">().</span>default_space ? <span class="Delimiter">(</span><a href='026call.cc.html#L83'>current_call</a><span class="Delimiter">().</span>default_space+<span class="Comment">/*</span><span class="Comment">skip alloc id</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="L45" class="LineNr">45 </span> <span class="Identifier">return</span> space_base<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <a href='044space_surround.cc.html#L56'>space_index</a><span class="Delimiter">(</span>x<span class="Delimiter">),</span> base<span class="Delimiter">);</span>
<span id="L46" class="LineNr">46 </span><span class="Delimiter">}</span>
<span id="L47" class="LineNr">47 </span>
<span id="L48" class="LineNr">48 </span><span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">int</span> <a href='044space_surround.cc.html#L56'>space_index</a><span class="Delimiter">,</span> <span class="Normal">int</span> base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L49" class="LineNr">49 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='044space_surround.cc.html#L56'>space_index</a> == <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L50" class="LineNr">50 </span> <span class="Identifier">return</span> base<span class="Delimiter">;</span>
<span id="L51" class="LineNr">51 </span> <span class="Normal">double</span> chained_space_address = base+<span class="Comment">/*</span><span class="Comment">skip length</span><span class="Comment">*/</span><span class="Constant">1</span>+<span class="Comment">/*</span><span class="Comment">skip alloc id of chaining slot</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L52" class="LineNr">52 </span> <span class="Normal">double</span> chained_space_base = <a href='001help.cc.html#L229'>get_or_insert</a><span class="Delimiter">(</span><span class="Special">Memory</span><span class="Delimiter">,</span> chained_space_address<span class="Delimiter">)</span> + <span class="Comment">/*</span><span class="Comment">skip alloc id of chained space</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L53" class="LineNr">53 </span> <span class="Identifier">return</span> space_base<span class="Delimiter">(</span>x<span class="Delimiter">,</span> space_index-<span class="Constant">1</span><span class="Delimiter">,</span> chained_space_base<span class="Delimiter">);</span>
<span id="L54" class="LineNr">54 </span><span class="Delimiter">}</span>
<span id="L55" class="LineNr">55 </span>
<span id="L56" class="LineNr">56 </span><span class="Normal">int</span> <a href='044space_surround.cc.html#L56'>space_index</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L57" class="LineNr">57 </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 < <a href='001help.cc.html#L141'>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="L58" class="LineNr">58 </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">"space"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L59" class="LineNr">59 </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">-></span>right<span class="Delimiter">)</span>
<span id="L60" class="LineNr">60 </span> <a href='003trace.cc.html#L196'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span><a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">())</span> << <span class="Constant">"/space metadata should take exactly one value in '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'\n"</span> << <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L61" class="LineNr">61 </span> <span class="Identifier">return</span> to_integer<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">-></span>value<span class="Delimiter">);</span>
<span id="L62" class="LineNr">62 </span> <span class="Delimiter">}</span>
<span id="L63" class="LineNr">63 </span> <span class="Delimiter">}</span>
<span id="L64" class="LineNr">64 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L65" class="LineNr">65 </span><span class="Delimiter">}</span>
<span id="L66" class="LineNr">66 </span>
<span id="L67" class="LineNr">67 </span><span class="Delimiter">:(scenario permit_space_as_variable_name)</span>
<span id="L68" class="LineNr">68 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L69" class="LineNr">69 </span> <span class="Normal">space</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span>
<span id="L70" class="LineNr">70 </span>]
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->
|