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
135
136
137
138
139
140
141
142
143
144
145
146
147
|
<!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 - 046global.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 we have local variables, and we can nest local variables of short</span>
<span id="L2" class="LineNr"> 2 </span><span class="Comment">//: lifetimes inside longer ones. Now let's support 'global' variables that</span>
<span id="L3" class="LineNr"> 3 </span><span class="Comment">//: last for the life of a routine. If we create multiple routines they won't</span>
<span id="L4" class="LineNr"> 4 </span><span class="Comment">//: have access to each other's globals.</span>
<span id="L5" class="LineNr"> 5 </span><span class="Comment">//:</span>
<span id="L6" class="LineNr"> 6 </span><span class="Comment">//: This feature is still experimental and half-baked. You can't name global</span>
<span id="L7" class="LineNr"> 7 </span><span class="Comment">//: variables, and they don't get checked for types (the only known hole in</span>
<span id="L8" class="LineNr"> 8 </span><span class="Comment">//: the type system, can cause memory corruption). We might fix these issues</span>
<span id="L9" class="LineNr"> 9 </span><span class="Comment">//: if we ever use globals. Or we might just drop the feature entirely.</span>
<span id="L10" class="LineNr">10 </span><span class="Comment">//: [tag: todo]</span>
<span id="L11" class="LineNr">11 </span>
<span id="L12" class="LineNr">12 </span><span class="Delimiter">:(scenario global_space)</span>
<span id="L13" class="LineNr">13 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L14" class="LineNr">14 </span> <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
<span id="L15" class="LineNr">15 </span> <span class="Constant">10</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># refcount</span>
<span id="L16" class="LineNr">16 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">5</span> <span class="Comment"># length</span>
<span id="L17" class="LineNr">17 </span> <span class="Comment"># pretend address:array:location; in practice we'll use new</span>
<span id="L18" class="LineNr">18 </span> <span class="Constant">20</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># refcount</span>
<span id="L19" class="LineNr">19 </span> <span class="Constant">21</span>:num<span class="Special"> <- </span>copy <span class="Constant">5</span> <span class="Comment"># length</span>
<span id="L20" class="LineNr">20 </span> <span class="Comment"># actual start of this recipe</span>
<span id="L21" class="LineNr">21 </span> global-space:space<span class="Special"> <- </span>copy <span class="Constant">20</span>/unsafe
<span id="L22" class="LineNr">22 </span> <span class="Normal">default</span>-space:space<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe
<span id="L23" class="LineNr">23 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">23</span>
<span id="L24" class="LineNr">24 </span> <span class="Special">1:num/space:global</span><span class="Special"> <- </span>copy <span class="Constant">24</span>
<span id="L25" class="LineNr">25 </span>]
<span id="L26" class="LineNr">26 </span><span class="Comment"># store to default space: 10 + (skip refcount and length) 2 + (index) 1</span>
<span id="L27" class="LineNr">27 </span><span class="traceContains">+mem: storing 23 in location 13</span>
<span id="L28" class="LineNr">28 </span><span class="Comment"># store to chained space: (contents of location 12) 20 + (refcount and length) 2 + (index) 1</span>
<span id="L29" class="LineNr">29 </span><span class="traceContains">+mem: storing 24 in location 23</span>
<span id="L30" class="LineNr">30 </span>
<span id="L31" class="LineNr">31 </span><span class="Comment">//: to support it, create another special variable called global space</span>
<span id="L32" class="LineNr">32 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L99'>is_disqualified</a> Special-cases")</span>
<span id="L33" class="LineNr">33 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">"global-space"</span><span class="Delimiter">)</span>
<span id="L34" class="LineNr">34 </span> x<span class="Delimiter">.</span>initialized = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L35" class="LineNr">35 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L156'>is_special_name</a> Special-cases")</span>
<span id="L36" class="LineNr">36 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"global-space"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L37" class="LineNr">37 </span>
<span id="L38" class="LineNr">38 </span><span class="Comment">//: writes to this variable go to a field in the current routine</span>
<span id="L39" class="LineNr">39 </span><span class="Delimiter">:(before "End routine Fields")</span>
<span id="L40" class="LineNr">40 </span><span class="Normal">int</span> global_space<span class="Delimiter">;</span>
<span id="L41" class="LineNr">41 </span><span class="Delimiter">:(before "End routine Constructor")</span>
<span id="L42" class="LineNr">42 </span>global_space = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L43" class="LineNr">43 </span><span class="Delimiter">:(after "Begin Preprocess write_memory(x, data)")</span>
<span id="L44" class="LineNr">44 </span><span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">"global-space"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L45" class="LineNr">45 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!scalar<span class="Delimiter">(</span>data<span class="Delimiter">)</span> || !is_space<span class="Delimiter">(</span>x<span class="Delimiter">))</span>
<span id="L46" class="LineNr">46 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"'global-space' should be of type <a href='043space.cc.html#L76'>address</a>:array:location, but tried to write '"</span> << to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span>
<span id="L47" class="LineNr">47 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>global_space<span class="Delimiter">)</span>
<span id="L48" class="LineNr">48 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"routine already has a global-space; you can't over-write your globals"</span> << end<span class="Delimiter">();</span>
<span id="L49" class="LineNr">49 </span> Current_routine<span class="Delimiter">-></span>global_space = data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L50" class="LineNr">50 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L51" class="LineNr">51 </span><span class="Delimiter">}</span>
<span id="L52" class="LineNr">52 </span>
<span id="L53" class="LineNr">53 </span><span class="Comment">//: now marking variables as /space:global looks them up inside this field</span>
<span id="L54" class="LineNr">54 </span><span class="Delimiter">:(after "int space_base(const reagent& x)")</span>
<span id="L55" class="LineNr">55 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='046global.cc.html#L79'>is_global</a><span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L56" class="LineNr">56 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-></span>global_space<span class="Delimiter">)</span>
<span id="L57" class="LineNr">57 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"routine has no global space</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span>
<span id="L58" class="LineNr">58 </span> <span class="Identifier">return</span> Current_routine<span class="Delimiter">-></span>global_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 id="L59" class="LineNr">59 </span> <span class="Delimiter">}</span>
<span id="L60" class="LineNr">60 </span>
<span id="L61" class="LineNr">61 </span><span class="Comment">//: for now let's not bother giving global variables names.</span>
<span id="L62" class="LineNr">62 </span><span class="Comment">//: don't want to make them too comfortable to use.</span>
<span id="L63" class="LineNr">63 </span>
<span id="L64" class="LineNr">64 </span><span class="Delimiter">:(scenario global_space_with_names)</span>
<span id="L65" class="LineNr">65 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L66" class="LineNr">66 </span> global-space:space<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">10</span>
<span id="L67" class="LineNr">67 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">23</span>
<span id="L68" class="LineNr">68 </span> <span class="Special">1:num/space:global</span><span class="Special"> <- </span>copy <span class="Constant">24</span>
<span id="L69" class="LineNr">69 </span>]
<span id="L70" class="LineNr">70 </span><span class="Comment"># don't complain about mixing numeric addresses and names</span>
<span id="L71" class="LineNr">71 </span>$error: <span class="Constant">0</span>
<span id="L72" class="LineNr">72 </span>
<span id="L73" class="LineNr">73 </span><span class="Delimiter">:(after "bool is_numeric_location(const reagent& x)")</span>
<span id="L74" class="LineNr">74 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='046global.cc.html#L79'>is_global</a><span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L75" class="LineNr">75 </span>
<span id="L76" class="LineNr">76 </span><span class="Comment">//: helpers</span>
<span id="L77" class="LineNr">77 </span>
<span id="L78" class="LineNr">78 </span><span class="Delimiter">:(code)</span>
<span id="L79" class="LineNr">79 </span><span class="Normal">bool</span> <a href='046global.cc.html#L79'>is_global</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L80" class="LineNr">80 </span> string_tree* s = property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">"space"</span><span class="Delimiter">);</span>
<span id="L81" class="LineNr">81 </span> <span class="Identifier">return</span> s && s<span class="Delimiter">-></span>atom && s<span class="Delimiter">-></span>value == <span class="Constant">"global"</span><span class="Delimiter">;</span>
<span id="L82" class="LineNr">82 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->
|