diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-07-12 00:11:56 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-07-12 00:11:56 -0700 |
commit | d5d908dda655c791329563522faad42d7e4ee618 (patch) | |
tree | 628b8a23e13878c45ef39dfbffb860c676da5304 /html | |
parent | 9864bdd0792b697d7b03e692ba7f82cf5669c41c (diff) | |
download | mu-d5d908dda655c791329563522faad42d7e4ee618.tar.gz |
1766
Diffstat (limited to 'html')
44 files changed, 1845 insertions, 1997 deletions
diff --git a/html/010vm.cc.html b/html/010vm.cc.html index eea4faf3..6e76f36f 100644 --- a/html/010vm.cc.html +++ b/html/010vm.cc.html @@ -15,11 +15,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } * { font-size: 1.05em; } .cSpecial { color: #008000; } .Constant { color: #00a0a0; } -.PreProc { color: #c000c0; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .SalientComment { color: #00ffff; } .CommentedCode { color: #6c6c6c; } +.PreProc { color: #c000c0; } .Identifier { color: #804000; } --> </style> @@ -32,17 +32,24 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } </head> <body> <pre id='vimCodeElement'> -<span class="Delimiter">:(after "Types")</span> -<span class="Comment">// A program is a book of 'recipes' (functions)</span> -typedef long long int recipe_number<span class="Delimiter">;</span> +<span class="Comment">//: A program is a book of 'recipes' (functions)</span> <span class="Delimiter">:(before "End Globals")</span> -map<string<span class="Delimiter">,</span> recipe_number> Recipe_number<span class="Delimiter">;</span> -map<recipe_number<span class="Delimiter">,</span> recipe> Recipe<span class="Delimiter">;</span> -recipe_number Next_recipe_number = <span class="Constant">1</span><span class="Delimiter">;</span> +<span class="Comment">//: Each recipe is stored at a specific page number, or ordinal.</span> +map<recipe_ordinal<span class="Delimiter">,</span> recipe> Recipe<span class="Delimiter">;</span> +<span class="Comment">//: You can also refer to each recipe by its name.</span> +map<string<span class="Delimiter">,</span> recipe_ordinal> Recipe_ordinal<span class="Delimiter">;</span> +recipe_ordinal Next_recipe_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span> + +<span class="Comment">//: Ordinals are like numbers, except you can't do arithmetic on them. Ordinal</span> +<span class="Comment">//: 1 is not less than 2, it's just different. Phone numbers are ordinals;</span> +<span class="Comment">//: adding two phone numbers is meaningless. Here each recipe does something</span> +<span class="Comment">//: incommensurable with any other recipe.</span> +<span class="Delimiter">:(after "Types")</span> +typedef long long int recipe_ordinal<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Types")</span> -<span class="Comment">// Recipes are lists of instructions. To run a recipe, the computer runs its</span> -<span class="Comment">// instructions.</span> +<span class="Comment">// Recipes are lists of instructions. To perform or 'run' a recipe, the</span> +<span class="Comment">// computer runs its instructions.</span> struct recipe <span class="Delimiter">{</span> string name<span class="Delimiter">;</span> vector<instruction> steps<span class="Delimiter">;</span> @@ -59,7 +66,7 @@ struct instruction <span class="Delimiter">{</span> bool is_label<span class="Delimiter">;</span> string label<span class="Delimiter">;</span> <span class="Comment">// only if is_label</span> string name<span class="Delimiter">;</span> <span class="Comment">// only if !is_label</span> - recipe_number operation<span class="Delimiter">;</span> <span class="Comment">// Recipe_number[name]</span> + recipe_ordinal operation<span class="Delimiter">;</span> <span class="Comment">// Recipe_ordinal[name]</span> vector<reagent> ingredients<span class="Delimiter">;</span> <span class="Comment">// only if !is_label</span> vector<reagent> products<span class="Delimiter">;</span> <span class="Comment">// only if !is_label</span> instruction<span class="Delimiter">();</span> @@ -78,7 +85,7 @@ struct reagent <span class="Delimiter">{</span> string name<span class="Delimiter">;</span> double value<span class="Delimiter">;</span> bool initialized<span class="Delimiter">;</span> - vector<type_number> types<span class="Delimiter">;</span> + vector<type_ordinal> types<span class="Delimiter">;</span> reagent<span class="Delimiter">(</span>string s<span class="Delimiter">);</span> reagent<span class="Delimiter">();</span> void set_value<span class="Delimiter">(</span>double v<span class="Delimiter">)</span> <span class="Delimiter">{</span> value = v<span class="Delimiter">;</span> initialized = <span class="Constant">true</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -105,29 +112,29 @@ Memory<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> <span class="Comment">// Unlike most computers today, mu stores types in a single big table, shared</span> <span class="Comment">// by all the mu programs on the computer. This is useful in providing a</span> <span class="Comment">// seamless experience to help understand arbitrary mu programs.</span> -typedef long long int type_number<span class="Delimiter">;</span> +typedef long long int type_ordinal<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Globals")</span> -map<string<span class="Delimiter">,</span> type_number> Type_number<span class="Delimiter">;</span> -map<type_number<span class="Delimiter">,</span> type_info> Type<span class="Delimiter">;</span> -type_number Next_type_number = <span class="Constant">1</span><span class="Delimiter">;</span> +map<string<span class="Delimiter">,</span> type_ordinal> Type_ordinal<span class="Delimiter">;</span> +map<type_ordinal<span class="Delimiter">,</span> type_info> Type<span class="Delimiter">;</span> +type_ordinal Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span> <span class="Delimiter">:(code)</span> void setup_types<span class="Delimiter">()</span> <span class="Delimiter">{</span> - Type<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> Type_number<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> - Type_number[<span class="Constant">"literal"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> - Next_type_number = <span class="Constant">1</span><span class="Delimiter">;</span> + Type<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> Type_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> + Type_ordinal[<span class="Constant">"literal"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> + Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span> <span class="Comment">// Mu Types Initialization</span> - type_number number = Type_number[<span class="Constant">"number"</span>] = Next_type_number++<span class="Delimiter">;</span> - Type_number[<span class="Constant">"location"</span>] = Type_number[<span class="Constant">"number"</span>]<span class="Delimiter">;</span> <span class="Comment">// wildcard type: either a pointer or a scalar</span> + type_ordinal number = Type_ordinal[<span class="Constant">"number"</span>] = Next_type_ordinal++<span class="Delimiter">;</span> + Type_ordinal[<span class="Constant">"location"</span>] = Type_ordinal[<span class="Constant">"number"</span>]<span class="Delimiter">;</span> <span class="Comment">// wildcard type: either a pointer or a scalar</span> Type[number]<span class="Delimiter">.</span>name = <span class="Constant">"number"</span><span class="Delimiter">;</span> - type_number address = Type_number[<span class="Constant">"address"</span>] = Next_type_number++<span class="Delimiter">;</span> + type_ordinal address = Type_ordinal[<span class="Constant">"address"</span>] = Next_type_ordinal++<span class="Delimiter">;</span> Type[address]<span class="Delimiter">.</span>name = <span class="Constant">"address"</span><span class="Delimiter">;</span> - type_number boolean = Type_number[<span class="Constant">"boolean"</span>] = Next_type_number++<span class="Delimiter">;</span> + type_ordinal boolean = Type_ordinal[<span class="Constant">"boolean"</span>] = Next_type_ordinal++<span class="Delimiter">;</span> Type[boolean]<span class="Delimiter">.</span>name = <span class="Constant">"boolean"</span><span class="Delimiter">;</span> - type_number character = Type_number[<span class="Constant">"character"</span>] = Next_type_number++<span class="Delimiter">;</span> + type_ordinal character = Type_ordinal[<span class="Constant">"character"</span>] = Next_type_ordinal++<span class="Delimiter">;</span> Type[character]<span class="Delimiter">.</span>name = <span class="Constant">"character"</span><span class="Delimiter">;</span> <span class="Comment">// Array types are a special modifier to any other type. For example,</span> <span class="Comment">// array:number or array:address:boolean.</span> - type_number array = Type_number[<span class="Constant">"array"</span>] = Next_type_number++<span class="Delimiter">;</span> + type_ordinal array = Type_ordinal[<span class="Constant">"array"</span>] = Next_type_ordinal++<span class="Delimiter">;</span> Type[array]<span class="Delimiter">.</span>name = <span class="Constant">"array"</span><span class="Delimiter">;</span> <span class="Comment">// End Mu Types Initialization</span> <span class="Delimiter">}</span> @@ -155,7 +162,7 @@ struct type_info <span class="Delimiter">{</span> string name<span class="Delimiter">;</span> kind_of_type kind<span class="Delimiter">;</span> long long int size<span class="Delimiter">;</span> <span class="Comment">// only if type is not primitive; primitives and addresses have size 1 (except arrays are dynamic)</span> - vector<vector<type_number> > elements<span class="Delimiter">;</span> + vector<vector<type_ordinal> > elements<span class="Delimiter">;</span> vector<string> element_names<span class="Delimiter">;</span> <span class="Comment">// End type_info Fields</span> type_info<span class="Delimiter">()</span> :kind<span class="Delimiter">(</span>primitive<span class="Delimiter">),</span> size<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span> @@ -173,10 +180,10 @@ enum primitive_recipes <span class="Delimiter">{</span> <span class="Comment">//: recipes there are only codes, no entries in the book, because mu just knows</span> <span class="Comment">//: what to do for them.</span> void setup_recipes<span class="Delimiter">()</span> <span class="Delimiter">{</span> - Recipe<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> Recipe_number<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> - Recipe_number[<span class="Constant">"idle"</span>] = IDLE<span class="Delimiter">;</span> + Recipe<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> Recipe_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> + Recipe_ordinal[<span class="Constant">"idle"</span>] = IDLE<span class="Delimiter">;</span> <span class="Comment">// Primitive Recipe Numbers</span> - Recipe_number[<span class="Constant">"copy"</span>] = COPY<span class="Delimiter">;</span> + Recipe_ordinal[<span class="Constant">"copy"</span>] = COPY<span class="Delimiter">;</span> <span class="Comment">// End Primitive Recipe Numbers</span> <span class="Delimiter">}</span> <span class="Comment">//: We could just reset the recipe table after every test, but that gets slow</span> @@ -186,12 +193,12 @@ void setup_recipes<span class="Delimiter">()</span> <span class="Delimiter">{</s <span class="Delimiter">:(before "End One-time Setup")</span> setup_recipes<span class="Delimiter">();</span> assert<span class="Delimiter">(</span>MAX_PRIMITIVE_RECIPES < <span class="Constant">100</span><span class="Delimiter">);</span> <span class="Comment">// level 0 is primitives; until 99</span> -Next_recipe_number = <span class="Constant">100</span><span class="Delimiter">;</span> +Next_recipe_ordinal = <span class="Constant">100</span><span class="Delimiter">;</span> <span class="Comment">// End Load Recipes</span> <span class="Delimiter">:(before "End Test Run Initialization")</span> -assert<span class="Delimiter">(</span>Next_recipe_number < <span class="Constant">1000</span><span class="Delimiter">);</span> <span class="Comment">// recipes being tested didn't overflow into test space</span> +assert<span class="Delimiter">(</span>Next_recipe_ordinal < <span class="Constant">1000</span><span class="Delimiter">);</span> <span class="Comment">// recipes being tested didn't overflow into test space</span> <span class="Delimiter">:(before "End Setup")</span> -Next_recipe_number = <span class="Constant">1000</span><span class="Delimiter">;</span> <span class="Comment">// consistent new numbers for each test</span> +Next_recipe_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span> <span class="Comment">// consistent new numbers for each test</span> ^L @@ -219,11 +226,15 @@ reagent::reagent<span class="Delimiter">(</span>string s<span class="Delimiter"> name = properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>first<span class="Delimiter">;</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> string type = properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> - if <span class="Delimiter">(</span>Type_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>type<span class="Delimiter">)</span> == Type_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> -<span class="CommentedCode">//? cerr << type << " is " << Next_type_number << '\n'; //? 1</span> - Type_number[type] = Next_type_number++<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>type<span class="Delimiter">)</span> == Type_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span class="CommentedCode">//? cerr << type << " is " << Next_type_ordinal << '\n'; //? 1</span> + Type_ordinal[type] = Next_type_ordinal++<span class="Delimiter">;</span> <span class="Delimiter">}</span> - types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[type]<span class="Delimiter">);</span> + types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[type]<span class="Delimiter">);</span> + <span class="Delimiter">}</span> + if <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>name<span class="Delimiter">)</span> && types<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> + types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> + properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><span class="Constant">"literal"</span><span class="Delimiter">);</span> <span class="Delimiter">}</span> if <span class="Delimiter">(</span>name == <span class="Constant">"_"</span> && types<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> diff --git a/html/011load.cc.html b/html/011load.cc.html index 83b4d64c..e8ea5c5c 100644 --- a/html/011load.cc.html +++ b/html/011load.cc.html @@ -44,15 +44,15 @@ recipe main [ <span class="traceContains">+parse: product: {name: "1", properties: ["1": "number"]}</span> <span class="Delimiter">:(code)</span> -vector<recipe_number> load<span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span> +vector<recipe_ordinal> load<span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span> istringstream in<span class="Delimiter">(</span>form<span class="Delimiter">);</span> in >> std::noskipws<span class="Delimiter">;</span> <span class="Identifier">return</span> load<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span class="Delimiter">}</span> -vector<recipe_number> load<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +vector<recipe_ordinal> load<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> in >> std::noskipws<span class="Delimiter">;</span> - vector<recipe_number> result<span class="Delimiter">;</span> + vector<recipe_ordinal> result<span class="Delimiter">;</span> while <span class="Delimiter">(</span>!in<span class="Delimiter">.</span>eof<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << "===\n"; //? 1</span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> @@ -64,20 +64,20 @@ vector<recipe_number> load<span class="Delimiter">(</span>istream& in< <span class="CommentedCode">//? cerr << "recipe: " << recipe_name << '\n'; //? 1</span> if <span class="Delimiter">(</span>recipe_name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> raise << <span class="Constant">"empty recipe name</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> - if <span class="Delimiter">(</span>Recipe_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> == Recipe_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> - Recipe_number[recipe_name] = Next_recipe_number++<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> == Recipe_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> + Recipe_ordinal[recipe_name] = Next_recipe_ordinal++<span class="Delimiter">;</span> <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>Recipe<span class="Delimiter">.</span>find<span class="Delimiter">(</span>Recipe_number[recipe_name]<span class="Delimiter">)</span> != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> - raise << <span class="Constant">"redefining recipe "</span> << Recipe[Recipe_number[recipe_name]]<span class="Delimiter">.</span>name << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> - Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe_number[recipe_name]<span class="Delimiter">);</span> + if <span class="Delimiter">(</span>Recipe<span class="Delimiter">.</span>find<span class="Delimiter">(</span>Recipe_ordinal[recipe_name]<span class="Delimiter">)</span> != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>!Loading_interactive<span class="Delimiter">)</span> raise << <span class="Constant">"redefining recipe "</span> << Recipe[Recipe_ordinal[recipe_name]]<span class="Delimiter">.</span>name << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> + Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe_ordinal[recipe_name]<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Comment">// todo: save user-defined recipes to mu's memory</span> - Recipe[Recipe_number[recipe_name]] = slurp_recipe<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span class="CommentedCode">//? cerr << Recipe_number[recipe_name] << ": " << recipe_name << '\n'; //? 1</span> - Recipe[Recipe_number[recipe_name]]<span class="Delimiter">.</span>name = recipe_name<span class="Delimiter">;</span> + Recipe[Recipe_ordinal[recipe_name]] = slurp_recipe<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span class="CommentedCode">//? cerr << Recipe_ordinal[recipe_name] << ": " << recipe_name << '\n'; //? 1</span> + Recipe[Recipe_ordinal[recipe_name]]<span class="Delimiter">.</span>name = recipe_name<span class="Delimiter">;</span> <span class="Comment">// track added recipes because we may need to undo them in tests; see below</span> - recently_added_recipes<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Recipe_number[recipe_name]<span class="Delimiter">);</span> - result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Recipe_number[recipe_name]<span class="Delimiter">);</span> + recently_added_recipes<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Recipe_ordinal[recipe_name]<span class="Delimiter">);</span> + result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Recipe_ordinal[recipe_name]<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Comment">// End Command Handlers</span> else <span class="Delimiter">{</span> @@ -150,14 +150,14 @@ bool next_instruction<span class="Delimiter">(</span>istream& in<span class= if <span class="Delimiter">(</span>p == words<span class="Delimiter">.</span>end<span class="Delimiter">())</span> raise << <span class="Constant">"instruction prematurely ended with '<-'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << die<span class="Delimiter">();</span> curr<span class="Delimiter">-></span>name = *p<span class="Delimiter">;</span> - if <span class="Delimiter">(</span>Recipe_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>*p<span class="Delimiter">)</span> == Recipe_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> - Recipe_number[*p] = Next_recipe_number++<span class="Delimiter">;</span> -<span class="CommentedCode">//? cout << "AAA: " << *p << " is now " << Recipe_number[*p] << '\n'; //? 1</span> + if <span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>*p<span class="Delimiter">)</span> == Recipe_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> + Recipe_ordinal[*p] = Next_recipe_ordinal++<span class="Delimiter">;</span> +<span class="CommentedCode">//? cout << "AAA: " << *p << " is now " << Recipe_ordinal[*p] << '\n'; //? 1</span> <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>Recipe_number[*p] == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>Recipe_ordinal[*p] == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> raise << <span class="Constant">"Recipe "</span> << *p << <span class="Constant">" has number 0, which is reserved for IDLE.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << die<span class="Delimiter">();</span> <span class="Delimiter">}</span> - curr<span class="Delimiter">-></span>operation = Recipe_number[*p]<span class="Delimiter">;</span> ++p<span class="Delimiter">;</span> + curr<span class="Delimiter">-></span>operation = Recipe_ordinal[*p]<span class="Delimiter">;</span> ++p<span class="Delimiter">;</span> for <span class="Delimiter">(;</span> p != words<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>*p == <span class="Constant">","</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> @@ -248,11 +248,11 @@ void show_rest_of_stream<span class="Delimiter">(</span>istream& in<span cla <span class="Comment">//: Have tests clean up any recipes they added.</span> <span class="Delimiter">:(before "End Globals")</span> -vector<recipe_number> recently_added_recipes<span class="Delimiter">;</span> +vector<recipe_ordinal> recently_added_recipes<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Setup")</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>recently_added_recipes<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cout << "AAA clearing " << Recipe[recently_added_recipes.at(i)].name << '\n'; //? 2</span> - Recipe_number<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe[recently_added_recipes<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span>]<span class="Delimiter">.</span>name<span class="Delimiter">);</span> + Recipe_ordinal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe[recently_added_recipes<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span>]<span class="Delimiter">.</span>name<span class="Delimiter">);</span> Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>recently_added_recipes<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> <span class="Delimiter">}</span> <span class="Comment">// Clear Other State For recently_added_recipes</span> diff --git a/html/012transform.cc.html b/html/012transform.cc.html index fd16c8d7..407e5be7 100644 --- a/html/012transform.cc.html +++ b/html/012transform.cc.html @@ -39,7 +39,7 @@ long long int transformed_until<span class="Delimiter">;</span> recipe<span class="Delimiter">()</span> :transformed_until<span class="Delimiter">(</span>-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span> <span class="Delimiter">:(before "End Types")</span> -typedef void <span class="Delimiter">(</span>*transform_fn<span class="Delimiter">)(</span>recipe_number<span class="Delimiter">);</span> +typedef void <span class="Delimiter">(</span>*transform_fn<span class="Delimiter">)(</span>recipe_ordinal<span class="Delimiter">);</span> <span class="Delimiter">:(before "End Globals")</span> vector<transform_fn> Transform<span class="Delimiter">;</span> @@ -48,11 +48,11 @@ vector<transform_fn> Transform<span class="Delimiter">;</span> void transform_all<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << "AAA transform_all\n"; //? 2</span> for <span class="Delimiter">(</span>long long int t = <span class="Constant">0</span><span class="Delimiter">;</span> t < SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">);</span> ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span> - for <span class="Delimiter">(</span>map<recipe_number<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> + for <span class="Delimiter">(</span>map<recipe_ordinal<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> recipe& r = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>transformed_until != t-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> - <span class="Delimiter">(</span>*Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">))(</span><span class="Comment">/*</span><span class="Comment">recipe_number</span><span class="Comment">*/</span>p<span class="Delimiter">-></span>first<span class="Delimiter">);</span> + <span class="Delimiter">(</span>*Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">))(</span><span class="Comment">/*</span><span class="Comment">recipe_ordinal</span><span class="Comment">*/</span>p<span class="Delimiter">-></span>first<span class="Delimiter">);</span> r<span class="Delimiter">.</span>transformed_until = t<span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> @@ -61,7 +61,7 @@ void transform_all<span class="Delimiter">()</span> <span class="Delimiter">{</s void parse_int_reagents<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cout << "parse_int_reagents\n"; //? 1</span> - for <span class="Delimiter">(</span>map<recipe_number<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> + for <span class="Delimiter">(</span>map<recipe_ordinal<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> recipe& r = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> for <span class="Delimiter">(</span>long long int index = <span class="Constant">0</span><span class="Delimiter">;</span> index < SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -78,6 +78,7 @@ void parse_int_reagents<span class="Delimiter">()</span> <span class="Delimiter" void populate_value<span class="Delimiter">(</span>reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> + <span class="Comment">// End Reagent-parsing Exceptions</span> if <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> r<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>to_integer<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">));</span> <span class="Delimiter">}</span> diff --git a/html/013literal_string.cc.html b/html/013literal_string.cc.html index 3a95434d..154cfded 100644 --- a/html/013literal_string.cc.html +++ b/html/013literal_string.cc.html @@ -53,7 +53,7 @@ recipe main [ <span class="traceContains">+parse: ingredient: {name: "abc:def/ghi", properties: [_: "literal-string"]}</span> <span class="Delimiter">:(before "End Mu Types Initialization")</span> -Type_number[<span class="Constant">"literal-string"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> +Type_ordinal[<span class="Constant">"literal-string"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Delimiter">:(after "string next_word(istream& in)")</span> if <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> diff --git a/html/020run.cc.html b/html/020run.cc.html index 5d65fa9f..fc5fd15f 100644 --- a/html/020run.cc.html +++ b/html/020run.cc.html @@ -72,9 +72,9 @@ recipe main [ <span class="Comment">// Book-keeping while running a recipe.</span> <span class="Comment">//: Later layers will change this.</span> struct routine <span class="Delimiter">{</span> - recipe_number running_recipe<span class="Delimiter">;</span> + recipe_ordinal running_recipe<span class="Delimiter">;</span> long long int running_step_index<span class="Delimiter">;</span> - routine<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> :running_recipe<span class="Delimiter">(</span>r<span class="Delimiter">),</span> running_step_index<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span> + routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> :running_recipe<span class="Delimiter">(</span>r<span class="Delimiter">),</span> running_step_index<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span> bool completed<span class="Delimiter">()</span> const<span class="Delimiter">;</span> <span class="Delimiter">};</span> @@ -82,7 +82,7 @@ struct routine <span class="Delimiter">{</span> routine* Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span class="Delimiter">:(code)</span> -void run<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +void run<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> routine rr<span class="Delimiter">(</span>r<span class="Delimiter">);</span> Current_routine = &rr<span class="Delimiter">;</span> run_current_routine<span class="Delimiter">();</span> @@ -112,6 +112,7 @@ void run_current_routine<span class="Delimiter">()</span> switch <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// Primitive Recipe Implementations</span> case COPY: <span class="Delimiter">{</span> +<span class="CommentedCode">//? if (!ingredients.empty()) cerr << current_instruction().ingredients.at(0).to_string() << ' ' << ingredients.at(0).at(0) << '\n'; //? 1</span> copy<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>products<span class="Delimiter">,</span> products<span class="Delimiter">.</span>begin<span class="Delimiter">()));</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -167,7 +168,7 @@ if <span class="Delimiter">(</span>!Run_tests<span class="Delimiter">)</span> <s START_TRACING_UNTIL_END_OF_SCOPE<span class="Delimiter">;</span> <span class="CommentedCode">//? Trace_stream->dump_layer = "all"; //? 2</span> transform_all<span class="Delimiter">();</span> - recipe_number r = Recipe_number[string<span class="Delimiter">(</span><span class="Constant">"main"</span><span class="Delimiter">)</span>]<span class="Delimiter">;</span> + recipe_ordinal r = Recipe_ordinal[string<span class="Delimiter">(</span><span class="Constant">"main"</span><span class="Delimiter">)</span>]<span class="Delimiter">;</span> <span class="CommentedCode">//? Trace_stream->dump_layer = "all"; //? 1</span> if <span class="Delimiter">(</span>r<span class="Delimiter">)</span> run<span class="Delimiter">(</span>r<span class="Delimiter">);</span> <span class="CommentedCode">//? dump_memory(); //? 1</span> @@ -202,7 +203,7 @@ load_permanently<span class="Delimiter">(</span><span class="Constant">"cor void run<span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << "AAA 2\n"; //? 2</span> <span class="CommentedCode">//? cerr << form << '\n'; //? 1</span> - vector<recipe_number> tmp = load<span class="Delimiter">(</span>form<span class="Delimiter">);</span> + vector<recipe_ordinal> tmp = load<span class="Delimiter">(</span>form<span class="Delimiter">);</span> if <span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> transform_all<span class="Delimiter">();</span> <span class="CommentedCode">//? cerr << "AAA 3\n"; //? 2</span> @@ -246,12 +247,13 @@ void write_memory<span class="Delimiter">(</span>reagent x<span class="Delimiter long long int size_of<span class="Delimiter">(</span>const reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>r<span class="Delimiter">.</span>types<span class="Delimiter">);</span> <span class="Delimiter">}</span> -long long int size_of<span class="Delimiter">(</span>const vector<type_number>& types<span class="Delimiter">)</span> <span class="Delimiter">{</span> +long long int size_of<span class="Delimiter">(</span>const vector<type_ordinal>& types<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// End size_of(types) Cases</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> bool size_mismatch<span class="Delimiter">(</span>const reagent& x<span class="Delimiter">,</span> const vector<double>& data<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span class="CommentedCode">//? if (size_of(x) != SIZE(data)) cerr << size_of(x) << " vs " << SIZE(data) << '\n'; //? 2</span> <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> != SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span> <span class="Delimiter">}</span> diff --git a/html/021arithmetic.cc.html b/html/021arithmetic.cc.html index 479a6f4c..19941a52 100644 --- a/html/021arithmetic.cc.html +++ b/html/021arithmetic.cc.html @@ -18,6 +18,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } +.CommentedCode { color: #6c6c6c; } .Identifier { color: #804000; } --> </style> @@ -35,10 +36,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> ADD<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"add"</span>] = ADD<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"add"</span>] = ADD<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case ADD: <span class="Delimiter">{</span> double result = <span class="Constant">0</span><span class="Delimiter">;</span> +<span class="CommentedCode">//? if (!tb_is_active()) cerr << ingredients.at(1).at(0) << '\n'; //? 1</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)));</span> result += ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> @@ -71,7 +73,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> SUBTRACT<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"subtract"</span>] = SUBTRACT<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"subtract"</span>] = SUBTRACT<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case SUBTRACT: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> @@ -108,7 +110,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> MULTIPLY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"multiply"</span>] = MULTIPLY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"multiply"</span>] = MULTIPLY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case MULTIPLY: <span class="Delimiter">{</span> double result = <span class="Constant">1</span><span class="Delimiter">;</span> @@ -144,7 +146,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> DIVIDE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"divide"</span>] = DIVIDE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"divide"</span>] = DIVIDE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case DIVIDE: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> @@ -183,7 +185,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> DIVIDE_WITH_REMAINDER<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"divide-with-remainder"</span>] = DIVIDE_WITH_REMAINDER<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"divide-with-remainder"</span>] = DIVIDE_WITH_REMAINDER<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case DIVIDE_WITH_REMAINDER: <span class="Delimiter">{</span> long long int quotient = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> / ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> @@ -219,10 +221,10 @@ recipe main [ <span class="traceContains">+mem: storing 2.5 in location 1</span> <span class="Delimiter">:(code)</span> -inline bool scalar<span class="Delimiter">(</span>vector<long long int>& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +inline bool scalar<span class="Delimiter">(</span>const vector<long long int>& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> -inline bool scalar<span class="Delimiter">(</span>vector<double>& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +inline bool scalar<span class="Delimiter">(</span>const vector<double>& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>x<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> </pre> diff --git a/html/022boolean.cc.html b/html/022boolean.cc.html index c5b5bcff..a23df2d2 100644 --- a/html/022boolean.cc.html +++ b/html/022boolean.cc.html @@ -35,7 +35,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> AND<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"and"</span>] = AND<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"and"</span>] = AND<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case AND: <span class="Delimiter">{</span> bool result = <span class="Constant">true</span><span class="Delimiter">;</span> @@ -77,7 +77,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> OR<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"or"</span>] = OR<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"or"</span>] = OR<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case OR: <span class="Delimiter">{</span> bool result = <span class="Constant">false</span><span class="Delimiter">;</span> @@ -119,7 +119,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> NOT<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"not"</span>] = NOT<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"not"</span>] = NOT<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case NOT: <span class="Delimiter">{</span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>size<span class="Delimiter">());</span> diff --git a/html/023jump.cc.html b/html/023jump.cc.html index 8d2f6d54..b72a1341 100644 --- a/html/023jump.cc.html +++ b/html/023jump.cc.html @@ -47,7 +47,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> JUMP<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"jump"</span>] = JUMP<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"jump"</span>] = JUMP<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case JUMP: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>initialized<span class="Delimiter">);</span> @@ -60,7 +60,7 @@ case JUMP: <span class="Delimiter">{</span> <span class="Comment">//: special type to designate jump targets</span> <span class="Delimiter">:(before "End Mu Types Initialization")</span> -Type_number[<span class="Constant">"offset"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> +Type_ordinal[<span class="Constant">"offset"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Delimiter">:(scenario jump_backward)</span> recipe main [ @@ -76,7 +76,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> JUMP_IF<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"jump-if"</span>] = JUMP_IF<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"jump-if"</span>] = JUMP_IF<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case JUMP_IF: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>initialized<span class="Delimiter">);</span> @@ -115,7 +115,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> JUMP_UNLESS<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"jump-unless"</span>] = JUMP_UNLESS<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"jump-unless"</span>] = JUMP_UNLESS<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case JUMP_UNLESS: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>initialized<span class="Delimiter">);</span> diff --git a/html/024compare.cc.html b/html/024compare.cc.html index fb97b2a0..7ee355f3 100644 --- a/html/024compare.cc.html +++ b/html/024compare.cc.html @@ -35,7 +35,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> EQUAL<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"equal"</span>] = EQUAL<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"equal"</span>] = EQUAL<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case EQUAL: <span class="Delimiter">{</span> vector<double>& exemplar = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> @@ -86,7 +86,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> GREATER_THAN<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"greater-than"</span>] = GREATER_THAN<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"greater-than"</span>] = GREATER_THAN<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case GREATER_THAN: <span class="Delimiter">{</span> bool result = <span class="Constant">true</span><span class="Delimiter">;</span> @@ -134,7 +134,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> LESSER_THAN<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"lesser-than"</span>] = LESSER_THAN<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"lesser-than"</span>] = LESSER_THAN<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case LESSER_THAN: <span class="Delimiter">{</span> bool result = <span class="Constant">true</span><span class="Delimiter">;</span> @@ -182,7 +182,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> GREATER_OR_EQUAL<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"greater-or-equal"</span>] = GREATER_OR_EQUAL<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"greater-or-equal"</span>] = GREATER_OR_EQUAL<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case GREATER_OR_EQUAL: <span class="Delimiter">{</span> bool result = <span class="Constant">true</span><span class="Delimiter">;</span> @@ -238,7 +238,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> LESSER_OR_EQUAL<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"lesser-or-equal"</span>] = LESSER_OR_EQUAL<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"lesser-or-equal"</span>] = LESSER_OR_EQUAL<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case LESSER_OR_EQUAL: <span class="Delimiter">{</span> bool result = <span class="Constant">true</span><span class="Delimiter">;</span> diff --git a/html/025trace.cc.html b/html/025trace.cc.html index 11c3c6bd..3ff21726 100644 --- a/html/025trace.cc.html +++ b/html/025trace.cc.html @@ -40,7 +40,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> TRACE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"trace"</span>] = TRACE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"trace"</span>] = TRACE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case TRACE: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> @@ -54,7 +54,7 @@ case TRACE: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> HIDE_WARNINGS<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"hide-warnings"</span>] = HIDE_WARNINGS<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"hide-warnings"</span>] = HIDE_WARNINGS<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case HIDE_WARNINGS: <span class="Delimiter">{</span> Hide_warnings = <span class="Constant">true</span><span class="Delimiter">;</span> diff --git a/html/026assert.cc.html b/html/026assert.cc.html index 685cf2e4..af3588b4 100644 --- a/html/026assert.cc.html +++ b/html/026assert.cc.html @@ -40,7 +40,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> ASSERT<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"assert"</span>] = ASSERT<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"assert"</span>] = ASSERT<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case ASSERT: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> == <span class="Constant">2</span><span class="Delimiter">);</span> diff --git a/html/027debug.cc.html b/html/027debug.cc.html index 40a4a513..4035f006 100644 --- a/html/027debug.cc.html +++ b/html/027debug.cc.html @@ -34,7 +34,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> _PRINT<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$print"</span>] = _PRINT<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"$print"</span>] = _PRINT<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case _PRINT: <span class="Delimiter">{</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -56,7 +56,7 @@ case _PRINT: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> _START_TRACING<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$start-tracing"</span>] = _START_TRACING<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"$start-tracing"</span>] = _START_TRACING<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case _START_TRACING: <span class="Delimiter">{</span> if <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> @@ -70,7 +70,7 @@ case _START_TRACING: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> _STOP_TRACING<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$stop-tracing"</span>] = _STOP_TRACING<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"$stop-tracing"</span>] = _STOP_TRACING<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case _STOP_TRACING: <span class="Delimiter">{</span> Trace_stream<span class="Delimiter">-></span>dump_layer = <span class="Constant">""</span><span class="Delimiter">;</span> @@ -80,7 +80,7 @@ case _STOP_TRACING: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> _CLOSE_TRACE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$close-trace"</span>] = _CLOSE_TRACE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"$close-trace"</span>] = _CLOSE_TRACE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case _CLOSE_TRACE: <span class="Delimiter">{</span> if <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -93,7 +93,7 @@ case _CLOSE_TRACE: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> _EXIT<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$exit"</span>] = _EXIT<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"$exit"</span>] = _EXIT<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case _EXIT: <span class="Delimiter">{</span> exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> @@ -103,17 +103,32 @@ case _EXIT: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> _DUMP_TRACE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$dump-trace"</span>] = _DUMP_TRACE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"$dump-trace"</span>] = _DUMP_TRACE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case _DUMP_TRACE: <span class="Delimiter">{</span> - DUMP<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> + if <span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> + DUMP<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> + <span class="Delimiter">}</span> + else <span class="Delimiter">{</span> + DUMP<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">);</span> + <span class="Delimiter">}</span> + <span class="Identifier">break</span><span class="Delimiter">;</span> +<span class="Delimiter">}</span> + +<span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> +_CLEAR_TRACE<span class="Delimiter">,</span> +<span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> +Recipe_ordinal[<span class="Constant">"$clear-trace"</span>] = _CLEAR_TRACE<span class="Delimiter">;</span> +<span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> +case _CLEAR_TRACE: <span class="Delimiter">{</span> + CLEAR_TRACE<span class="Delimiter">;</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> _DUMP_MEMORY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$dump-memory"</span>] = _DUMP_MEMORY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"$dump-memory"</span>] = _DUMP_MEMORY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case _DUMP_MEMORY: <span class="Delimiter">{</span> dump_memory<span class="Delimiter">();</span> diff --git a/html/030container.cc.html b/html/030container.cc.html index 0cbe190a..fb0e1cdc 100644 --- a/html/030container.cc.html +++ b/html/030container.cc.html @@ -38,11 +38,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">:(before "End Mu Types Initialization")</span> <span class="Comment">//: We'll use this container as a running example, with two number elements.</span> -type_number point = Type_number[<span class="Constant">"point"</span>] = Next_type_number++<span class="Delimiter">;</span> +type_ordinal point = Type_ordinal[<span class="Constant">"point"</span>] = Next_type_ordinal++<span class="Delimiter">;</span> Type[point]<span class="Delimiter">.</span>size = <span class="Constant">2</span><span class="Delimiter">;</span> Type[point]<span class="Delimiter">.</span>kind = container<span class="Delimiter">;</span> Type[point]<span class="Delimiter">.</span>name = <span class="Constant">"point"</span><span class="Delimiter">;</span> -vector<type_number> i<span class="Delimiter">;</span> +vector<type_ordinal> i<span class="Delimiter">;</span> i<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>number<span class="Delimiter">);</span> Type[point]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>i<span class="Delimiter">);</span> Type[point]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>i<span class="Delimiter">);</span> @@ -65,14 +65,14 @@ recipe main [ <span class="Delimiter">:(before "End Mu Types Initialization")</span> <span class="Comment">// A more complex container, containing another container as one of its</span> <span class="Comment">// elements.</span> -type_number point_number = Type_number[<span class="Constant">"point-number"</span>] = Next_type_number++<span class="Delimiter">;</span> +type_ordinal point_number = Type_ordinal[<span class="Constant">"point-number"</span>] = Next_type_ordinal++<span class="Delimiter">;</span> Type[point_number]<span class="Delimiter">.</span>size = <span class="Constant">2</span><span class="Delimiter">;</span> Type[point_number]<span class="Delimiter">.</span>kind = container<span class="Delimiter">;</span> Type[point_number]<span class="Delimiter">.</span>name = <span class="Constant">"point-number"</span><span class="Delimiter">;</span> -vector<type_number> p2<span class="Delimiter">;</span> +vector<type_ordinal> p2<span class="Delimiter">;</span> p2<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>point<span class="Delimiter">);</span> Type[point_number]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>p2<span class="Delimiter">);</span> -vector<type_number> i2<span class="Delimiter">;</span> +vector<type_ordinal> i2<span class="Delimiter">;</span> i2<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>number<span class="Delimiter">);</span> Type[point_number]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>i2<span class="Delimiter">);</span> @@ -137,17 +137,19 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> GET<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"get"</span>] = GET<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"get"</span>] = GET<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case GET: <span class="Delimiter">{</span> reagent base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> - type_number base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> + type_ordinal base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> if <span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>kind != container<span class="Delimiter">)</span> raise << <span class="Constant">"'get' on a non-container in "</span> << current_recipe_name <span class="Delimiter">()</span> << <span class="Constant">": "</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << die<span class="Delimiter">();</span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span> long long int offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>offset >= <span class="Constant">0</span><span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>offset < size_of<span class="Delimiter">(</span>base<span class="Delimiter">));</span> long long int src = base_address<span class="Delimiter">;</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < offset<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> src += size_of<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> @@ -155,7 +157,7 @@ case GET: <span class="Delimiter">{</span> trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << src<span class="Delimiter">;</span> assert<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>kind == container<span class="Delimiter">);</span> assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">)</span> > offset<span class="Delimiter">);</span> - type_number src_type = Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> + type_ordinal src_type = Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"its type is "</span> << Type[src_type]<span class="Delimiter">.</span>name<span class="Delimiter">;</span> reagent tmp<span class="Delimiter">;</span> tmp<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>src<span class="Delimiter">);</span> @@ -186,17 +188,19 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> GET_ADDRESS<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"get-address"</span>] = GET_ADDRESS<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"get-address"</span>] = GET_ADDRESS<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case GET_ADDRESS: <span class="Delimiter">{</span> reagent base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> - type_number base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> + type_ordinal base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> if <span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>kind != container<span class="Delimiter">)</span> raise << <span class="Constant">"'get' on a non-container in "</span> << current_recipe_name <span class="Delimiter">()</span> << <span class="Constant">": "</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << die<span class="Delimiter">();</span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span> long long int offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>offset >= <span class="Constant">0</span><span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>offset < size_of<span class="Delimiter">(</span>base<span class="Delimiter">));</span> long long int result = base_address<span class="Delimiter">;</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < offset<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> result += size_of<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> @@ -251,16 +255,16 @@ void insert_container<span class="Delimiter">(</span>const string& command<s string name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> trace<span class="Delimiter">(</span><span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"reading "</span> << command << <span class="Constant">' '</span> << name<span class="Delimiter">;</span> <span class="CommentedCode">//? cout << name << '\n'; //? 2</span> -<span class="CommentedCode">//? if (Type_number.find(name) != Type_number.end()) //? 1</span> -<span class="CommentedCode">//? cerr << Type_number[name] << '\n'; //? 1</span> - if <span class="Delimiter">(</span>Type_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>name<span class="Delimiter">)</span> == Type_number<span class="Delimiter">.</span>end<span class="Delimiter">()</span> - || Type_number[name] == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> - Type_number[name] = Next_type_number++<span class="Delimiter">;</span> +<span class="CommentedCode">//? if (Type_ordinal.find(name) != Type_ordinal.end()) //? 1</span> +<span class="CommentedCode">//? cerr << Type_ordinal[name] << '\n'; //? 1</span> + if <span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>name<span class="Delimiter">)</span> == Type_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">()</span> + || Type_ordinal[name] == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + Type_ordinal[name] = Next_type_ordinal++<span class="Delimiter">;</span> <span class="Delimiter">}</span> - trace<span class="Delimiter">(</span><span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"type number: "</span> << Type_number[name]<span class="Delimiter">;</span> + trace<span class="Delimiter">(</span><span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"type number: "</span> << Type_ordinal[name]<span class="Delimiter">;</span> skip_bracket<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">"'container' must begin with '['"</span><span class="Delimiter">);</span> - type_info& t = Type[Type_number[name]]<span class="Delimiter">;</span> - recently_added_types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[name]<span class="Delimiter">);</span> + type_info& t = Type[Type_ordinal[name]]<span class="Delimiter">;</span> + recently_added_types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[name]<span class="Delimiter">);</span> t<span class="Delimiter">.</span>name = name<span class="Delimiter">;</span> t<span class="Delimiter">.</span>kind = kind<span class="Delimiter">;</span> while <span class="Delimiter">(</span>!in<span class="Delimiter">.</span>eof<span class="Delimiter">())</span> <span class="Delimiter">{</span> @@ -270,14 +274,14 @@ void insert_container<span class="Delimiter">(</span>const string& command<s istringstream inner<span class="Delimiter">(</span>element<span class="Delimiter">);</span> t<span class="Delimiter">.</span>element_names<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>slurp_until<span class="Delimiter">(</span>inner<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">));</span> trace<span class="Delimiter">(</span><span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" element name: "</span> << t<span class="Delimiter">.</span>element_names<span class="Delimiter">.</span>back<span class="Delimiter">();</span> - vector<type_number> types<span class="Delimiter">;</span> + vector<type_ordinal> types<span class="Delimiter">;</span> while <span class="Delimiter">(</span>!inner<span class="Delimiter">.</span>eof<span class="Delimiter">())</span> <span class="Delimiter">{</span> string type_name = slurp_until<span class="Delimiter">(</span>inner<span class="Delimiter">,</span> <span class="Constant">':'</span><span class="Delimiter">);</span> - if <span class="Delimiter">(</span>Type_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>type_name<span class="Delimiter">)</span> == Type_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> -<span class="CommentedCode">//? cerr << type_name << " is " << Next_type_number << '\n'; //? 1</span> - Type_number[type_name] = Next_type_number++<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>type_name<span class="Delimiter">)</span> == Type_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span class="CommentedCode">//? cerr << type_name << " is " << Next_type_ordinal << '\n'; //? 1</span> + Type_ordinal[type_name] = Next_type_ordinal++<span class="Delimiter">;</span> <span class="Delimiter">}</span> - types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[type_name]<span class="Delimiter">);</span> + types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[type_name]<span class="Delimiter">);</span> trace<span class="Delimiter">(</span><span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" type: "</span> << types<span class="Delimiter">.</span>back<span class="Delimiter">();</span> <span class="Delimiter">}</span> t<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>types<span class="Delimiter">);</span> @@ -288,38 +292,38 @@ void insert_container<span class="Delimiter">(</span>const string& command<s <span class="Comment">//: ensure types created in one scenario don't leak outside it.</span> <span class="Delimiter">:(before "End Globals")</span> -vector<type_number> recently_added_types<span class="Delimiter">;</span> +vector<type_ordinal> recently_added_types<span class="Delimiter">;</span> <span class="Delimiter">:(before "End load_permanently")</span> <span class="Comment">//: for non-tests</span> recently_added_types<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> <span class="Delimiter">:(before "End Setup")</span> <span class="Comment">//: for tests</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>recently_added_types<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cout << "erasing " << Type[recently_added_types.at(i)].name << '\n'; //? 1</span> - Type_number<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Type[recently_added_types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span>]<span class="Delimiter">.</span>name<span class="Delimiter">);</span> + Type_ordinal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Type[recently_added_types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span>]<span class="Delimiter">.</span>name<span class="Delimiter">);</span> Type<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>recently_added_types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> <span class="Delimiter">}</span> recently_added_types<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> <span class="Comment">// delete recent type references</span> -<span class="Comment">// can't rely on recently_added_types to cleanup Type_number, because of deliberately misbehaving tests with references to undefined types</span> -map<string<span class="Delimiter">,</span> type_number>::iterator p = Type_number<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> -while<span class="Delimiter">(</span>p != Type_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span class="Comment">// can't rely on recently_added_types to cleanup Type_ordinal, because of deliberately misbehaving tests with references to undefined types</span> +map<string<span class="Delimiter">,</span> type_ordinal>::iterator p = Type_ordinal<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> +while<span class="Delimiter">(</span>p != Type_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span class="Comment">// save current item</span> string name = p<span class="Delimiter">-></span>first<span class="Delimiter">;</span> - type_number t = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> + type_ordinal t = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> <span class="Comment">// increment iterator</span> ++p<span class="Delimiter">;</span> <span class="Comment">// now delete current item if necessary</span> if <span class="Delimiter">(</span>t >= <span class="Constant">1000</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << "AAA " << name << " " << t << '\n'; //? 1</span> - Type_number<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>name<span class="Delimiter">);</span> + Type_ordinal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>name<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> <span class="Comment">//: lastly, ensure scenarios are consistent by always starting them at the</span> <span class="Comment">//: same type number.</span> -Next_type_number = <span class="Constant">1000</span><span class="Delimiter">;</span> +Next_type_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span> <span class="Delimiter">:(before "End Test Run Initialization")</span> -assert<span class="Delimiter">(</span>Next_type_number < <span class="Constant">1000</span><span class="Delimiter">);</span> +assert<span class="Delimiter">(</span>Next_type_ordinal < <span class="Constant">1000</span><span class="Delimiter">);</span> <span class="Delimiter">:(before "End Setup")</span> -Next_type_number = <span class="Constant">1000</span><span class="Delimiter">;</span> +Next_type_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span> <span class="SalientComment">//:: Allow container definitions anywhere in the codebase, but warn if you</span> <span class="SalientComment">//:: can't find a definition.</span> @@ -350,7 +354,7 @@ $warn: <span class="Constant">0</span> Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_invalid_types<span class="Delimiter">);</span> <span class="Delimiter">:(code)</span> -void check_invalid_types<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +void check_invalid_types<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> for <span class="Delimiter">(</span>long long int index = <span class="Constant">0</span><span class="Delimiter">;</span> index < SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> const instruction& inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -395,7 +399,7 @@ check_container_field_types<span class="Delimiter">();</span> <span class="Delimiter">:(code)</span> void check_container_field_types<span class="Delimiter">()</span> <span class="Delimiter">{</span> - for <span class="Delimiter">(</span>map<type_number<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> + for <span class="Delimiter">(</span>map<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> const type_info& info = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> <span class="CommentedCode">//? cerr << "checking " << p->first << '\n'; //? 1</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -413,7 +417,7 @@ void check_container_field_types<span class="Delimiter">()</span> <span class="D <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> MERGE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"merge"</span>] = MERGE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"merge"</span>] = MERGE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case MERGE: <span class="Delimiter">{</span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> diff --git a/html/031address.cc.html b/html/031address.cc.html index 05819ec5..76971a4f 100644 --- a/html/031address.cc.html +++ b/html/031address.cc.html @@ -72,7 +72,7 @@ reagent canonize<span class="Delimiter">(</span>reagent x<span class="Delimiter" reagent deref<span class="Delimiter">(</span>reagent x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cout << "deref: " << x.to_string() << "\n"; //? 2</span> - static const type_number ADDRESS = Type_number[<span class="Constant">"address"</span>]<span class="Delimiter">;</span> + static const type_ordinal ADDRESS = Type_ordinal[<span class="Constant">"address"</span>]<span class="Delimiter">;</span> reagent result<span class="Delimiter">;</span> assert<span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == ADDRESS<span class="Delimiter">);</span> diff --git a/html/032array.cc.html b/html/032array.cc.html index f3579a43..101bd958 100644 --- a/html/032array.cc.html +++ b/html/032array.cc.html @@ -74,9 +74,9 @@ recipe main [ <span class="Comment">//: disable the size mismatch check since the destination array need not be initialized</span> <span class="Delimiter">:(after "bool size_mismatch(const reagent& x, const vector<double>& data)")</span> -if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_number[<span class="Constant">"array"</span>]<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> +if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">"array"</span>]<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Delimiter">:(after "long long int size_of(const reagent& r)")</span> - if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_number[<span class="Constant">"array"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">"array"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>types<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">);</span> <span class="Comment">// skip the 'array' type to get at the element type</span> <span class="Identifier">return</span> <span class="Constant">1</span> + Memory[r<span class="Delimiter">.</span>value]*size_of<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>r<span class="Delimiter">.</span>types<span class="Delimiter">));</span> @@ -108,20 +108,22 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> INDEX<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"index"</span>] = INDEX<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"index"</span>] = INDEX<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case INDEX: <span class="Delimiter">{</span> <span class="CommentedCode">//? if (Trace_stream) Trace_stream->dump_layer = "run"; //? 1</span> reagent base = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> <span class="CommentedCode">//? trace(Primitive_recipe_depth, "run") << "ingredient 0 after canonize: " << base.to_string(); //? 1</span> long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> - assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_number[<span class="Constant">"array"</span>]<span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">"array"</span>]<span class="Delimiter">);</span> reagent offset = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span> <span class="CommentedCode">//? trace(Primitive_recipe_depth, "run") << "ingredient 1 after canonize: " << offset.to_string(); //? 1</span> vector<double> offset_val<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>offset<span class="Delimiter">));</span> - vector<type_number> element_type = array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">);</span> + vector<type_ordinal> element_type = array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">);</span> <span class="CommentedCode">//? trace(Primitive_recipe_depth, "run") << "offset: " << offset_val.at(0); //? 1</span> <span class="CommentedCode">//? trace(Primitive_recipe_depth, "run") << "size of elements: " << size_of(element_type); //? 1</span> + assert<span class="Delimiter">(</span>offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> >= <span class="Constant">0</span><span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> < Memory[base_address]*size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">)</span> + <span class="Constant">1</span><span class="Delimiter">);</span> long long int src = base_address + <span class="Constant">1</span> + offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">);</span> trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << src<span class="Delimiter">;</span> trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"its type is "</span> << Type[element_type<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span>]<span class="Delimiter">.</span>name<span class="Delimiter">;</span> @@ -133,8 +135,8 @@ case INDEX: <span class="Delimiter">{</span> <span class="Delimiter">}</span> <span class="Delimiter">:(code)</span> -vector<type_number> array_element<span class="Delimiter">(</span>const vector<type_number>& types<span class="Delimiter">)</span> <span class="Delimiter">{</span> - <span class="Identifier">return</span> vector<type_number><span class="Delimiter">(</span>++types<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> types<span class="Delimiter">.</span>end<span class="Delimiter">());</span> +vector<type_ordinal> array_element<span class="Delimiter">(</span>const vector<type_ordinal>& types<span class="Delimiter">)</span> <span class="Delimiter">{</span> + <span class="Identifier">return</span> vector<type_ordinal><span class="Delimiter">(</span>++types<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> types<span class="Delimiter">.</span>end<span class="Delimiter">());</span> <span class="Delimiter">}</span> <span class="Delimiter">:(scenario index_address)</span> @@ -163,15 +165,17 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> INDEX_ADDRESS<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"index-address"</span>] = INDEX_ADDRESS<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"index-address"</span>] = INDEX_ADDRESS<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case INDEX_ADDRESS: <span class="Delimiter">{</span> reagent base = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> - assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_number[<span class="Constant">"array"</span>]<span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">"array"</span>]<span class="Delimiter">);</span> reagent offset = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span> vector<double> offset_val<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>offset<span class="Delimiter">));</span> - vector<type_number> element_type = array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">);</span> + vector<type_ordinal> element_type = array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> >= <span class="Constant">0</span><span class="Delimiter">);</span> + assert<span class="Delimiter">(</span>offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> < Memory[base_address]*size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">)</span> + <span class="Constant">1</span><span class="Delimiter">);</span> long long int result = base_address + <span class="Constant">1</span> + offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">);</span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span> @@ -193,11 +197,11 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> LENGTH<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"length"</span>] = LENGTH<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"length"</span>] = LENGTH<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case LENGTH: <span class="Delimiter">{</span> reagent x = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> - if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != Type_number[<span class="Constant">"array"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != Type_ordinal[<span class="Constant">"array"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> raise << <span class="Constant">"tried to calculate length of non-array "</span> << x<span class="Delimiter">.</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> diff --git a/html/034exclusive_container.cc.html b/html/033exclusive_container.cc.html index 55d8a331..c6737f59 100644 --- a/html/034exclusive_container.cc.html +++ b/html/033exclusive_container.cc.html @@ -2,7 +2,7 @@ <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> -<title>Mu - 034exclusive_container.cc</title> +<title>Mu - 033exclusive_container.cc</title> <meta name="Generator" content="Vim/7.4"> <meta name="plugin-version" content="vim7.4_v1"> <meta name="syntax" content="cpp"> @@ -41,16 +41,16 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">:(before "End Mu Types Initialization")</span> <span class="Comment">//: We'll use this container as a running example, with two number elements.</span> <span class="Delimiter">{</span> -type_number tmp = Type_number[<span class="Constant">"number-or-point"</span>] = Next_type_number++<span class="Delimiter">;</span> +type_ordinal tmp = Type_ordinal[<span class="Constant">"number-or-point"</span>] = Next_type_ordinal++<span class="Delimiter">;</span> Type[tmp]<span class="Delimiter">.</span>size = <span class="Constant">2</span><span class="Delimiter">;</span> Type[tmp]<span class="Delimiter">.</span>kind = exclusive_container<span class="Delimiter">;</span> Type[tmp]<span class="Delimiter">.</span>name = <span class="Constant">"number-or-point"</span><span class="Delimiter">;</span> <span class="CommentedCode">//? cout << tmp << ": " << SIZE(Type[tmp].elements) << '\n'; //? 1</span> -vector<type_number> t1<span class="Delimiter">;</span> +vector<type_ordinal> t1<span class="Delimiter">;</span> t1<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>number<span class="Delimiter">);</span> Type[tmp]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>t1<span class="Delimiter">);</span> <span class="CommentedCode">//? cout << SIZE(Type[tmp].elements) << '\n'; //? 1</span> -vector<type_number> t2<span class="Delimiter">;</span> +vector<type_ordinal> t2<span class="Delimiter">;</span> t2<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>point<span class="Delimiter">);</span> Type[tmp]<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>t2<span class="Delimiter">);</span> <span class="CommentedCode">//? cout << SIZE(Type[tmp].elements) << '\n'; //? 1</span> @@ -79,7 +79,7 @@ if <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == excl <span class="Comment">// size of an exclusive container is the size of its largest variant</span> <span class="Comment">// (So like containers, it can't contain arrays.)</span> <span class="CommentedCode">//? cout << "--- " << types.at(0) << ' ' << t.size << '\n'; //? 1</span> -<span class="CommentedCode">//? cout << "point: " << Type_number["point"] << " " << Type[Type_number["point"]].name << " " << Type[Type_number["point"]].size << '\n'; //? 1</span> +<span class="CommentedCode">//? cout << "point: " << Type_ordinal["point"] << " " << Type[Type_ordinal["point"]].name << " " << Type[Type_ordinal["point"]].size << '\n'; //? 1</span> <span class="CommentedCode">//? cout << t.name << ' ' << t.size << ' ' << SIZE(t.elements) << '\n'; //? 1</span> long long int result = <span class="Constant">0</span><span class="Delimiter">;</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < t<span class="Delimiter">.</span>size<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -99,7 +99,7 @@ if <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == excl <span class="Comment">//: 'maybe-convert' requires a literal in ingredient 1. We'll use a synonym</span> <span class="Comment">//: called 'variant'.</span> <span class="Delimiter">:(before "End Mu Types Initialization")</span> -Type_number[<span class="Constant">"variant"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> +Type_ordinal[<span class="Constant">"variant"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Delimiter">:(scenario maybe_convert)</span> recipe main [ @@ -122,12 +122,12 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> MAYBE_CONVERT<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"maybe-convert"</span>] = MAYBE_CONVERT<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"maybe-convert"</span>] = MAYBE_CONVERT<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case MAYBE_CONVERT: <span class="Delimiter">{</span> reagent base = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> - type_number base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> + type_ordinal base_type = base<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> assert<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>kind == exclusive_container<span class="Delimiter">);</span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span> long long int tag = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">;</span> diff --git a/html/035call.cc.html b/html/034call.cc.html index 9b729fe1..291dfeb9 100644 --- a/html/035call.cc.html +++ b/html/034call.cc.html @@ -2,7 +2,7 @@ <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> -<title>Mu - 035call.cc</title> +<title>Mu - 034call.cc</title> <meta name="Generator" content="Vim/7.4"> <meta name="plugin-version" content="vim7.4_v1"> <meta name="syntax" content="cpp"> @@ -70,10 +70,10 @@ recipe f [ <span class="Comment">// recipe. When that finishes, we continue this one where we left off.</span> <span class="Comment">// This requires maintaining a 'stack' of interrupted recipes or 'calls'.</span> struct call <span class="Delimiter">{</span> - recipe_number running_recipe<span class="Delimiter">;</span> + recipe_ordinal running_recipe<span class="Delimiter">;</span> long long int running_step_index<span class="Delimiter">;</span> <span class="Comment">// End call Fields</span> - call<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> + call<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> running_recipe = r<span class="Delimiter">;</span> running_step_index = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Comment">// End call Constructor</span> @@ -85,12 +85,12 @@ typedef list<call> call_stack<span class="Delimiter">;</span> struct routine <span class="Delimiter">{</span> call_stack calls<span class="Delimiter">;</span> <span class="Comment">// End routine Fields</span> - routine<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">);</span> + routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">);</span> bool completed<span class="Delimiter">()</span> const<span class="Delimiter">;</span> const vector<instruction>& steps<span class="Delimiter">()</span> const<span class="Delimiter">;</span> <span class="Delimiter">};</span> <span class="Delimiter">:(code)</span> -routine::routine<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +routine::routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>r<span class="Delimiter">));</span> <span class="Comment">// End routine Constructor</span> <span class="Delimiter">}</span> @@ -143,10 +143,12 @@ inline const vector<instruction>& routine::steps<span class="Delimiter <span class="Comment">// when we reach the end of one call, we may reach the end of the one below</span> <span class="Comment">// it, and the one below that, and so on</span> while <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> >= SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>steps<span class="Delimiter">()))</span> <span class="Delimiter">{</span> + <span class="Comment">// Falling Through End Of Recipe</span> --Callstack_depth<span class="Delimiter">;</span> -<span class="CommentedCode">//? cerr << "reply " << Current_routine->calls.size() << '\n'; //? 1</span> +<span class="CommentedCode">//? cerr << "reply " << Current_routine->calls.size() << '\n'; //? 2</span> Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>pop_front<span class="Delimiter">();</span> if <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> + <span class="Comment">// Complete Call Fallthrough</span> <span class="Comment">// todo: no results returned warning</span> ++current_step_index<span class="Delimiter">();</span> <span class="Delimiter">}</span> diff --git a/html/036call_ingredient.cc.html b/html/035call_ingredient.cc.html index c19b4166..08d397db 100644 --- a/html/036call_ingredient.cc.html +++ b/html/035call_ingredient.cc.html @@ -2,7 +2,7 @@ <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> -<title>Mu - 036call_ingredient.cc</title> +<title>Mu - 035call_ingredient.cc</title> <meta name="Generator" content="Vim/7.4"> <meta name="plugin-version" content="vim7.4_v1"> <meta name="syntax" content="cpp"> @@ -66,7 +66,7 @@ for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> NEXT_INGREDIENT<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"next-ingredient"</span>] = NEXT_INGREDIENT<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"next-ingredient"</span>] = NEXT_INGREDIENT<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case NEXT_INGREDIENT: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> @@ -103,7 +103,7 @@ recipe f [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> REWIND_INGREDIENTS<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"rewind-ingredients"</span>] = REWIND_INGREDIENTS<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"rewind-ingredients"</span>] = REWIND_INGREDIENTS<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case REWIND_INGREDIENTS: <span class="Delimiter">{</span> Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>next_ingredient_to_process = <span class="Constant">0</span><span class="Delimiter">;</span> @@ -124,7 +124,7 @@ recipe f [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> INGREDIENT<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"ingredient"</span>] = INGREDIENT<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"ingredient"</span>] = INGREDIENT<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case INGREDIENT: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> diff --git a/html/037call_reply.cc.html b/html/036call_reply.cc.html index 80199b4b..2738d935 100644 --- a/html/037call_reply.cc.html +++ b/html/036call_reply.cc.html @@ -2,7 +2,7 @@ <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> -<title>Mu - 037call_reply.cc</title> +<title>Mu - 036call_reply.cc</title> <meta name="Generator" content="Vim/7.4"> <meta name="plugin-version" content="vim7.4_v1"> <meta name="syntax" content="cpp"> @@ -49,9 +49,10 @@ recipe f [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> REPLY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"reply"</span>] = REPLY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"reply"</span>] = REPLY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case REPLY: <span class="Delimiter">{</span> + <span class="Comment">// Starting Reply</span> const instruction& reply_inst = current_instruction<span class="Delimiter">();</span> <span class="Comment">// save pointer into recipe before pop</span> const string& callee = current_recipe_name<span class="Delimiter">();</span> --Callstack_depth<span class="Delimiter">;</span> @@ -67,6 +68,8 @@ case REPLY: <span class="Delimiter">{</span> copy<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>products<span class="Delimiter">,</span> products<span class="Delimiter">.</span>begin<span class="Delimiter">()));</span> <span class="Comment">// check that any reply ingredients with /same-as-ingredient connect up</span> <span class="Comment">// the corresponding ingredient and product in the caller.</span> + if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span> + raise << <span class="Constant">"too few values replied from "</span> << callee << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << Recipe[Current_routine->calls.front().running_recipe].name << '\n'; //? 1</span> trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"result "</span> << i << <span class="Constant">" is "</span> << to_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> @@ -74,7 +77,11 @@ case REPLY: <span class="Delimiter">{</span> vector<string> tmp = property<span class="Delimiter">(</span>reply_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">"same-as-ingredient"</span><span class="Delimiter">);</span> assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>tmp<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">);</span> long long int ingredient_index = to_integer<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> - if <span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>value != caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>value<span class="Delimiter">)</span> + if <span class="Delimiter">(</span>ingredient_index >= SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": 'same-as-ingredient' metadata overflows ingredients in: "</span> << caller_instruction<span class="Delimiter">.</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<span class="CommentedCode">//? cerr << caller_instruction.products.size() << ' ' << i << ' ' << caller_instruction.ingredients.size() << ' ' << ingredient_index << '\n'; //? 1</span> +<span class="CommentedCode">//? cerr << caller_instruction.to_string() << '\n'; //? 1</span> + if <span class="Delimiter">(</span>!is_dummy<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> && caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>value != caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>value<span class="Delimiter">)</span> raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": 'same-as-ingredient' result "</span> << caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>value << <span class="Constant">" from call to "</span> << callee << <span class="Constant">" must be location "</span> << caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>value << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> @@ -112,6 +119,18 @@ recipe test1 [ ] <span class="traceContains">+warn: main: 'same-as-ingredient' result 2 from call to test1 must be location 1</span> +<span class="Delimiter">:(scenario reply_same_as_ingredient_dummy)</span> +<span class="Special">% Hide_warnings = true;</span> +recipe main [ + <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">0</span>:literal + _<span class="Special"> <- </span>test1 <span class="Constant">1</span>:number <span class="Comment"># call with different ingredient and product</span> +] +recipe test1 [ + <span class="Constant">10</span>:address:number<span class="Special"> <- </span>next-ingredient + reply <span class="Constant">10</span>:address:number/same-as-ingredient:<span class="Constant">0</span> +] +$warn: <span class="Constant">0</span> + <span class="Delimiter">:(code)</span> string to_string<span class="Delimiter">(</span>const vector<double>& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>in<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">"[]"</span><span class="Delimiter">;</span> @@ -159,7 +178,7 @@ recipe test1 [ <span class="Comment">// ```</span> if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">"reply-if"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> - curr<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"jump-unless"</span>]<span class="Delimiter">;</span> + curr<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">"jump-unless"</span>]<span class="Delimiter">;</span> curr<span class="Delimiter">.</span>name = <span class="Constant">"jump-unless"</span><span class="Delimiter">;</span> vector<reagent> results<span class="Delimiter">;</span> copy<span class="Delimiter">(</span>++curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>results<span class="Delimiter">,</span> results<span class="Delimiter">.</span>end<span class="Delimiter">()));</span> @@ -167,7 +186,7 @@ if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == < curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">"1:offset"</span><span class="Delimiter">));</span> result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span> curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> - curr<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"reply"</span>]<span class="Delimiter">;</span> + curr<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">"reply"</span>]<span class="Delimiter">;</span> curr<span class="Delimiter">.</span>name = <span class="Constant">"reply"</span><span class="Delimiter">;</span> curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>results<span class="Delimiter">);</span> <span class="Delimiter">}</span> @@ -178,7 +197,7 @@ if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == < <span class="Comment">// ```</span> if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">"reply-unless"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> - curr<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"jump-if"</span>]<span class="Delimiter">;</span> + curr<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">"jump-if"</span>]<span class="Delimiter">;</span> curr<span class="Delimiter">.</span>name = <span class="Constant">"jump-if"</span><span class="Delimiter">;</span> vector<reagent> results<span class="Delimiter">;</span> copy<span class="Delimiter">(</span>++curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>results<span class="Delimiter">,</span> results<span class="Delimiter">.</span>end<span class="Delimiter">()));</span> @@ -186,7 +205,7 @@ if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == < curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">"1:offset"</span><span class="Delimiter">));</span> result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span> curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> - curr<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"reply"</span>]<span class="Delimiter">;</span> + curr<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">"reply"</span>]<span class="Delimiter">;</span> curr<span class="Delimiter">.</span>name = <span class="Constant">"reply"</span><span class="Delimiter">;</span> curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>results<span class="Delimiter">);</span> <span class="Delimiter">}</span> diff --git a/html/037recipe.cc.html b/html/037recipe.cc.html new file mode 100644 index 00000000..a84b95ef --- /dev/null +++ b/html/037recipe.cc.html @@ -0,0 +1,90 @@ +<!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 - 037recipe.cc</title> +<meta name="Generator" content="Vim/7.4"> +<meta name="plugin-version" content="vim7.4_v1"> +<meta name="syntax" content="cpp"> +<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,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-family: monospace; color: #eeeeee; background-color: #080808; } +* { font-size: 1.05em; } +.traceContains { color: #008000; } +.Constant { color: #00a0a0; } +.Comment { color: #9090ff; } +.Delimiter { color: #a04060; } +.Special { color: #ff6060; } +.CommentedCode { color: #6c6c6c; } +.Identifier { color: #804000; } +--> +</style> + +<script type='text/javascript'> +<!-- + +--> +</script> +</head> +<body> +<pre id='vimCodeElement'> +<span class="Comment">//: So far we've been calling a fixed recipe in each instruction, but we'd</span> +<span class="Comment">//: also like to make the recipe a variable, pass recipes to "higher-order"</span> +<span class="Comment">//: recipes, return recipes from recipes and so on.</span> + +<span class="Delimiter">:(scenario call_literal_recipe)</span> +recipe main [ + <span class="Constant">1</span>:number<span class="Special"> <- </span>call f:recipe<span class="Delimiter">,</span> <span class="Constant">34</span>:literal +] +recipe f [ + <span class="Constant">2</span>:number<span class="Special"> <- </span>next-ingredient + reply <span class="Constant">2</span>:number +] +<span class="traceContains">+mem: storing 34 in location 1</span> + +<span class="Delimiter">:(scenario call_variable)</span> +recipe main [ + <span class="Constant">1</span>:recipe-ordinal<span class="Special"> <- </span>copy f:recipe + <span class="Constant">2</span>:number<span class="Special"> <- </span>call <span class="Constant">1</span>:recipe-ordinal<span class="Delimiter">,</span> <span class="Constant">34</span>:literal +] +recipe f [ + <span class="Constant">3</span>:number<span class="Special"> <- </span>next-ingredient + reply <span class="Constant">3</span>:number +] +<span class="traceContains">+mem: storing 34 in location 2</span> +<span class="CommentedCode">#? ?</span> + +<span class="Delimiter">:(before "End Mu Types Initialization")</span> +<span class="Comment">// 'recipe' is a literal</span> +Type_ordinal[<span class="Constant">"recipe"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> +<span class="Comment">// 'recipe-ordinal' is the literal that can store recipe literals</span> +type_ordinal recipe_ordinal = Type_ordinal[<span class="Constant">"recipe-ordinal"</span>] = Next_type_ordinal++<span class="Delimiter">;</span> +Type[recipe_ordinal]<span class="Delimiter">.</span>name = <span class="Constant">"recipe-ordinal"</span><span class="Delimiter">;</span> + +<span class="Delimiter">:(before "End Reagent-parsing Exceptions")</span> +if <span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == <span class="Constant">"recipe"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + r<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>Recipe_ordinal[r<span class="Delimiter">.</span>name]<span class="Delimiter">);</span> + <span class="Identifier">return</span><span class="Delimiter">;</span> +<span class="Delimiter">}</span> + +<span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> +CALL<span class="Delimiter">,</span> +<span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> +Recipe_ordinal[<span class="Constant">"call"</span>] = CALL<span class="Delimiter">;</span> +<span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> +case CALL: <span class="Delimiter">{</span> + assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> + <span class="Comment">// todo: when we start doing type checking this will be a prime point of</span> + <span class="Comment">// attention, so we don't accidentally allow external data to a program to</span> + <span class="Comment">// run as code.</span> + Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> + ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span> <span class="Comment">// drop the callee</span> + <span class="Identifier">goto</span> complete_call<span class="Delimiter">;</span> +<span class="Delimiter">}</span> +</pre> +</body> +</html> +<!-- vim: set foldmethod=manual : --> diff --git a/html/038scheduler.cc.html b/html/038scheduler.cc.html index 973a8712..89bd5f74 100644 --- a/html/038scheduler.cc.html +++ b/html/038scheduler.cc.html @@ -81,8 +81,8 @@ long long int Scheduling_interval = <span class="Constant">500</span><span class <span class="Delimiter">:(before "End Setup")</span> Scheduling_interval = <span class="Constant">500</span><span class="Delimiter">;</span> Routines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<span class="Delimiter">:(replace{} "void run(recipe_number r)")</span> -void run<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span class="Delimiter">:(replace{} "void run(recipe_ordinal r)")</span> +void run<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << "AAA 4\n"; //? 1</span> Routines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new routine<span class="Delimiter">(</span>r<span class="Delimiter">));</span> <span class="CommentedCode">//? cerr << "AAA " << Routines.size() << " routines\n"; //? 1</span> @@ -163,10 +163,6 @@ Next_routine_id = <span class="Constant">1</span><span class="Delimiter">;</span id = Next_routine_id<span class="Delimiter">;</span> Next_routine_id++<span class="Delimiter">;</span> -<span class="Comment">//: it needs a new type: 'recipe'</span> -<span class="Delimiter">:(before "End Mu Types Initialization")</span> -Type_number[<span class="Constant">"recipe"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> - <span class="Comment">//: routines save the routine that spawned them</span> <span class="Delimiter">:(before "End routine Fields")</span> <span class="Comment">// todo: really should be routine_id, but that's less efficient.</span> @@ -177,12 +173,10 @@ parent_index = -<span class="Constant">1</span><span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> START_RUNNING<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"start-running"</span>] = START_RUNNING<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"start-running"</span>] = START_RUNNING<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case START_RUNNING: <span class="Delimiter">{</span> - assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> - assert<span class="Delimiter">(</span>!current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>initialized<span class="Delimiter">);</span> - routine* new_routine = new routine<span class="Delimiter">(</span>Recipe_number[current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">);</span> + routine* new_routine = new routine<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> <span class="CommentedCode">//? cerr << new_routine->id << " -> " << Current_routine->id << '\n'; //? 1</span> new_routine<span class="Delimiter">-></span>parent_index = Current_routine_index<span class="Delimiter">;</span> <span class="Comment">// populate ingredients</span> @@ -253,8 +247,8 @@ recipe f2 [ <span class="Comment">//: this scenario will require some careful setup in escaped C++</span> <span class="Comment">//: (straining our tangle capabilities to near-breaking point)</span> <span class="Delimiter">:(scenario scheduler_skips_completed_routines)</span> -<span class="Special">% recipe_number f1 = load("recipe f1 [\n1:number <- copy 0:literal\n]").front();</span> -<span class="Special">% recipe_number f2 = load("recipe f2 [\n2:number <- copy 0:literal\n]").front();</span> +<span class="Special">% recipe_ordinal f1 = load("recipe f1 [\n1:number <- copy 0:literal\n]").front();</span> +<span class="Special">% recipe_ordinal f2 = load("recipe f2 [\n2:number <- copy 0:literal\n]").front();</span> <span class="Special">% Routines.push_back(new routine(f1)); // f1 meant to run</span> <span class="Special">% Routines.push_back(new routine(f2));</span> <span class="Special">% Routines.back()->state = COMPLETED; // f2 not meant to run</span> @@ -343,7 +337,7 @@ recipe f2 [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> ROUTINE_STATE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"routine-state"</span>] = ROUTINE_STATE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"routine-state"</span>] = ROUTINE_STATE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case ROUTINE_STATE: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> @@ -365,7 +359,7 @@ case ROUTINE_STATE: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> RESTART<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"restart"</span>] = RESTART<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"restart"</span>] = RESTART<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case RESTART: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> @@ -382,7 +376,7 @@ case RESTART: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> STOP<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"stop"</span>] = STOP<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"stop"</span>] = STOP<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case STOP: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> @@ -399,7 +393,7 @@ case STOP: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> _DUMP_ROUTINES<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$dump-routines"</span>] = _DUMP_ROUTINES<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"$dump-routines"</span>] = _DUMP_ROUTINES<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case _DUMP_ROUTINES: <span class="Delimiter">{</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> diff --git a/html/039wait.cc.html b/html/039wait.cc.html index c9f72f72..34043e76 100644 --- a/html/039wait.cc.html +++ b/html/039wait.cc.html @@ -67,7 +67,7 @@ waiting_on_location = old_value_of_waiting_location = <span class="Constant">0</ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> WAIT_FOR_LOCATION<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"wait-for-location"</span>] = WAIT_FOR_LOCATION<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"wait-for-location"</span>] = WAIT_FOR_LOCATION<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case WAIT_FOR_LOCATION: <span class="Delimiter">{</span> reagent loc = canonize<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> @@ -127,7 +127,7 @@ waiting_on_routine = <span class="Constant">0</span><span class="Delimiter">;</s <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> WAIT_FOR_ROUTINE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"wait-for-routine"</span>] = WAIT_FOR_ROUTINE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"wait-for-routine"</span>] = WAIT_FOR_ROUTINE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case WAIT_FOR_ROUTINE: <span class="Delimiter">{</span> Current_routine<span class="Delimiter">-></span>state = WAITING<span class="Delimiter">;</span> @@ -158,7 +158,7 @@ for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> SWITCH<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"switch"</span>] = SWITCH<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"switch"</span>] = SWITCH<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case SWITCH: <span class="Delimiter">{</span> long long int id = some_other_running_routine<span class="Delimiter">();</span> diff --git a/html/040brace.cc.html b/html/040brace.cc.html index 12122f75..f5f3921c 100644 --- a/html/040brace.cc.html +++ b/html/040brace.cc.html @@ -14,6 +14,7 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background- body { font-family: monospace; color: #eeeeee; background-color: #080808; } * { font-size: 1.05em; } .traceContains { color: #008000; } +.cSpecial { color: #008000; } .Constant { color: #00a0a0; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } @@ -69,7 +70,7 @@ recipe main [ Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_braces<span class="Delimiter">);</span> <span class="Delimiter">:(code)</span> -void transform_braces<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +void transform_braces<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cout << "AAA transform_braces\n"; //? 1</span> <span class="CommentedCode">//? exit(0); //? 1</span> const int OPEN = <span class="Constant">0</span><span class="Delimiter">,</span> CLOSE = <span class="Constant">1</span><span class="Delimiter">;</span> @@ -89,103 +90,65 @@ void transform_braces<span class="Delimiter">(</span>const recipe_number r<span stack<<span class="Comment">/*</span><span class="Comment">step</span><span class="Comment">*/</span>long long int> open_braces<span class="Delimiter">;</span> trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"recipe "</span> << Recipe[r]<span class="Delimiter">.</span>name<span class="Delimiter">;</span> for <span class="Delimiter">(</span>long long int index = <span class="Constant">0</span><span class="Delimiter">;</span> index < SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span class="CommentedCode">//? cerr << index << '\n'; //? 1</span> instruction& inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> -<span class="CommentedCode">//? cout << "AAA " << inst.name << ": " << inst.operation << '\n'; //? 1</span> - if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">"{"</span><span class="Delimiter">)</span> open_braces<span class="Delimiter">.</span>push<span class="Delimiter">(</span>index<span class="Delimiter">);</span> - else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">"}"</span><span class="Delimiter">)</span> open_braces<span class="Delimiter">.</span>pop<span class="Delimiter">();</span> - else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> - <span class="Delimiter">;</span> <span class="Comment">// do nothing</span> - else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"loop"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> - inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"jump"</span>]<span class="Delimiter">;</span> - if <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> && is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> - <span class="Comment">// explicit target; a later phase will handle it</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> - else <span class="Delimiter">{</span> - reagent ing<span class="Delimiter">;</span> - ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span> - ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">"offset"</span>]<span class="Delimiter">);</span> - inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << ing<span class="Delimiter">.</span>value << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << index << <span class="Constant">": "</span> << ing<span class="Delimiter">.</span>to_string<span class="Delimiter">();</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << index << <span class="Constant">": "</span> << Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">).</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>to_string<span class="Delimiter">();</span> - <span class="Delimiter">}</span> - <span class="Delimiter">}</span> - else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"break"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> - inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"jump"</span>]<span class="Delimiter">;</span> - if <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> && is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> - <span class="Comment">// explicit target; a later phase will handle it</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> - else <span class="Delimiter">{</span> - reagent ing<span class="Delimiter">;</span> - ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>matching_brace<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">(),</span> braces<span class="Delimiter">)</span> - index - <span class="Constant">1</span><span class="Delimiter">);</span> - ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">"offset"</span>]<span class="Delimiter">);</span> - inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << ing<span class="Delimiter">.</span>value << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> - <span class="Delimiter">}</span> - else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"loop-if"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> - inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"jump-if"</span>]<span class="Delimiter">;</span> - if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span> && is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> - <span class="Comment">// explicit target; a later phase will handle it</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> - else <span class="Delimiter">{</span> - reagent ing<span class="Delimiter">;</span> - ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span> - ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">"offset"</span>]<span class="Delimiter">);</span> - inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump-if "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">", "</span> << ing<span class="Delimiter">.</span>value << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> + if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">"{"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + open_braces<span class="Delimiter">.</span>push<span class="Delimiter">(</span>index<span class="Delimiter">);</span> + <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"break-if"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> - inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"jump-if"</span>]<span class="Delimiter">;</span> - if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span> && is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> - <span class="Comment">// explicit target; a later phase will handle it</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> - else <span class="Delimiter">{</span> - reagent ing<span class="Delimiter">;</span> - ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>matching_brace<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">(),</span> braces<span class="Delimiter">)</span> - index - <span class="Constant">1</span><span class="Delimiter">);</span> - ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">"offset"</span>]<span class="Delimiter">);</span> - inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump-if "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">", "</span> << ing<span class="Delimiter">.</span>value << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> + if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">"}"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + open_braces<span class="Delimiter">.</span>pop<span class="Delimiter">();</span> + <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"loop-unless"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> - inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"jump-unless"</span>]<span class="Delimiter">;</span> - if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span> && is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> - <span class="Comment">// explicit target; a later phase will handle it</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> - else <span class="Delimiter">{</span> - reagent ing<span class="Delimiter">;</span> - ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span> - ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">"offset"</span>]<span class="Delimiter">);</span> - inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump-unless "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">", "</span> << ing<span class="Delimiter">.</span>value << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> + if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> + if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">"loop"</span>] + && inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">"loop-if"</span>] + && inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">"loop-unless"</span>] + && inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">"break"</span>] + && inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">"break-if"</span>] + && inst<span class="Delimiter">.</span>operation != Recipe_ordinal[<span class="Constant">"break-unless"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> + trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">" ..."</span><span class="Delimiter">;</span> + <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"break-unless"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span class="CommentedCode">//? cout << "AAA break-unless\n"; //? 1</span> - inst<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"jump-unless"</span>]<span class="Delimiter">;</span> + <span class="Comment">// update instruction operation</span> + if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"-if"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> + inst<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">"jump-if"</span>]<span class="Delimiter">;</span> + else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"-unless"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> + inst<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">"jump-unless"</span>]<span class="Delimiter">;</span> + else + inst<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">"jump"</span>]<span class="Delimiter">;</span> + <span class="Comment">// check for explicitly provided targets</span> + if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"-if"</span><span class="Delimiter">)</span> != string::npos || inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"-unless"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> + <span class="Comment">// conditional branches check arg 1</span> if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span> && is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> - <span class="Comment">// explicit target; a later phase will handle it</span> trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">":offset"</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> - else <span class="Delimiter">{</span> - reagent ing<span class="Delimiter">;</span> - ing<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>matching_brace<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">(),</span> braces<span class="Delimiter">)</span> - index - <span class="Constant">1</span><span class="Delimiter">);</span> - ing<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">"offset"</span>]<span class="Delimiter">);</span> - inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>ing<span class="Delimiter">);</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump-unless "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">", "</span> << ing<span class="Delimiter">.</span>value << <span class="Constant">":offset"</span><span class="Delimiter">;</span> + <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> else <span class="Delimiter">{</span> - trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">" ..."</span><span class="Delimiter">;</span> + <span class="Comment">// unconditional branches check arg 0</span> + if <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> && is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> + trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">":offset"</span><span class="Delimiter">;</span> + <span class="Identifier">continue</span><span class="Delimiter">;</span> + <span class="Delimiter">}</span> <span class="Delimiter">}</span> + <span class="Comment">// if implicit, compute target</span> + reagent target<span class="Delimiter">;</span> + target<span class="Delimiter">.</span>types<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">"offset"</span>]<span class="Delimiter">);</span> + target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> + if <span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> + raise << inst<span class="Delimiter">.</span>name << <span class="Constant">" wasn't inside {}</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> + else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"loop"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> + target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span> + else <span class="Comment">// break instruction</span> + target<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>matching_brace<span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">(),</span> braces<span class="Delimiter">)</span> - index - <span class="Constant">1</span><span class="Delimiter">);</span> + inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>target<span class="Delimiter">);</span> + <span class="Comment">// log computed target</span> + if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"-if"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> + trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump-if "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">", "</span> << target<span class="Delimiter">.</span>value << <span class="Constant">":offset"</span><span class="Delimiter">;</span> + else if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"-unless"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> + trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump-unless "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">", "</span> << target<span class="Delimiter">.</span>value << <span class="Constant">":offset"</span><span class="Delimiter">;</span> + else + trace<span class="Delimiter">(</span><span class="Constant">"after-brace"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << target<span class="Delimiter">.</span>value << <span class="Constant">":offset"</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> @@ -219,12 +182,12 @@ LOOP<span class="Delimiter">,</span> LOOP_IF<span class="Delimiter">,</span> LOOP_UNLESS<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"break"</span>] = BREAK<span class="Delimiter">;</span> -Recipe_number[<span class="Constant">"break-if"</span>] = BREAK_IF<span class="Delimiter">;</span> -Recipe_number[<span class="Constant">"break-unless"</span>] = BREAK_UNLESS<span class="Delimiter">;</span> -Recipe_number[<span class="Constant">"loop"</span>] = LOOP<span class="Delimiter">;</span> -Recipe_number[<span class="Constant">"loop-if"</span>] = LOOP_IF<span class="Delimiter">;</span> -Recipe_number[<span class="Constant">"loop-unless"</span>] = LOOP_UNLESS<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"break"</span>] = BREAK<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"break-if"</span>] = BREAK_IF<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"break-unless"</span>] = BREAK_UNLESS<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"loop"</span>] = LOOP<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"loop-if"</span>] = LOOP_IF<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"loop-unless"</span>] = LOOP_UNLESS<span class="Delimiter">;</span> <span class="Delimiter">:(scenario loop)</span> recipe main [ @@ -427,6 +390,13 @@ recipe test-factorial [ <span class="Constant">4</span>:number<span class="Special"> <- </span>copy <span class="Constant">2</span>:number <span class="Comment"># trigger a read</span> ] <span class="traceContains">+mem: location 2 is 120</span> + +<span class="Delimiter">:(scenario break_outside_braces_warns)</span> +<span class="Special">% Hide_warnings = true;</span> +recipe main [ + <span class="Identifier">break</span> +] +<span class="traceContains">+warn: break wasn't inside {}</span> </pre> </body> </html> diff --git a/html/041name.cc.html b/html/041name.cc.html index f465a974..a019f954 100644 --- a/html/041name.cc.html +++ b/html/041name.cc.html @@ -56,18 +56,18 @@ recipe main [ Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_names<span class="Delimiter">);</span> <span class="Delimiter">:(before "End Globals")</span> -map<recipe_number<span class="Delimiter">,</span> map<string<span class="Delimiter">,</span> long long int> > Name<span class="Delimiter">;</span> +map<recipe_ordinal<span class="Delimiter">,</span> map<string<span class="Delimiter">,</span> long long int> > Name<span class="Delimiter">;</span> <span class="Delimiter">:(after "Clear Other State For recently_added_recipes")</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>recently_added_recipes<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> Name<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>recently_added_recipes<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> <span class="Delimiter">}</span> <span class="Delimiter">:(code)</span> -void transform_names<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +void transform_names<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> bool names_used = <span class="Constant">false</span><span class="Delimiter">;</span> bool numeric_locations_used = <span class="Constant">false</span><span class="Delimiter">;</span> map<string<span class="Delimiter">,</span> long long int>& names = Name[r]<span class="Delimiter">;</span> - map<string<span class="Delimiter">,</span> vector<type_number> > metadata<span class="Delimiter">;</span> + map<string<span class="Delimiter">,</span> vector<type_ordinal> > metadata<span class="Delimiter">;</span> <span class="Comment">// store the indices 'used' so far in the map</span> long long int& curr_idx = names[<span class="Constant">""</span>]<span class="Delimiter">;</span> ++curr_idx<span class="Delimiter">;</span> <span class="Comment">// avoid using index 0, benign skip in some other cases</span> @@ -98,11 +98,11 @@ void transform_names<span class="Delimiter">(</span>const recipe_number r<span c inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>lookup_name<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">),</span> r<span class="Delimiter">));</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>names_used && numeric_locations_used && r != Recipe_number[<span class="Constant">"interactive"</span>]<span class="Delimiter">)</span> + if <span class="Delimiter">(</span>names_used && numeric_locations_used && r != Recipe_ordinal[<span class="Constant">"interactive"</span>]<span class="Delimiter">)</span> raise << <span class="Constant">"mixing variable names and numeric addresses in "</span> << Recipe[r]<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> -void check_metadata<span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> vector<type_number> >& metadata<span class="Delimiter">,</span> const reagent& x<span class="Delimiter">,</span> const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +void check_metadata<span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> vector<type_ordinal> >& metadata<span class="Delimiter">,</span> const reagent& x<span class="Delimiter">,</span> const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> if <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// if you use raw locations you're probably doing something unsafe</span> @@ -130,19 +130,19 @@ bool already_transformed<span class="Delimiter">(</span>const reagent& r<spa <span class="Identifier">return</span> names<span class="Delimiter">.</span>find<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">)</span> != names<span class="Delimiter">.</span>end<span class="Delimiter">();</span> <span class="Delimiter">}</span> -long long int lookup_name<span class="Delimiter">(</span>const reagent& r<span class="Delimiter">,</span> const recipe_number default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> +long long int lookup_name<span class="Delimiter">(</span>const reagent& r<span class="Delimiter">,</span> const recipe_ordinal default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> Name[default_recipe][r<span class="Delimiter">.</span>name]<span class="Delimiter">;</span> <span class="Delimiter">}</span> -type_number skip_addresses<span class="Delimiter">(</span>const vector<type_number>& types<span class="Delimiter">)</span> <span class="Delimiter">{</span> +type_ordinal skip_addresses<span class="Delimiter">(</span>const vector<type_ordinal>& types<span class="Delimiter">)</span> <span class="Delimiter">{</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>types<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> - if <span class="Delimiter">(</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != Type_number[<span class="Constant">"address"</span>]<span class="Delimiter">)</span> <span class="Identifier">return</span> types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> + if <span class="Delimiter">(</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != Type_ordinal[<span class="Constant">"address"</span>]<span class="Delimiter">)</span> <span class="Identifier">return</span> types<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span class="Delimiter">}</span> raise << <span class="Constant">"expected a container"</span> << <span class="cSpecial">'\n'</span> << die<span class="Delimiter">();</span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> -int find_element_name<span class="Delimiter">(</span>const type_number t<span class="Delimiter">,</span> const string& name<span class="Delimiter">)</span> <span class="Delimiter">{</span> +int find_element_name<span class="Delimiter">(</span>const type_ordinal t<span class="Delimiter">,</span> const string& name<span class="Delimiter">)</span> <span class="Delimiter">{</span> const type_info& container = Type[t]<span class="Delimiter">;</span> <span class="CommentedCode">//? cout << "looking for element " << name << " in type " << container.name << " with " << SIZE(container.element_names) << " elements\n"; //? 1</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>container<span class="Delimiter">.</span>element_names<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -251,8 +251,8 @@ recipe main [ <span class="Delimiter">:(after "Per-recipe Transforms")</span> <span class="Comment">// replace element names of containers with offsets</span> -if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"get"</span>] - || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"get-address"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> +if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"get"</span>] + || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"get-address"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// at least 2 args, and second arg is offset</span> assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> >= <span class="Constant">2</span><span class="Delimiter">);</span> <span class="CommentedCode">//? cout << inst.ingredients.at(1).to_string() << '\n'; //? 1</span> @@ -260,7 +260,7 @@ if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation raise << inst<span class="Delimiter">.</span>to_string<span class="Delimiter">()</span> << <span class="Constant">": expected literal; got "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << die<span class="Delimiter">();</span> if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">"0123456789"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// since first non-address in base type must be a container, we don't have to canonize</span> - type_number base_type = skip_addresses<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>types<span class="Delimiter">);</span> + type_ordinal base_type = skip_addresses<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>types<span class="Delimiter">);</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>find_element_name<span class="Delimiter">(</span>base_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">));</span> trace<span class="Delimiter">(</span><span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"element "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">" of type "</span> << Type[base_type]<span class="Delimiter">.</span>name << <span class="Constant">" is at offset "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -291,13 +291,13 @@ recipe main [ <span class="Delimiter">:(after "Per-recipe Transforms")</span> <span class="Comment">// convert variant names of exclusive containers</span> -if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"maybe-convert"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> +if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"maybe-convert"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// at least 2 args, and second arg is offset</span> assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> >= <span class="Constant">2</span><span class="Delimiter">);</span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span> if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">"0123456789"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// since first non-address in base type must be an exclusive container, we don't have to canonize</span> - type_number base_type = skip_addresses<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>types<span class="Delimiter">);</span> + type_ordinal base_type = skip_addresses<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>types<span class="Delimiter">);</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>find_element_name<span class="Delimiter">(</span>base_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">));</span> trace<span class="Delimiter">(</span><span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"variant "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">" of type "</span> << Type[base_type]<span class="Delimiter">.</span>name << <span class="Constant">" has tag "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">;</span> <span class="Delimiter">}</span> diff --git a/html/042new.cc.html b/html/042new.cc.html index ca62a658..ec3963ed 100644 --- a/html/042new.cc.html +++ b/html/042new.cc.html @@ -63,10 +63,10 @@ trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimite <span class="SalientComment">//:: First handle 'type' operands.</span> <span class="Delimiter">:(before "End Mu Types Initialization")</span> -Type_number[<span class="Constant">"type"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> +Type_ordinal[<span class="Constant">"type"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Delimiter">:(after "Per-recipe Transforms")</span> -<span class="Comment">// replace type names with type_numbers</span> -if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"new"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span class="Comment">// replace type names with type_ordinals</span> +if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"new"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// End NEW Transform Special-cases</span> <span class="Comment">// first arg must be of type 'type'</span> assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> >= <span class="Constant">1</span><span class="Delimiter">);</span> @@ -74,10 +74,10 @@ if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation raise << <span class="Constant">"expected literal, got "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << die<span class="Delimiter">();</span> if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != <span class="Constant">"type"</span><span class="Delimiter">)</span> raise << <span class="Constant">"tried to allocate non-type "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>to_string<span class="Delimiter">()</span> << <span class="Constant">" in recipe "</span> << Recipe[r]<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span> << die<span class="Delimiter">();</span> - if <span class="Delimiter">(</span>Type_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> == Type_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> + if <span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> == Type_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> raise << <span class="Constant">"unknown type "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">" in recipe "</span> << Recipe[r]<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span> << die<span class="Delimiter">();</span> -<span class="CommentedCode">//? cerr << "type " << inst.ingredients.at(0).name << " => " << Type_number[inst.ingredients.at(0).name] << '\n'; //? 1</span> - inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>Type_number[inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">);</span> +<span class="CommentedCode">//? cerr << "type " << inst.ingredients.at(0).name << " => " << Type_ordinal[inst.ingredients.at(0).name] << '\n'; //? 1</span> + inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>Type_ordinal[inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">);</span> trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">"new"</span><span class="Delimiter">)</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">" -> "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">;</span> end_new_transform:<span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -88,14 +88,14 @@ if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> NEW<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"new"</span>] = NEW<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"new"</span>] = NEW<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case NEW: <span class="Delimiter">{</span> <span class="Comment">// compute the space we need</span> long long int size = <span class="Constant">0</span><span class="Delimiter">;</span> long long int array_length = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Delimiter">{</span> - vector<type_number> type<span class="Delimiter">;</span> + vector<type_ordinal> type<span class="Delimiter">;</span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> type<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>value<span class="Delimiter">);</span> <span class="CommentedCode">//? trace(Primitive_recipe_depth, "mem") << "type " << current_instruction().ingredients.at(0).to_string() << ' ' << type.size() << ' ' << type.back() << " has size " << size_of(type); //? 1</span> @@ -238,17 +238,22 @@ recipe main [ <span class="Delimiter">:(after "case NEW" following "Primitive Recipe Implementations")</span> if <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> && current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == <span class="Constant">"literal-string"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> + products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>new_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">));</span> + <span class="Identifier">break</span><span class="Delimiter">;</span> +<span class="Delimiter">}</span> + +<span class="Delimiter">:(code)</span> +long long int new_string<span class="Delimiter">(</span>const string& contents<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// allocate an array just large enough for it</span> - long long int string_length = unicode_length<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">);</span> + long long int string_length = unicode_length<span class="Delimiter">(</span>contents<span class="Delimiter">);</span> <span class="CommentedCode">//? cout << "string_length is " << string_length << '\n'; //? 1</span> ensure_space<span class="Delimiter">(</span>string_length+<span class="Constant">1</span><span class="Delimiter">);</span> <span class="Comment">// don't forget the extra location for array size</span> - products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> - products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>alloc<span class="Delimiter">);</span> <span class="Comment">// initialize string</span> <span class="CommentedCode">//? cout << "new string literal: " << current_instruction().ingredients.at(0).name << '\n'; //? 1</span> + long long int result = Current_routine<span class="Delimiter">-></span>alloc<span class="Delimiter">;</span> Memory[Current_routine<span class="Delimiter">-></span>alloc++] = string_length<span class="Delimiter">;</span> long long int curr = <span class="Constant">0</span><span class="Delimiter">;</span> - const string& contents = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">;</span> const char* raw_contents = contents<span class="Delimiter">.</span>c_str<span class="Delimiter">();</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < string_length<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> uint32_t curr_character<span class="Delimiter">;</span> @@ -259,7 +264,7 @@ if <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>cur ++Current_routine<span class="Delimiter">-></span>alloc<span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Comment">// mu strings are not null-terminated in memory</span> - <span class="Identifier">break</span><span class="Delimiter">;</span> + <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Comment">//: Allocate more to routine when initializing a literal string</span> diff --git a/html/043space.cc.html b/html/043space.cc.html index f43b35a5..f6d61fba 100644 --- a/html/043space.cc.html +++ b/html/043space.cc.html @@ -85,8 +85,8 @@ default_space = <span class="Constant">0</span><span class="Delimiter">;</span> reagent r = absolutize<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span class="Delimiter">:(code)</span> reagent absolutize<span class="Delimiter">(</span>reagent x<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span class="CommentedCode">//? if (Recipe_number.find("increment-counter") != Recipe_number.end()) //? 1</span> -<span class="CommentedCode">//? cout << "AAA " << "increment-counter/2: " << Recipe[Recipe_number["increment-counter"]].steps.at(2).products.at(0).to_string() << '\n'; //? 1</span> +<span class="CommentedCode">//? if (Recipe_ordinal.find("increment-counter") != Recipe_ordinal.end()) //? 1</span> +<span class="CommentedCode">//? cout << "AAA " << "increment-counter/2: " << Recipe[Recipe_ordinal["increment-counter"]].steps.at(2).products.at(0).to_string() << '\n'; //? 1</span> <span class="CommentedCode">//? cout << "absolutize " << x.to_string() << '\n'; //? 4</span> <span class="CommentedCode">//? cout << is_raw(x) << '\n'; //? 1</span> if <span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">)</span> || is_dummy<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> x<span class="Delimiter">;</span> diff --git a/html/045closure_name.cc.html b/html/045closure_name.cc.html index 85686258..892495e8 100644 --- a/html/045closure_name.cc.html +++ b/html/045closure_name.cc.html @@ -69,13 +69,13 @@ recipe increment-counter [ <span class="Comment">//: surrounding space of each recipe. This must happen before transform_names.</span> <span class="Delimiter">:(before "End Globals")</span> -map<recipe_number<span class="Delimiter">,</span> recipe_number> Surrounding_space<span class="Delimiter">;</span> +map<recipe_ordinal<span class="Delimiter">,</span> recipe_ordinal> Surrounding_space<span class="Delimiter">;</span> <span class="Delimiter">:(after "int main")</span> Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>collect_surrounding_spaces<span class="Delimiter">);</span> <span class="Delimiter">:(code)</span> -void collect_surrounding_spaces<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +void collect_surrounding_spaces<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> const instruction& inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> @@ -83,9 +83,9 @@ void collect_surrounding_spaces<span class="Delimiter">(</span>const recipe_numb if <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>name != <span class="Constant">"0"</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">)</span> != <span class="Constant">3</span> - || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != Type_number[<span class="Constant">"address"</span>] - || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)</span> != Type_number[<span class="Constant">"array"</span>] - || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">)</span> != Type_number[<span class="Constant">"location"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> + || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> != Type_ordinal[<span class="Constant">"address"</span>] + || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)</span> != Type_ordinal[<span class="Constant">"array"</span>] + || inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">)</span> != Type_ordinal[<span class="Constant">"location"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> raise << <span class="Constant">"slot 0 should always have type address:array:location, but is "</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -95,12 +95,12 @@ void collect_surrounding_spaces<span class="Delimiter">(</span>const recipe_numb if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>s<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> raise << <span class="Constant">"slot 0 should have a single value in /names, got "</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> string surrounding_recipe_name = s<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> if <span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">.</span>find<span class="Delimiter">(</span>r<span class="Delimiter">)</span> != Surrounding_space<span class="Delimiter">.</span>end<span class="Delimiter">()</span> - && Surrounding_space[r] != Recipe_number[surrounding_recipe_name]<span class="Delimiter">)</span> <span class="Delimiter">{</span> + && Surrounding_space[r] != Recipe_ordinal[surrounding_recipe_name]<span class="Delimiter">)</span> <span class="Delimiter">{</span> raise << <span class="Constant">"recipe "</span> << Recipe[r]<span class="Delimiter">.</span>name << <span class="Constant">" can have only one 'surrounding' recipe but has "</span> << Recipe[Surrounding_space[r]]<span class="Delimiter">.</span>name << <span class="Constant">" and "</span> << surrounding_recipe_name << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> trace<span class="Delimiter">(</span><span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"recipe "</span> << Recipe[r]<span class="Delimiter">.</span>name << <span class="Constant">" is surrounded by "</span> << surrounding_recipe_name<span class="Delimiter">;</span> - Surrounding_space[r] = Recipe_number[surrounding_recipe_name]<span class="Delimiter">;</span> + Surrounding_space[r] = Recipe_ordinal[surrounding_recipe_name]<span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> @@ -108,8 +108,8 @@ void collect_surrounding_spaces<span class="Delimiter">(</span>const recipe_numb <span class="Comment">//: Once surrounding spaces are available, transform_names uses them to handle</span> <span class="Comment">//: /space properties.</span> -<span class="Delimiter">:(replace{} "long long int lookup_name(const reagent& r, const recipe_number default_recipe)")</span> -long long int lookup_name<span class="Delimiter">(</span>const reagent& x<span class="Delimiter">,</span> const recipe_number default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span class="Delimiter">:(replace{} "long long int lookup_name(const reagent& r, const recipe_ordinal default_recipe)")</span> +long long int lookup_name<span class="Delimiter">(</span>const reagent& x<span class="Delimiter">,</span> const recipe_ordinal default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cout << "AAA " << default_recipe << " " << Recipe[default_recipe].name << '\n'; //? 2</span> <span class="CommentedCode">//? cout << "AAA " << x.to_string() << '\n'; //? 1</span> if <span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">"space"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> @@ -120,15 +120,15 @@ long long int lookup_name<span class="Delimiter">(</span>const reagent& x<sp if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>p<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> raise << <span class="Constant">"/space property should have exactly one (non-negative integer) value</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> long long int n = to_integer<span class="Delimiter">(</span>p<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> assert<span class="Delimiter">(</span>n >= <span class="Constant">0</span><span class="Delimiter">);</span> - recipe_number surrounding_recipe = lookup_surrounding_recipe<span class="Delimiter">(</span>default_recipe<span class="Delimiter">,</span> n<span class="Delimiter">);</span> - set<recipe_number> done<span class="Delimiter">;</span> - vector<recipe_number> path<span class="Delimiter">;</span> + recipe_ordinal surrounding_recipe = lookup_surrounding_recipe<span class="Delimiter">(</span>default_recipe<span class="Delimiter">,</span> n<span class="Delimiter">);</span> + set<recipe_ordinal> done<span class="Delimiter">;</span> + vector<recipe_ordinal> path<span class="Delimiter">;</span> <span class="Identifier">return</span> lookup_name<span class="Delimiter">(</span>x<span class="Delimiter">,</span> surrounding_recipe<span class="Delimiter">,</span> done<span class="Delimiter">,</span> path<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Comment">// If the recipe we need to lookup this name in doesn't have names done yet,</span> <span class="Comment">// recursively call transform_names on it.</span> -long long int lookup_name<span class="Delimiter">(</span>const reagent& x<span class="Delimiter">,</span> const recipe_number r<span class="Delimiter">,</span> set<recipe_number>& done<span class="Delimiter">,</span> vector<recipe_number>& path<span class="Delimiter">)</span> <span class="Delimiter">{</span> +long long int lookup_name<span class="Delimiter">(</span>const reagent& x<span class="Delimiter">,</span> const recipe_ordinal r<span class="Delimiter">,</span> set<recipe_ordinal>& done<span class="Delimiter">,</span> vector<recipe_ordinal>& path<span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>!Name[r]<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> Name[r][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span> if <span class="Delimiter">(</span>done<span class="Delimiter">.</span>find<span class="Delimiter">(</span>r<span class="Delimiter">)</span> != done<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> raise << <span class="Constant">"can't compute address of "</span> << x<span class="Delimiter">.</span>to_string<span class="Delimiter">()</span> << <span class="Constant">" because "</span><span class="Delimiter">;</span> @@ -145,7 +145,7 @@ long long int lookup_name<span class="Delimiter">(</span>const reagent& x<sp <span class="Identifier">return</span> Name[r][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span> <span class="Delimiter">}</span> -recipe_number lookup_surrounding_recipe<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">,</span> long long int n<span class="Delimiter">)</span> <span class="Delimiter">{</span> +recipe_ordinal lookup_surrounding_recipe<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">,</span> long long int n<span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>n == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> r<span class="Delimiter">;</span> if <span class="Delimiter">(</span>Surrounding_space<span class="Delimiter">.</span>find<span class="Delimiter">(</span>r<span class="Delimiter">)</span> == Surrounding_space<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> raise << <span class="Constant">"don't know surrounding recipe of "</span> << Recipe[r]<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> diff --git a/html/046tangle.cc.html b/html/046tangle.cc.html index b863b80c..15a61c22 100644 --- a/html/046tangle.cc.html +++ b/html/046tangle.cc.html @@ -77,7 +77,7 @@ else if <span class="Delimiter">(</span>command == <span class="Constant">" Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>insert_fragments<span class="Delimiter">);</span> <span class="Delimiter">:(code)</span> -void insert_fragments<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +void insert_fragments<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// Copy into a new vector because insertions invalidate iterators.</span> <span class="Comment">// But this way we can't insert into labels created inside before/after.</span> vector<instruction> result<span class="Delimiter">;</span> diff --git a/html/047jump_label.cc.html b/html/047jump_label.cc.html index df4ed5ad..0573ff3c 100644 --- a/html/047jump_label.cc.html +++ b/html/047jump_label.cc.html @@ -46,13 +46,13 @@ recipe main [ <span class="traceAbsent">-mem: storing 0 in location 1</span> <span class="Delimiter">:(before "End Mu Types Initialization")</span> -Type_number[<span class="Constant">"label"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> +Type_ordinal[<span class="Constant">"label"</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Delimiter">:(after "int main")</span> Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_labels<span class="Delimiter">);</span> <span class="Delimiter">:(code)</span> -void transform_labels<span class="Delimiter">(</span>const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +void transform_labels<span class="Delimiter">(</span>const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> map<string<span class="Delimiter">,</span> long long int> offset<span class="Delimiter">;</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> const instruction& inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> @@ -60,19 +60,19 @@ void transform_labels<span class="Delimiter">(</span>const recipe_number r<span <span class="Delimiter">}</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> instruction& inst = Recipe[r]<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> - if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"jump"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"jump"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << inst.to_string() << '\n'; //? 1</span> replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"jump-if"</span>] || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"jump-unless"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"jump-if"</span>] || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"jump-unless"</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span class="Delimiter">}</span> - if <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"loop"</span>] || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"break"</span>]<span class="Delimiter">)</span> + if <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"loop"</span>] || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"break"</span>]<span class="Delimiter">)</span> && SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span class="Delimiter">}</span> - if <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"loop-if"</span>] || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"loop-unless"</span>] - || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"break-if"</span>] || inst<span class="Delimiter">.</span>operation == Recipe_number[<span class="Constant">"break-unless"</span>]<span class="Delimiter">)</span> + if <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"loop-if"</span>] || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"loop-unless"</span>] + || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"break-if"</span>] || inst<span class="Delimiter">.</span>operation == Recipe_ordinal[<span class="Constant">"break-unless"</span>]<span class="Delimiter">)</span> && SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> == <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span class="Delimiter">}</span> @@ -80,7 +80,7 @@ void transform_labels<span class="Delimiter">(</span>const recipe_number r<span <span class="Delimiter">}</span> <span class="Delimiter">:(code)</span> -void replace_offset<span class="Delimiter">(</span>reagent& x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> map<string<span class="Delimiter">,</span> long long int>& offset<span class="Delimiter">,</span> const long long int current_offset<span class="Delimiter">,</span> const recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +void replace_offset<span class="Delimiter">(</span>reagent& x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> map<string<span class="Delimiter">,</span> long long int>& offset<span class="Delimiter">,</span> const long long int current_offset<span class="Delimiter">,</span> const recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << "AAA " << x.to_string() << '\n'; //? 1</span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">));</span> <span class="CommentedCode">//? cerr << "BBB " << x.to_string() << '\n'; //? 1</span> diff --git a/html/048call_variable.cc.html b/html/048call_variable.cc.html deleted file mode 100644 index 225ee513..00000000 --- a/html/048call_variable.cc.html +++ /dev/null @@ -1,81 +0,0 @@ -<!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 - 048call_variable.cc</title> -<meta name="Generator" content="Vim/7.4"> -<meta name="plugin-version" content="vim7.4_v1"> -<meta name="syntax" content="cpp"> -<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,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-family: monospace; color: #eeeeee; background-color: #080808; } -* { font-size: 1.05em; } -.traceContains { color: #008000; } -.Constant { color: #00a0a0; } -.Comment { color: #9090ff; } -.Delimiter { color: #a04060; } -.Special { color: #ff6060; } -.CommentedCode { color: #6c6c6c; } -.Identifier { color: #804000; } ---> -</style> - -<script type='text/javascript'> -<!-- - ---> -</script> -</head> -<body> -<pre id='vimCodeElement'> -<span class="Comment">//: push a variable recipe on the call stack</span> - -<span class="Delimiter">:(scenario call_literal_recipe)</span> -recipe main [ - <span class="Constant">1</span>:number<span class="Special"> <- </span>call f:recipe<span class="Delimiter">,</span> <span class="Constant">34</span>:literal -] -recipe f [ - <span class="Constant">2</span>:number<span class="Special"> <- </span>next-ingredient - reply <span class="Constant">2</span>:number -] -<span class="traceContains">+mem: storing 34 in location 1</span> - -<span class="Delimiter">:(scenario call_variable)</span> -recipe main [ - <span class="Constant">1</span>:number/recipe<span class="Special"> <- </span>copy <span class="Constant">1001</span>:literal/f <span class="Comment"># hack: assumes tests start recipes at 1000</span> - <span class="Constant">2</span>:number<span class="Special"> <- </span>call <span class="Constant">1</span>:number/recipe<span class="Delimiter">,</span> <span class="Constant">34</span>:literal -] -recipe f [ <span class="Comment"># recipe 1001</span> - <span class="Constant">3</span>:number<span class="Special"> <- </span>next-ingredient - reply <span class="Constant">3</span>:number -] -<span class="traceContains">+mem: storing 34 in location 2</span> -<span class="CommentedCode">#? ?</span> - -<span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> -CALL<span class="Delimiter">,</span> -<span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"call"</span>] = CALL<span class="Delimiter">;</span> -<span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> -case CALL: <span class="Delimiter">{</span> - recipe_number r = <span class="Constant">0</span><span class="Delimiter">;</span> - if <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>initialized<span class="Delimiter">)</span> <span class="Delimiter">{</span> - assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> - <span class="Comment">// 'call' received an integer recipe_number</span> - r = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> - <span class="Delimiter">}</span> - else <span class="Delimiter">{</span> - <span class="Comment">// 'call' received a literal recipe name</span> - r = Recipe_number[current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">;</span> - <span class="Delimiter">}</span> - Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>r<span class="Delimiter">));</span> - ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span> <span class="Comment">// drop the callee</span> - <span class="Identifier">goto</span> complete_call<span class="Delimiter">;</span> -<span class="Delimiter">}</span> -</pre> -</body> -</html> -<!-- vim: set foldmethod=manual : --> diff --git a/html/049continuation.cc.html b/html/049continuation.cc.html index cc734e78..0eba6a43 100644 --- a/html/049continuation.cc.html +++ b/html/049continuation.cc.html @@ -49,13 +49,13 @@ Continuation<span class="Delimiter">.</span>clear<span class="Delimiter">();</sp Next_continuation_id = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Delimiter">:(before "End Mu Types Initialization")</span> -type_number continuation = Type_number[<span class="Constant">"continuation"</span>] = Next_type_number++<span class="Delimiter">;</span> +type_ordinal continuation = Type_ordinal[<span class="Constant">"continuation"</span>] = Next_type_ordinal++<span class="Delimiter">;</span> Type[continuation]<span class="Delimiter">.</span>name = <span class="Constant">"continuation"</span><span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> CURRENT_CONTINUATION<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"current-continuation"</span>] = CURRENT_CONTINUATION<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"current-continuation"</span>] = CURRENT_CONTINUATION<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case CURRENT_CONTINUATION: <span class="Delimiter">{</span> <span class="Comment">// copy the current call stack</span> @@ -72,7 +72,7 @@ case CURRENT_CONTINUATION: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> CONTINUE_FROM<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"continue-from"</span>] = CONTINUE_FROM<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"continue-from"</span>] = CONTINUE_FROM<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case CONTINUE_FROM: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> @@ -200,11 +200,11 @@ is_reset = <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> CREATE_DELIMITED_CONTINUATION<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"create-delimited-continuation"</span>] = CREATE_DELIMITED_CONTINUATION<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"create-delimited-continuation"</span>] = CREATE_DELIMITED_CONTINUATION<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case CREATE_DELIMITED_CONTINUATION: <span class="Delimiter">{</span> Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>is_reset = <span class="Constant">true</span><span class="Delimiter">;</span> - Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>Recipe_number[current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">));</span> + Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>Recipe_ordinal[current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name]<span class="Delimiter">));</span> ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span> <span class="Comment">// drop the callee</span> <span class="Identifier">goto</span> complete_call<span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -222,7 +222,7 @@ Next_delimited_continuation_id = <span class="Constant">0</span><span class="Del <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> REPLY_DELIMITED_CONTINUATION<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"reply-delimited-continuation"</span>] = REPLY_DELIMITED_CONTINUATION<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"reply-delimited-continuation"</span>] = REPLY_DELIMITED_CONTINUATION<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case REPLY_DELIMITED_CONTINUATION: <span class="Delimiter">{</span> <span class="Comment">// first clear any existing ingredients, to isolate the creation of the</span> diff --git a/html/050scenario.cc.html b/html/050scenario.cc.html index d49f477e..ca947e34 100644 --- a/html/050scenario.cc.html +++ b/html/050scenario.cc.html @@ -146,19 +146,18 @@ time_t mu_time<span class="Delimiter">;</span> time<span class="Delimiter">(</sp cerr << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">Mu tests: "</span> << ctime<span class="Delimiter">(</span>&mu_time<span class="Delimiter">);</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << Passed << '\n'; //? 1</span> -<span class="CommentedCode">//? cerr << i << ": " << Scenarios.at(i).name << '\n'; //? 5</span> +<span class="CommentedCode">//? cerr << i << ": " << Scenarios.at(i).name << '\n'; //? 6</span> run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> if <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr << <span class="Constant">"."</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Comment">//: Convenience: run a single named scenario.</span> -<span class="Delimiter">:(before "Loading Commandline Files")</span> -if <span class="Delimiter">(</span>argc == <span class="Constant">2</span> && Run_tests<span class="Delimiter">)</span> <span class="Delimiter">{</span> - for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> - if <span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == argv[<span class="Constant">1</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> - run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> - <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> +<span class="Delimiter">:(after "Test Runs")</span> +for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == argv[argc-<span class="Constant">1</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> + run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> + if <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr << <span class="Constant">".</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> + <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> @@ -168,14 +167,14 @@ const scenario* Current_scenario = <span class="Constant">NULL</span><span class void run_mu_scenario<span class="Delimiter">(</span>const scenario& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> Current_scenario = &s<span class="Delimiter">;</span> bool not_already_inside_test = !Trace_stream<span class="Delimiter">;</span> -<span class="CommentedCode">//? cerr << s.name << '\n'; //? 6</span> +<span class="CommentedCode">//? cerr << s.name << '\n'; //? 11</span> if <span class="Delimiter">(</span>not_already_inside_test<span class="Delimiter">)</span> <span class="Delimiter">{</span> Trace_file = s<span class="Delimiter">.</span>name<span class="Delimiter">;</span> Trace_stream = new trace_stream<span class="Delimiter">;</span> setup<span class="Delimiter">();</span> <span class="Delimiter">}</span> assert<span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> - vector<recipe_number> tmp = load<span class="Delimiter">(</span><span class="Constant">"recipe "</span>+s<span class="Delimiter">.</span>name+<span class="Constant">" [ "</span>+s<span class="Delimiter">.</span>to_run+<span class="Constant">" ]"</span><span class="Delimiter">);</span> + vector<recipe_ordinal> tmp = load<span class="Delimiter">(</span><span class="Constant">"recipe "</span>+s<span class="Delimiter">.</span>name+<span class="Constant">" [ "</span>+s<span class="Delimiter">.</span>to_run+<span class="Constant">" ]"</span><span class="Delimiter">);</span> bind_special_scenario_names<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> transform_all<span class="Delimiter">();</span> run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>front<span class="Delimiter">());</span> @@ -209,17 +208,17 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> RUN<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"run"</span>] = RUN<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"run"</span>] = RUN<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case RUN: <span class="Delimiter">{</span> <span class="CommentedCode">//? cout << "recipe " << current_instruction().ingredients.at(0).name << '\n'; //? 1</span> ostringstream tmp<span class="Delimiter">;</span> - tmp << <span class="Constant">"recipe run"</span> << Next_recipe_number << <span class="Constant">" [ "</span> << current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">" ]"</span><span class="Delimiter">;</span> + tmp << <span class="Constant">"recipe run"</span> << Next_recipe_ordinal << <span class="Constant">" [ "</span> << current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name << <span class="Constant">" ]"</span><span class="Delimiter">;</span> <span class="CommentedCode">//? Show_rest_of_stream = true; //? 1</span> - vector<recipe_number> tmp_recipe = load<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>str<span class="Delimiter">());</span> + vector<recipe_ordinal> tmp_recipe = load<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>str<span class="Delimiter">());</span> bind_special_scenario_names<span class="Delimiter">(</span>tmp_recipe<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> transform_all<span class="Delimiter">();</span> -<span class="CommentedCode">//? cout << tmp_recipe.at(0) << ' ' << Recipe_number["main"] << '\n'; //? 1</span> +<span class="CommentedCode">//? cout << tmp_recipe.at(0) << ' ' << Recipe_ordinal["main"] << '\n'; //? 1</span> Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>tmp_recipe<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// not done with caller; don't increment current_step_index()</span> <span class="Delimiter">}</span> @@ -227,7 +226,7 @@ case RUN: <span class="Delimiter">{</span> <span class="Comment">// Some variables for fake resources always get special addresses in</span> <span class="Comment">// scenarios.</span> <span class="Delimiter">:(code)</span> -void bind_special_scenario_names<span class="Delimiter">(</span>recipe_number r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +void bind_special_scenario_names<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// Special Scenario Variable Names(r)</span> <span class="Comment">// End Special Scenario Variable Names(r)</span> <span class="Delimiter">}</span> @@ -247,7 +246,13 @@ recipe main [ <span class="Comment">//: 'memory-should-contain' raises warnings if specific locations aren't as expected</span> <span class="Comment">//: Also includes some special support for checking strings.</span> +<span class="Delimiter">:(before "End Globals")</span> +bool Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span> +<span class="Delimiter">:(before "End Setup")</span> +Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span> + <span class="Delimiter">:(scenario memory_check)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ memory-should-contain [ @@ -260,7 +265,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> MEMORY_SHOULD_CONTAIN<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"memory-should-contain"</span>] = MEMORY_SHOULD_CONTAIN<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"memory-should-contain"</span>] = MEMORY_SHOULD_CONTAIN<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case MEMORY_SHOULD_CONTAIN: <span class="Delimiter">{</span> if <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -291,7 +296,7 @@ void check_memory<span class="Delimiter">(</span>const string& s<span class= raise << <span class="Constant">"duplicate expectation for location "</span> << address << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking location "</span> << address<span class="Delimiter">;</span> if <span class="Delimiter">(</span>Memory[address] != value<span class="Delimiter">)</span> <span class="Delimiter">{</span> - if <span class="Delimiter">(</span>Current_scenario && !Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// genuine test in a mu file</span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location "</span> << address << <span class="Constant">" to contain "</span> << value << <span class="Constant">" but saw "</span> << Memory[address] << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -299,7 +304,7 @@ void check_memory<span class="Delimiter">(</span>const string& s<span class= <span class="Comment">// just testing scenario support</span> raise << <span class="Constant">"expected location "</span> << address << <span class="Constant">" to contain "</span> << value << <span class="Constant">" but saw "</span> << Memory[address] << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>!Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> ++Num_failures<span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -331,11 +336,11 @@ void check_type<span class="Delimiter">(</span>const string& lhs<span class= void check_string<span class="Delimiter">(</span>long long int address<span class="Delimiter">,</span> const string& literal<span class="Delimiter">)</span> <span class="Delimiter">{</span> trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking string length at "</span> << address<span class="Delimiter">;</span> if <span class="Delimiter">(</span>Memory[address] != SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">))</span> <span class="Delimiter">{</span> - if <span class="Delimiter">(</span>Current_scenario && !Hide_warnings<span class="Delimiter">)</span> + if <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location "</span> << address << <span class="Constant">" to contain length "</span> << SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">)</span> << <span class="Constant">" of string ["</span> << literal << <span class="Constant">"] but saw "</span> << Memory[address] << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> else raise << <span class="Constant">"expected location "</span> << address << <span class="Constant">" to contain length "</span> << SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">)</span> << <span class="Constant">" of string ["</span> << literal << <span class="Constant">"] but saw "</span> << Memory[address] << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> - if <span class="Delimiter">(</span>!Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> ++Num_failures<span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -345,7 +350,7 @@ void check_string<span class="Delimiter">(</span>long long int address<span clas for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> trace<span class="Delimiter">(</span>Primitive_recipe_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking location "</span> << address+i<span class="Delimiter">;</span> if <span class="Delimiter">(</span>Memory[address+i] != literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Delimiter">{</span> - if <span class="Delimiter">(</span>Current_scenario && !Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// genuine test in a mu file</span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location "</span> << <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> << <span class="Constant">" to contain "</span> << literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << Memory[address+i] << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -353,7 +358,7 @@ void check_string<span class="Delimiter">(</span>long long int address<span clas <span class="Comment">// just testing scenario support</span> raise << <span class="Constant">"expected location "</span> << <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> << <span class="Constant">" to contain "</span> << literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << Memory[address+i] << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>!Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> ++Num_failures<span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -363,6 +368,7 @@ void check_string<span class="Delimiter">(</span>long long int address<span clas <span class="Delimiter">}</span> <span class="Delimiter">:(scenario memory_check_multiple)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ memory-should-contain [ @@ -373,6 +379,7 @@ recipe main [ <span class="traceContains">+warn: duplicate expectation for location 1</span> <span class="Delimiter">:(scenario memory_check_string_length)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">3</span>:literal @@ -405,12 +412,9 @@ recipe main [ <span class="Comment">// Like runs of contiguous '+' lines, order is important. The trace checks</span> <span class="Comment">// that the lines are present *and* in the specified sequence. (There can be</span> <span class="Comment">// other lines in between.)</span> -<span class="Comment">//</span> -<span class="Comment">// Be careful not to mix setting Hide_warnings and checking the trace in .mu</span> -<span class="Comment">// files. It'll work in C++ scenarios, but the test failure gets silently</span> -<span class="Comment">// hidden in mu scenarios.</span> <span class="Delimiter">:(scenario trace_check_warns_on_failure)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ trace-should-contain [ @@ -423,7 +427,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> TRACE_SHOULD_CONTAIN<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"trace-should-contain"</span>] = TRACE_SHOULD_CONTAIN<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"trace-should-contain"</span>] = TRACE_SHOULD_CONTAIN<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span> if <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -471,6 +475,7 @@ vector<trace_line> parse_trace<span class="Delimiter">(</span>const string <span class="Delimiter">}</span> <span class="Delimiter">:(scenario trace_check_warns_on_failure_in_later_line)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ run [ @@ -484,6 +489,7 @@ recipe main [ <span class="traceContains">+warn: missing [d] in trace layer a</span> <span class="Delimiter">:(scenario trace_check_passes_silently)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ run [ @@ -501,6 +507,7 @@ $warn: <span class="Constant">0</span> <span class="Comment">//: important, so you can't say things like "B should not exist after A."</span> <span class="Delimiter">:(scenario trace_negative_check_warns_on_failure)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ run [ @@ -515,7 +522,7 @@ recipe main [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"trace-should-not-contain"</span>] = TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"trace-should-not-contain"</span>] = TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span> if <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -540,6 +547,7 @@ bool check_trace_missing<span class="Delimiter">(</span>const string& in<spa <span class="Delimiter">}</span> <span class="Delimiter">:(scenario trace_negative_check_passes_silently)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ trace-should-not-contain [ @@ -550,6 +558,7 @@ recipe main [ $warn: <span class="Constant">0</span> <span class="Delimiter">:(scenario trace_negative_check_warns_on_any_unexpected_line)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ run [ diff --git a/html/060string.mu.html b/html/060string.mu.html index d917c926..45ff99e2 100644 --- a/html/060string.mu.html +++ b/html/060string.mu.html @@ -145,7 +145,8 @@ container buffer [ len:address:number<span class="Special"> <- </span>get-address result:address:buffer/deref, length:offset len:address:number/deref<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> s:address:address:array:character<span class="Special"> <- </span>get-address result:address:buffer/deref, data:offset - capacity:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + capacity:number, found?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + assert found?:boolean, <span class="Constant">[new-buffer must get a capacity argument]</span> s:address:address:array:character/deref<span class="Special"> <- </span>new character:type, capacity:number <span class="CommentedCode">#? $print s:address:address:array:character/deref, [</span> <span class="CommentedCode">#? ]</span> @@ -207,7 +208,13 @@ container buffer [ in:address:buffer<span class="Special"> <- </span>grow-buffer in:address:buffer <span class="Delimiter">}</span> s:address:array:character<span class="Special"> <- </span>get in:address:buffer/deref, data:offset +<span class="CommentedCode">#? $print [array underlying buf: ], s:address:array:character, [ </span> +<span class="CommentedCode">#? ] #? 1</span> +<span class="CommentedCode">#? $print [index: ], len:address:number/deref, [ </span> +<span class="CommentedCode">#? ] #? 1</span> dest:address:character<span class="Special"> <- </span>index-address s:address:array:character/deref, len:address:number/deref +<span class="CommentedCode">#? $print [storing ], c:character, [ in ], dest:address:character, [ </span> +<span class="CommentedCode">#? ] #? 1</span> dest:address:character/deref<span class="Special"> <- </span>copy c:character len:address:number/deref<span class="Special"> <- </span>add len:address:number/deref, <span class="Constant">1:literal</span> <span class="muControl">reply</span> in:address:buffer/same-as-ingredient:0 diff --git a/html/064random.cc.html b/html/064random.cc.html index f783de38..b340cf44 100644 --- a/html/064random.cc.html +++ b/html/064random.cc.html @@ -34,7 +34,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> RANDOM<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"random"</span>] = RANDOM<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"random"</span>] = RANDOM<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case RANDOM: <span class="Delimiter">{</span> <span class="Comment">// todo: limited range of numbers, might be imperfectly random</span> @@ -47,7 +47,7 @@ case RANDOM: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"make-random-nondeterministic"</span>] = MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"make-random-nondeterministic"</span>] = MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span> srand<span class="Delimiter">(</span>time<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">));</span> @@ -57,7 +57,7 @@ case MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> ROUND<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"round"</span>] = ROUND<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"round"</span>] = ROUND<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case ROUND: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> diff --git a/html/070display.cc.html b/html/070display.cc.html index 3d6669ff..5ac50f18 100644 --- a/html/070display.cc.html +++ b/html/070display.cc.html @@ -46,7 +46,7 @@ bool Autodisplay = <span class="Constant">true</span><span class="Delimiter">;</ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> OPEN_CONSOLE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"open-console"</span>] = OPEN_CONSOLE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"open-console"</span>] = OPEN_CONSOLE<span class="Delimiter">;</span> <span class="CommentedCode">//? cerr << "open-console: " << OPEN_CONSOLE << '\n'; //? 1</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case OPEN_CONSOLE: <span class="Delimiter">{</span> @@ -58,7 +58,7 @@ case OPEN_CONSOLE: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> CLOSE_CONSOLE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"close-console"</span>] = CLOSE_CONSOLE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"close-console"</span>] = CLOSE_CONSOLE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case CLOSE_CONSOLE: <span class="Delimiter">{</span> tb_shutdown<span class="Delimiter">();</span> @@ -72,7 +72,7 @@ tb_shutdown<span class="Delimiter">();</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> CLEAR_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"clear-display"</span>] = CLEAR_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"clear-display"</span>] = CLEAR_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case CLEAR_DISPLAY: <span class="Delimiter">{</span> tb_clear<span class="Delimiter">();</span> @@ -83,7 +83,7 @@ case CLEAR_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> CLEAR_LINE_ON_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"clear-line-on-display"</span>] = CLEAR_LINE_ON_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"clear-line-on-display"</span>] = CLEAR_LINE_ON_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case CLEAR_LINE_ON_DISPLAY: <span class="Delimiter">{</span> long long int width = tb_width<span class="Delimiter">();</span> @@ -98,7 +98,7 @@ case CLEAR_LINE_ON_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"print-character-to-display"</span>] = PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"print-character-to-display"</span>] = PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span> int h=tb_height<span class="Delimiter">(),</span> w=tb_width<span class="Delimiter">();</span> @@ -109,6 +109,21 @@ case PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span> <span class="CommentedCode">//? tb_shutdown(); //? 1</span> <span class="CommentedCode">//? cerr << "AAA " << c << ' ' << (int)'\n' << ' ' << (int)'\r' << '\n'; //? 1</span> <span class="CommentedCode">//? exit(1); //? 1</span> + int color = TB_BLACK<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span> + color = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> +<span class="CommentedCode">//? tb_shutdown(); //? 1</span> +<span class="CommentedCode">//? cerr << "AAA " << color << '\n'; //? 1</span> +<span class="CommentedCode">//? exit(1); //? 1</span> + <span class="Delimiter">}</span> + int bg_color = TB_BLACK<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">)));</span> + bg_color = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> + if <span class="Delimiter">(</span>bg_color == <span class="Constant">0</span><span class="Delimiter">)</span> bg_color = TB_BLACK<span class="Delimiter">;</span> + <span class="Delimiter">}</span> + tb_change_cell<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> color<span class="Delimiter">,</span> bg_color<span class="Delimiter">);</span> if <span class="Delimiter">(</span>c == <span class="cSpecial">'\n'</span> || c == <span class="cSpecial">'\r'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>Display_row < height-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> Display_column = <span class="Constant">0</span><span class="Delimiter">;</span> @@ -120,22 +135,13 @@ case PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">}</span> if <span class="Delimiter">(</span>c == <span class="cSpecial">'\b'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>Display_column > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> - tb_change_cell<span class="Delimiter">(</span>Display_column-<span class="Constant">1</span><span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span> + tb_change_cell<span class="Delimiter">(</span>Display_column-<span class="Constant">1</span><span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> color<span class="Delimiter">,</span> bg_color<span class="Delimiter">);</span> --Display_column<span class="Delimiter">;</span> tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span> if <span class="Delimiter">(</span>Autodisplay<span class="Delimiter">)</span> tb_present<span class="Delimiter">();</span> <span class="Delimiter">}</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - int color = TB_BLACK<span class="Delimiter">;</span> - if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> - assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span> - color = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> -<span class="CommentedCode">//? tb_shutdown(); //? 1</span> -<span class="CommentedCode">//? cerr << "AAA " << color << '\n'; //? 1</span> -<span class="CommentedCode">//? exit(1); //? 1</span> - <span class="Delimiter">}</span> - tb_change_cell<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> color<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span> if <span class="Delimiter">(</span>Display_column < width-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> ++Display_column<span class="Delimiter">;</span> tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span> @@ -147,7 +153,7 @@ case PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"cursor-position-on-display"</span>] = CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"cursor-position-on-display"</span>] = CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case CURSOR_POSITION_ON_DISPLAY: <span class="Delimiter">{</span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span> @@ -159,7 +165,7 @@ case CURSOR_POSITION_ON_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"move-cursor-on-display"</span>] = MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"move-cursor-on-display"</span>] = MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case MOVE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> @@ -174,7 +180,7 @@ case MOVE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"move-cursor-down-on-display"</span>] = MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"move-cursor-down-on-display"</span>] = MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case MOVE_CURSOR_DOWN_ON_DISPLAY: <span class="Delimiter">{</span> int h=tb_height<span class="Delimiter">();</span> @@ -190,7 +196,7 @@ case MOVE_CURSOR_DOWN_ON_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"move-cursor-up-on-display"</span>] = MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"move-cursor-up-on-display"</span>] = MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case MOVE_CURSOR_UP_ON_DISPLAY: <span class="Delimiter">{</span> if <span class="Delimiter">(</span>Display_row > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -204,7 +210,7 @@ case MOVE_CURSOR_UP_ON_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"move-cursor-right-on-display"</span>] = MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"move-cursor-right-on-display"</span>] = MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case MOVE_CURSOR_RIGHT_ON_DISPLAY: <span class="Delimiter">{</span> int w=tb_width<span class="Delimiter">();</span> @@ -220,7 +226,7 @@ case MOVE_CURSOR_RIGHT_ON_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"move-cursor-left-on-display"</span>] = MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"move-cursor-left-on-display"</span>] = MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case MOVE_CURSOR_LEFT_ON_DISPLAY: <span class="Delimiter">{</span> if <span class="Delimiter">(</span>Display_column > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -234,7 +240,7 @@ case MOVE_CURSOR_LEFT_ON_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> DISPLAY_WIDTH<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"display-width"</span>] = DISPLAY_WIDTH<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"display-width"</span>] = DISPLAY_WIDTH<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case DISPLAY_WIDTH: <span class="Delimiter">{</span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> @@ -245,7 +251,7 @@ case DISPLAY_WIDTH: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> DISPLAY_HEIGHT<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"display-height"</span>] = DISPLAY_HEIGHT<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"display-height"</span>] = DISPLAY_HEIGHT<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case DISPLAY_HEIGHT: <span class="Delimiter">{</span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> @@ -256,7 +262,7 @@ case DISPLAY_HEIGHT: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"hide-cursor-on-display"</span>] = HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"hide-cursor-on-display"</span>] = HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case HIDE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> tb_set_cursor<span class="Delimiter">(</span>TB_HIDE_CURSOR<span class="Delimiter">,</span> TB_HIDE_CURSOR<span class="Delimiter">);</span> @@ -266,7 +272,7 @@ case HIDE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"show-cursor-on-display"</span>] = SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"show-cursor-on-display"</span>] = SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case SHOW_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> tb_set_cursor<span class="Delimiter">(</span>Display_row<span class="Delimiter">,</span> Display_column<span class="Delimiter">);</span> @@ -276,7 +282,7 @@ case SHOW_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> HIDE_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"hide-display"</span>] = HIDE_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"hide-display"</span>] = HIDE_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case HIDE_DISPLAY: <span class="Delimiter">{</span> Autodisplay = <span class="Constant">false</span><span class="Delimiter">;</span> @@ -286,7 +292,7 @@ case HIDE_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> SHOW_DISPLAY<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"show-display"</span>] = SHOW_DISPLAY<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"show-display"</span>] = SHOW_DISPLAY<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case SHOW_DISPLAY: <span class="Delimiter">{</span> Autodisplay = <span class="Constant">true</span><span class="Delimiter">;</span> @@ -299,7 +305,7 @@ case SHOW_DISPLAY: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> WAIT_FOR_SOME_INTERACTION<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"wait-for-some-interaction"</span>] = WAIT_FOR_SOME_INTERACTION<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"wait-for-some-interaction"</span>] = WAIT_FOR_SOME_INTERACTION<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case WAIT_FOR_SOME_INTERACTION: <span class="Delimiter">{</span> tb_event event<span class="Delimiter">;</span> @@ -310,7 +316,7 @@ case WAIT_FOR_SOME_INTERACTION: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> CHECK_FOR_INTERACTION<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"check-for-interaction"</span>] = CHECK_FOR_INTERACTION<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"check-for-interaction"</span>] = CHECK_FOR_INTERACTION<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case CHECK_FOR_INTERACTION: <span class="Delimiter">{</span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span> <span class="Comment">// result and status</span> @@ -363,6 +369,17 @@ case CHECK_FOR_INTERACTION: <span class="Delimiter">{</span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">found</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> + +<span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> +INTERACTIONS_LEFT<span class="Delimiter">,</span> +<span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> +Recipe_ordinal[<span class="Constant">"interactions-left?"</span>] = INTERACTIONS_LEFT<span class="Delimiter">;</span> +<span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> +case INTERACTIONS_LEFT: <span class="Delimiter">{</span> + products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> + products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>tb_event_ready<span class="Delimiter">());</span> + <span class="Identifier">break</span><span class="Delimiter">;</span> +<span class="Delimiter">}</span> </pre> </body> </html> diff --git a/html/071print.mu.html b/html/071print.mu.html index 7fe33765..29e893bf 100644 --- a/html/071print.mu.html +++ b/html/071print.mu.html @@ -113,6 +113,13 @@ container screen-cell [ <span class="muControl">break-if</span> color-found?:boolean color:number<span class="Special"> <- </span>copy <span class="Constant">7:literal/white</span> <span class="Delimiter">}</span> + bg-color:number, bg-color-found?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Delimiter">{</span> + <span class="Comment"># default bg-color to black</span> + <span class="muControl">break-if</span> bg-color-found?:boolean + bg-color:number<span class="Special"> <- </span>copy <span class="Constant">0:literal/black</span> + <span class="Delimiter">}</span> +<span class="CommentedCode">#? trace [app], [print character] #? 1</span> <span class="Delimiter">{</span> <span class="Comment"># if x exists</span> <span class="Comment"># (handle special cases exactly like in the real screen)</span> @@ -180,7 +187,7 @@ container screen-cell [ <span class="muControl">reply</span> x:address:screen/same-as-ingredient:0 <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> - print-character-to-display c:character, color:number + print-character-to-display c:character, color:number, bg-color:number <span class="muControl">reply</span> x:address:screen/same-as-ingredient:0 ] @@ -631,13 +638,19 @@ container screen-cell [ <span class="muControl">break-if</span> color-found?:boolean color:number<span class="Special"> <- </span>copy <span class="Constant">7:literal/white</span> <span class="Delimiter">}</span> + bg-color:number, bg-color-found?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Delimiter">{</span> + <span class="Comment"># default bg-color to black</span> + <span class="muControl">break-if</span> bg-color-found?:boolean + bg-color:number<span class="Special"> <- </span>copy <span class="Constant">0:literal/black</span> + <span class="Delimiter">}</span> len:number<span class="Special"> <- </span>length s:address:array:character/deref i:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>greater-or-equal i:number, len:number <span class="muControl">break-if</span> done?:boolean c:character<span class="Special"> <- </span>index s:address:array:character/deref, i:number - print-character x:address:screen, c:character, color:number + print-character x:address:screen, c:character, color:number, bg-color:number i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> @@ -674,9 +687,15 @@ container screen-cell [ <span class="muControl">break-if</span> color-found?:boolean color:number<span class="Special"> <- </span>copy <span class="Constant">7:literal/white</span> <span class="Delimiter">}</span> + bg-color:number, bg-color-found?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Delimiter">{</span> + <span class="Comment"># default bg-color to black</span> + <span class="muControl">break-if</span> bg-color-found?:boolean + bg-color:number<span class="Special"> <- </span>copy <span class="Constant">0:literal/black</span> + <span class="Delimiter">}</span> <span class="Comment"># todo: other bases besides decimal</span> s:address:array:character<span class="Special"> <- </span>integer-to-decimal-string n:number - print-string x:address:screen, s:address:array:character, color:number + print-string x:address:screen, s:address:array:character, color:number, bg-color:number <span class="muControl">reply</span> x:address:screen/same-as-ingredient:0 ] </pre> diff --git a/html/072scenario_screen.cc.html b/html/072scenario_screen.cc.html index f5210f0b..5df91b60 100644 --- a/html/072scenario_screen.cc.html +++ b/html/072scenario_screen.cc.html @@ -106,6 +106,7 @@ scenario screen-in-scenario-color [ ] <span class="Delimiter">:(scenario screen_in_scenario_error)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> scenario screen-in-scenario-error [ assume-screen <span class="Constant">5</span>:literal/width<span class="Delimiter">,</span> <span class="Constant">3</span>:literal/height @@ -122,6 +123,7 @@ scenario screen-in-scenario-error [ <span class="traceContains">+warn: expected screen location (0, 0) to contain 98 ('b') instead of 97 ('a')</span> <span class="Delimiter">:(scenario screen_in_scenario_color_error)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> <span class="Comment"># screen-should-contain can check unicode characters in the fake screen</span> scenario screen-in-scenario-color [ @@ -144,6 +146,7 @@ if <span class="Delimiter">(</span>s == <span class="Constant">"screen" <span class="Delimiter">:(scenarios run)</span> <span class="Delimiter">:(scenario convert_names_does_not_warn_when_mixing_special_names_and_numeric_locations)</span> +<span class="Special">% Scenario_testing_scenario = true;</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ screen:number<span class="Special"> <- </span>copy <span class="Constant">1</span>:number @@ -178,21 +181,21 @@ Name[r][<span class="Constant">"screen"</span>] = SCREEN<span class="D <span class="Comment">// `screen:address <- new-fake-screen width, height`</span> <span class="CommentedCode">//? cout << "before: " << curr.to_string() << '\n'; //? 1</span> if <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">"assume-screen"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> - curr<span class="Delimiter">.</span>operation = Recipe_number[<span class="Constant">"new-fake-screen"</span>]<span class="Delimiter">;</span> + curr<span class="Delimiter">.</span>operation = Recipe_ordinal[<span class="Constant">"new-fake-screen"</span>]<span class="Delimiter">;</span> curr<span class="Delimiter">.</span>name = <span class="Constant">"new-fake-screen"</span><span class="Delimiter">;</span> assert<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>operation<span class="Delimiter">);</span> assert<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">"screen:address"</span><span class="Delimiter">));</span> curr<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>set_value<span class="Delimiter">(</span>SCREEN<span class="Delimiter">);</span> <span class="CommentedCode">//? cout << "after: " << curr.to_string() << '\n'; //? 1</span> -<span class="CommentedCode">//? cout << "AAA " << Recipe_number["new-fake-screen"] << '\n'; //? 1</span> +<span class="CommentedCode">//? cout << "AAA " << Recipe_ordinal["new-fake-screen"] << '\n'; //? 1</span> <span class="Delimiter">}</span> <span class="Comment">//: screen-should-contain is a regular instruction</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> SCREEN_SHOULD_CONTAIN<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"screen-should-contain"</span>] = SCREEN_SHOULD_CONTAIN<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"screen-should-contain"</span>] = SCREEN_SHOULD_CONTAIN<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case SCREEN_SHOULD_CONTAIN: <span class="Delimiter">{</span> if <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -203,7 +206,7 @@ case SCREEN_SHOULD_CONTAIN: <span class="Delimiter">{</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"screen-should-contain-in-color"</span>] = SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"screen-should-contain-in-color"</span>] = SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case SCREEN_SHOULD_CONTAIN_IN_COLOR: <span class="Delimiter">{</span> if <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -231,36 +234,42 @@ void check_screen<span class="Delimiter">(</span>const string& expected_cont <span class="CommentedCode">//? cerr << "Checking screen for color " << color << "\n"; //? 2</span> assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>default_space<span class="Delimiter">);</span> <span class="Comment">// not supported</span> long long int screen_location = Memory[SCREEN]<span class="Delimiter">;</span> - int data_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"data"</span><span class="Delimiter">);</span> + int data_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"data"</span><span class="Delimiter">);</span> assert<span class="Delimiter">(</span>data_offset >= <span class="Constant">0</span><span class="Delimiter">);</span> long long int screen_data_location = screen_location+data_offset<span class="Delimiter">;</span> <span class="Comment">// type: address:array:character</span> long long int screen_data_start = Memory[screen_data_location]<span class="Delimiter">;</span> <span class="Comment">// type: array:character</span> - int width_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"num-columns"</span><span class="Delimiter">);</span> + int width_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"num-columns"</span><span class="Delimiter">);</span> long long int screen_width = Memory[screen_location+width_offset]<span class="Delimiter">;</span> - int height_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"num-rows"</span><span class="Delimiter">);</span> + int height_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"num-rows"</span><span class="Delimiter">);</span> long long int screen_height = Memory[screen_location+height_offset]<span class="Delimiter">;</span> raw_string_stream cursor<span class="Delimiter">(</span>expected_contents<span class="Delimiter">);</span> <span class="Comment">// todo: too-long expected_contents should fail</span> long long int addr = screen_data_start+<span class="Constant">1</span><span class="Delimiter">;</span> <span class="Comment">// skip length</span> <span class="CommentedCode">//? cerr << "screen height " << screen_height << '\n'; //? 1</span> for <span class="Delimiter">(</span>long long int row = <span class="Constant">0</span><span class="Delimiter">;</span> row < screen_height<span class="Delimiter">;</span> ++row<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span class="CommentedCode">//? cerr << "row: " << row << '\n'; //? 1</span> +<span class="CommentedCode">//? cerr << "row: " << row << '\n'; //? 3</span> +<span class="CommentedCode">//? cerr << "contents: " << cursor.buf+cursor.index << "$\n"; //? 1</span> cursor<span class="Delimiter">.</span>skip_whitespace_and_comments<span class="Delimiter">();</span> if <span class="Delimiter">(</span>cursor<span class="Delimiter">.</span>at_end<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span class="CommentedCode">//? cerr << "row2\n"; //? 2</span> assert<span class="Delimiter">(</span>cursor<span class="Delimiter">.</span>get<span class="Delimiter">()</span> == <span class="Constant">'.'</span><span class="Delimiter">);</span> for <span class="Delimiter">(</span>long long int column = <span class="Constant">0</span><span class="Delimiter">;</span> column < screen_width<span class="Delimiter">;</span> ++column<span class="Delimiter">,</span> addr+= <span class="Comment">/*</span><span class="Comment">size of screen-cell</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> const int cell_color_offset = <span class="Constant">1</span><span class="Delimiter">;</span> uint32_t curr = cursor<span class="Delimiter">.</span>get<span class="Delimiter">();</span> +<span class="CommentedCode">//? cerr << "col: " << column << '\n'; //? 1</span> if <span class="Delimiter">(</span>Memory[addr] == <span class="Constant">0</span> && isspace<span class="Delimiter">(</span>curr<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="CommentedCode">//? cerr << color << " vs " << Memory[addr+1] << '\n'; //? 1</span> if <span class="Delimiter">(</span>curr == <span class="Constant">' '</span> && color != -<span class="Constant">1</span> && color != Memory[addr+cell_color_offset]<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// filter out other colors</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> +<span class="CommentedCode">//? cerr << "col3 " << column << ": " << Memory[addr] << " " << curr << '\n'; //? 1</span> if <span class="Delimiter">(</span>Memory[addr] != <span class="Constant">0</span> && Memory[addr] == curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span class="CommentedCode">//? cerr << "col4\n"; //? 1</span> if <span class="Delimiter">(</span>color == -<span class="Constant">1</span> || color == Memory[addr+cell_color_offset]<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span class="CommentedCode">//? cerr << "col5: " << column << '\n'; //? 1</span> <span class="Comment">// contents match but color is off</span> - if <span class="Delimiter">(</span>Current_scenario && !Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// genuine test in a mu file</span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">", address "</span> << addr << <span class="Constant">", value "</span> << Memory[addr] << <span class="Constant">") to be in color "</span> << color << <span class="Constant">" instead of "</span> << Memory[addr+cell_color_offset] << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -268,13 +277,14 @@ void check_screen<span class="Delimiter">(</span>const string& expected_cont <span class="Comment">// just testing check_screen</span> raise << <span class="Constant">"expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">") to be in color "</span> << color << <span class="Constant">" instead of "</span> << Memory[addr+cell_color_offset] << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>!Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> ++Num_failures<span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> +<span class="CommentedCode">//? cerr << "col6 " << column << ": " << Memory[addr] << " " << curr << '\n'; //? 1</span> <span class="Comment">// really a mismatch</span> <span class="Comment">// can't print multi-byte unicode characters in warnings just yet. not very useful for debugging anyway.</span> char expected_pretty[<span class="Constant">10</span>] = <span class="Delimiter">{</span><span class="Constant">0</span><span class="Delimiter">};</span> @@ -288,7 +298,7 @@ void check_screen<span class="Delimiter">(</span>const string& expected_cont actual_pretty[<span class="Constant">0</span>] = <span class="Constant">' '</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">1</span>] = <span class="Constant">'('</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">2</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">3</span>] = static_cast<unsigned char><span class="Delimiter">(</span>Memory[addr]<span class="Delimiter">),</span> actual_pretty[<span class="Constant">4</span>] = <span class="cSpecial">'\''</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">5</span>] = <span class="Constant">')'</span><span class="Delimiter">,</span> actual_pretty[<span class="Constant">6</span>] = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>Current_scenario && !Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// genuine test in a mu file</span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">") to contain "</span> << curr << expected_pretty << <span class="Constant">" instead of "</span> << Memory[addr] << actual_pretty << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> dump_screen<span class="Delimiter">();</span> @@ -297,7 +307,7 @@ void check_screen<span class="Delimiter">(</span>const string& expected_cont <span class="Comment">// just testing check_screen</span> raise << <span class="Constant">"expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">") to contain "</span> << curr << expected_pretty << <span class="Constant">" instead of "</span> << Memory[addr] << actual_pretty << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>!Hide_warnings<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> ++Num_failures<span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -354,7 +364,7 @@ void raw_string_stream::skip_whitespace_and_comments<span class="Delimiter">()</ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> _DUMP_SCREEN<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$dump-screen"</span>] = _DUMP_SCREEN<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"$dump-screen"</span>] = _DUMP_SCREEN<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case _DUMP_SCREEN: <span class="Delimiter">{</span> dump_screen<span class="Delimiter">();</span> @@ -365,11 +375,11 @@ case _DUMP_SCREEN: <span class="Delimiter">{</span> void dump_screen<span class="Delimiter">()</span> <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>default_space<span class="Delimiter">);</span> <span class="Comment">// not supported</span> long long int screen_location = Memory[SCREEN]<span class="Delimiter">;</span> - int width_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"num-columns"</span><span class="Delimiter">);</span> + int width_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"num-columns"</span><span class="Delimiter">);</span> long long int screen_width = Memory[screen_location+width_offset]<span class="Delimiter">;</span> - int height_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"num-rows"</span><span class="Delimiter">);</span> + int height_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"num-rows"</span><span class="Delimiter">);</span> long long int screen_height = Memory[screen_location+height_offset]<span class="Delimiter">;</span> - int data_offset = find_element_name<span class="Delimiter">(</span>Type_number[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"data"</span><span class="Delimiter">);</span> + int data_offset = find_element_name<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">"screen"</span>]<span class="Delimiter">,</span> <span class="Constant">"data"</span><span class="Delimiter">);</span> assert<span class="Delimiter">(</span>data_offset >= <span class="Constant">0</span><span class="Delimiter">);</span> long long int screen_data_location = screen_location+data_offset<span class="Delimiter">;</span> <span class="Comment">// type: address:array:character</span> long long int screen_data_start = Memory[screen_data_location]<span class="Delimiter">;</span> <span class="Comment">// type: array:character</span> diff --git a/html/074console.mu.html b/html/074console.mu.html index 651fa9a6..b89a1333 100644 --- a/html/074console.mu.html +++ b/html/074console.mu.html @@ -133,6 +133,19 @@ container console [ <span class="muControl">loop-unless</span> found?:boolean <span class="Delimiter">}</span> ] + +<span class="Comment"># use this helper to skip rendering if there's lots of other events queued up</span> +<span class="muRecipe">recipe</span> has-more-events? [ + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> console:address + <span class="Comment"># fake consoles should be plenty fast; never skip</span> + <span class="muControl">reply</span> <span class="Constant">0:literal/false</span> + <span class="Delimiter">}</span> + result:boolean<span class="Special"> <- </span>interactions-left? + <span class="muControl">reply</span> result:boolean +] </pre> </body> </html> diff --git a/html/075scenario_console.cc.html b/html/075scenario_console.cc.html index fe3b2adc..9a0bc5c9 100644 --- a/html/075scenario_console.cc.html +++ b/html/075scenario_console.cc.html @@ -76,7 +76,7 @@ if <span class="Delimiter">(</span>s == <span class="Constant">"console&quo <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> ASSUME_CONSOLE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"assume-console"</span>] = ASSUME_CONSOLE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"assume-console"</span>] = ASSUME_CONSOLE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case ASSUME_CONSOLE: <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << "aaa: " << current_instruction().ingredients.at(0).name << '\n'; //? 2</span> @@ -195,7 +195,7 @@ scenario events-in-scenario [ <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> REPLACE_IN_CONSOLE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"replace-in-console"</span>] = REPLACE_IN_CONSOLE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"replace-in-console"</span>] = REPLACE_IN_CONSOLE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case REPLACE_IN_CONSOLE: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> @@ -236,8 +236,8 @@ long long int size_of_event<span class="Delimiter">()</span> <span class="Delimi <span class="Comment">// memoize result if already computed</span> static long long int result = <span class="Constant">0</span><span class="Delimiter">;</span> if <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> - vector<type_number> type<span class="Delimiter">;</span> - type<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">"event"</span>]<span class="Delimiter">);</span> + vector<type_ordinal> type<span class="Delimiter">;</span> + type<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">"event"</span>]<span class="Delimiter">);</span> result = size_of<span class="Delimiter">(</span>type<span class="Delimiter">);</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -246,9 +246,9 @@ long long int size_of_events<span class="Delimiter">()</span> <span class="Delim <span class="Comment">// memoize result if already computed</span> static long long int result = <span class="Constant">0</span><span class="Delimiter">;</span> if <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> - vector<type_number> type<span class="Delimiter">;</span> - assert<span class="Delimiter">(</span>Type_number[<span class="Constant">"console"</span>]<span class="Delimiter">);</span> - type<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_number[<span class="Constant">"console"</span>]<span class="Delimiter">);</span> + vector<type_ordinal> type<span class="Delimiter">;</span> + assert<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">"console"</span>]<span class="Delimiter">);</span> + type<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Type_ordinal[<span class="Constant">"console"</span>]<span class="Delimiter">);</span> result = size_of<span class="Delimiter">(</span>type<span class="Delimiter">);</span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span class="Delimiter">}</span> diff --git a/html/080trace_browser.cc.html b/html/080trace_browser.cc.html index efb5e428..f2139f3f 100644 --- a/html/080trace_browser.cc.html +++ b/html/080trace_browser.cc.html @@ -33,7 +33,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> _BROWSE_TRACE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$browse-trace"</span>] = _BROWSE_TRACE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"$browse-trace"</span>] = _BROWSE_TRACE<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case _BROWSE_TRACE: <span class="Delimiter">{</span> start_trace_browser<span class="Delimiter">();</span> @@ -207,6 +207,13 @@ void render<span class="Delimiter">()</span> <span class="Delimiter">{</span> trace_line& curr_line = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>Trace_index[screen_row]<span class="Delimiter">);</span> ostringstream out<span class="Delimiter">;</span> out << std::setw<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">)</span> << curr_line<span class="Delimiter">.</span>depth << <span class="Constant">' '</span> << curr_line<span class="Delimiter">.</span>label << <span class="Constant">": "</span> << curr_line<span class="Delimiter">.</span>contents<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>screen_row < tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + long long int delta = lines_hidden<span class="Delimiter">(</span>screen_row<span class="Delimiter">);</span> + <span class="Comment">// home-brew escape sequence for red</span> + if <span class="Delimiter">(</span>delta > <span class="Constant">999</span><span class="Delimiter">)</span> out << <span class="Constant">"{"</span><span class="Delimiter">;</span> + out << <span class="Constant">" ("</span> << lines_hidden<span class="Delimiter">(</span>screen_row<span class="Delimiter">)</span> << <span class="Constant">")"</span><span class="Delimiter">;</span> + if <span class="Delimiter">(</span>delta > <span class="Constant">999</span><span class="Delimiter">)</span> out << <span class="Constant">"}"</span><span class="Delimiter">;</span> + <span class="Delimiter">}</span> render_line<span class="Delimiter">(</span>screen_row<span class="Delimiter">,</span> out<span class="Delimiter">.</span>str<span class="Delimiter">());</span> <span class="Delimiter">}</span> <span class="Comment">// clear rest of screen</span> @@ -219,12 +226,24 @@ void render<span class="Delimiter">()</span> <span class="Delimiter">{</span> tb_present<span class="Delimiter">();</span> <span class="Delimiter">}</span> +long long int lines_hidden<span class="Delimiter">(</span>long long int screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span> + assert<span class="Delimiter">(</span>Trace_index<span class="Delimiter">.</span>find<span class="Delimiter">(</span>screen_row<span class="Delimiter">)</span> != Trace_index<span class="Delimiter">.</span>end<span class="Delimiter">());</span> + if <span class="Delimiter">(</span>Trace_index<span class="Delimiter">.</span>find<span class="Delimiter">(</span>screen_row+<span class="Constant">1</span><span class="Delimiter">)</span> == Trace_index<span class="Delimiter">.</span>end<span class="Delimiter">())</span> + <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">)</span>-Trace_index[screen_row]<span class="Delimiter">;</span> + else + <span class="Identifier">return</span> Trace_index[screen_row+<span class="Constant">1</span>] - Trace_index[screen_row]<span class="Delimiter">;</span> +<span class="Delimiter">}</span> + void render_line<span class="Delimiter">(</span>int screen_row<span class="Delimiter">,</span> const string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> long long int col = <span class="Constant">0</span><span class="Delimiter">;</span> + int color = TB_WHITE<span class="Delimiter">;</span> for <span class="Delimiter">(</span>col = <span class="Constant">0</span><span class="Delimiter">;</span> col < tb_width<span class="Delimiter">()</span> && col < SIZE<span class="Delimiter">(</span>s<span class="Delimiter">);</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span> - char c = s<span class="Delimiter">.</span>at<span class="Delimiter">(</span>col<span class="Delimiter">);</span> + char c = s<span class="Delimiter">.</span>at<span class="Delimiter">(</span>col<span class="Delimiter">);</span> <span class="Comment">// todo: unicode</span> if <span class="Delimiter">(</span>c == <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> c = <span class="Constant">';'</span><span class="Delimiter">;</span> <span class="Comment">// replace newlines with semi-colons</span> - tb_change_cell<span class="Delimiter">(</span>col<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span> + <span class="Comment">// escapes. hack: can't start a line with them.</span> + if <span class="Delimiter">(</span>c == <span class="Constant">'{'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> color = <span class="Comment">/*</span><span class="Comment">red</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> c = <span class="Constant">' '</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> + if <span class="Delimiter">(</span>c == <span class="Constant">'}'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> color = TB_WHITE<span class="Delimiter">;</span> c = <span class="Constant">' '</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> + tb_change_cell<span class="Delimiter">(</span>col<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> c<span class="Delimiter">,</span> color<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span> <span class="Delimiter">}</span> for <span class="Delimiter">(;</span> col < tb_width<span class="Delimiter">();</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span> tb_change_cell<span class="Delimiter">(</span>col<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> <span class="Constant">' '</span><span class="Delimiter">,</span> TB_WHITE<span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span> diff --git a/html/081run_interactive.cc.html b/html/081run_interactive.cc.html index cdd3a5b7..5183cee6 100644 --- a/html/081run_interactive.cc.html +++ b/html/081run_interactive.cc.html @@ -13,11 +13,12 @@ pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; } body { font-family: monospace; color: #eeeeee; background-color: #080808; } * { font-size: 1.05em; } +.traceContains { color: #008000; } .cSpecial { color: #008000; } .Constant { color: #00a0a0; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } -.SalientComment { color: #00ffff; } +.Special { color: #ff6060; } .CommentedCode { color: #6c6c6c; } .Identifier { color: #804000; } --> @@ -31,79 +32,180 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } </head> <body> <pre id='vimCodeElement'> -<span class="Comment">//: Helper for the repl.</span> +<span class="Comment">//: Helper for various programming environments: run arbitrary mu code and</span> +<span class="Comment">//: return some result in string form.</span> +<span class="Delimiter">:(scenario run_interactive_code)</span> +recipe main [ + <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>new [<span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">34</span>:literal] + run-interactive <span class="Constant">2</span>:address:array:character +] +<span class="traceContains">+mem: storing 34 in location 1</span> + +<span class="Delimiter">:(scenario run_interactive_empty)</span> +recipe main [ + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>run-interactive <span class="Constant">0</span>:literal +] +<span class="Comment"># result is null</span> +<span class="traceContains">+mem: storing 0 in location 1</span> + +<span class="Comment">//: run code in 'interactive mode', i.e. with warnings off, and recording</span> +<span class="Comment">//: output in case we want to print it to screen</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> RUN_INTERACTIVE<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"run-interactive"</span>] = RUN_INTERACTIVE<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"run-interactive"</span>] = RUN_INTERACTIVE<span class="Delimiter">;</span> <span class="CommentedCode">//? cerr << "run-interactive: " << RUN_INTERACTIVE << '\n'; //? 1</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> case RUN_INTERACTIVE: <span class="Delimiter">{</span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> -<span class="CommentedCode">//? cerr << "AAA 0\n"; //? 1</span> - run_interactive<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> -<span class="CommentedCode">//? cerr << "ZZZ\n"; //? 1</span> - <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// not done with caller; don't increment current_step_index()</span> + products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span> + bool new_code_pushed_to_stack = run_interactive<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> + if <span class="Delimiter">(</span>!new_code_pushed_to_stack<span class="Delimiter">)</span> <span class="Delimiter">{</span> + products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> + products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>warnings_from_trace<span class="Delimiter">());</span> + <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// done with this instruction</span> + <span class="Delimiter">}</span> + else <span class="Delimiter">{</span> + <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// not done with caller; don't increment current_step_index()</span> + <span class="Delimiter">}</span> <span class="Delimiter">}</span> +<span class="Delimiter">:(before "End Globals")</span> +bool Running_interactive = <span class="Constant">false</span><span class="Delimiter">;</span> +<span class="Delimiter">:(before "End Setup")</span> +Running_interactive = <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Delimiter">:(code)</span> -<span class="Comment">// manual tests:</span> -<span class="Comment">// empty string (excluding whitespace and comments) does nothing</span> -<span class="Comment">// ctrl-d</span> -<span class="Comment">// just an integer (excluding whitespace and comments) prints value of that location in memory</span> -<span class="Comment">// instruction executes</span> -<span class="Comment">// backspace at start begins new attempt</span> -void run_interactive<span class="Delimiter">(</span>long long int address<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span class="Comment">// reads a string, tries to call it as code, saving all warnings.</span> +<span class="Comment">// returns true if successfully called (no errors found during load and transform)</span> +bool run_interactive<span class="Delimiter">(</span>long long int address<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"interactive"</span><span class="Delimiter">)</span> == Recipe_ordinal<span class="Delimiter">.</span>end<span class="Delimiter">())</span> + Recipe_ordinal[<span class="Constant">"interactive"</span>] = Next_recipe_ordinal++<span class="Delimiter">;</span> + string command = trim<span class="Delimiter">(</span>strip_comments<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>address<span class="Delimiter">)));</span> + if <span class="Delimiter">(</span>command<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span class="CommentedCode">//? tb_shutdown(); //? 1</span> - long long int size = Memory[address]<span class="Delimiter">;</span> - if <span class="Delimiter">(</span>size == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> - ++current_step_index<span class="Delimiter">();</span> - <span class="Identifier">return</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> - ostringstream tmp<span class="Delimiter">;</span> - for <span class="Delimiter">(</span>long long int curr = address+<span class="Constant">1</span><span class="Delimiter">;</span> curr < address+size<span class="Delimiter">;</span> ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> - <span class="Comment">// todo: unicode</span> - tmp << <span class="Delimiter">(</span>char<span class="Delimiter">)(</span>int<span class="Delimiter">)</span>Memory[curr]<span class="Delimiter">;</span> - <span class="Delimiter">}</span> -<span class="CommentedCode">//? cerr << size << ' ' << Memory[address+size] << '\n'; //? 1</span> - assert<span class="Delimiter">(</span>Memory[address+size] == <span class="Constant">10</span><span class="Delimiter">);</span> <span class="Comment">// skip the newline</span> - if <span class="Delimiter">(</span>Recipe_number<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"interactive"</span><span class="Delimiter">)</span> == Recipe_number<span class="Delimiter">.</span>end<span class="Delimiter">())</span> - Recipe_number[<span class="Constant">"interactive"</span>] = Next_recipe_number++<span class="Delimiter">;</span> - string command = trim<span class="Delimiter">(</span>strip_comments<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>str<span class="Delimiter">()));</span> - if <span class="Delimiter">(</span>command<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> - ++current_step_index<span class="Delimiter">();</span> - <span class="Identifier">return</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>command<span class="Delimiter">))</span> <span class="Delimiter">{</span> - print_value_of_location_as_response<span class="Delimiter">(</span>to_integer<span class="Delimiter">(</span>command<span class="Delimiter">));</span> - ++current_step_index<span class="Delimiter">();</span> - <span class="Identifier">return</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> -<span class="CommentedCode">//? exit(0); //? 1</span> - if <span class="Delimiter">(</span>Name[Recipe_number[<span class="Constant">"interactive"</span>]]<span class="Delimiter">.</span>find<span class="Delimiter">(</span>command<span class="Delimiter">)</span> != Name[Recipe_number[<span class="Constant">"interactive"</span>]]<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> - print_value_of_location_as_response<span class="Delimiter">(</span>Name[Recipe_number[<span class="Constant">"interactive"</span>]][command]<span class="Delimiter">);</span> - ++current_step_index<span class="Delimiter">();</span> - <span class="Identifier">return</span><span class="Delimiter">;</span> +<span class="CommentedCode">//? cerr << command << '\n'; //? 2</span> + Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe_ordinal[<span class="Constant">"interactive"</span>]<span class="Delimiter">);</span> + Hide_warnings = <span class="Constant">true</span><span class="Delimiter">;</span> + if <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span> + Trace_file = <span class="Constant">""</span><span class="Delimiter">;</span> <span class="Comment">// if there wasn't already a stream we don't want to save it</span> + Trace_stream = new trace_stream<span class="Delimiter">;</span> <span class="Delimiter">}</span> -<span class="CommentedCode">//? tb_shutdown(); //? 1</span> -<span class="CommentedCode">//? cerr << command; //? 1</span> -<span class="CommentedCode">//? exit(0); //? 1</span> -<span class="CommentedCode">//? cerr << "AAA 1\n"; //? 1</span> - Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>Recipe_number[<span class="Constant">"interactive"</span>]<span class="Delimiter">);</span> <span class="Comment">// call run(string) but without the scheduling</span> -<span class="CommentedCode">//? cerr << ("recipe interactive [\n"+command+"\n]\n"); //? 1</span> load<span class="Delimiter">(</span><span class="Constant">"recipe interactive [</span><span class="cSpecial">\n</span><span class="Constant">"</span>+command+<span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> transform_all<span class="Delimiter">();</span> -<span class="CommentedCode">//? cerr << "names: " << Name[Recipe_number["interactive"]].size() << "; "; //? 1</span> -<span class="CommentedCode">//? cerr << "steps: " << Recipe[Recipe_number["interactive"]].steps.size() << "; "; //? 1</span> -<span class="CommentedCode">//? cerr << "interactive transformed_until: " << Recipe[Recipe_number["interactive"]].transformed_until << '\n'; //? 1</span> - Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>Recipe_number[<span class="Constant">"interactive"</span>]<span class="Delimiter">));</span> + if <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"warn"</span><span class="Delimiter">)</span> > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + Hide_warnings = <span class="Constant">false</span><span class="Delimiter">;</span> + <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> + <span class="Delimiter">}</span> + Running_interactive = <span class="Constant">true</span><span class="Delimiter">;</span> + Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>Recipe_ordinal[<span class="Constant">"interactive"</span>]<span class="Delimiter">));</span> + <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span class="Delimiter">}</span> + +<span class="Delimiter">:(after "Starting Reply")</span> +if <span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">()</span> == <span class="Constant">"interactive"</span><span class="Delimiter">)</span> clean_up_interactive<span class="Delimiter">();</span> +<span class="Delimiter">:(after "Falling Through End Of Recipe")</span> +if <span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">()</span> == <span class="Constant">"interactive"</span><span class="Delimiter">)</span> clean_up_interactive<span class="Delimiter">();</span> +<span class="Delimiter">:(code)</span> +void clean_up_interactive<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span class="CommentedCode">//? static int foo = 0; //? 1</span> + Hide_warnings = <span class="Constant">false</span><span class="Delimiter">;</span> + Running_interactive = <span class="Constant">false</span><span class="Delimiter">;</span> +<span class="CommentedCode">//? ++foo; //? 1</span> +<span class="CommentedCode">//? if (foo == 1) tb_init(); //? 1</span> +<span class="Delimiter">}</span> + +<span class="Delimiter">:(scenario "run_interactive_returns_stringified_result")</span> +recipe main [ + <span class="Comment"># try to interactively add 2 and 2</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new [add <span class="Constant">2</span>:literal<span class="Delimiter">,</span> <span class="Constant">2</span>:literal] + <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>run-interactive <span class="Constant">1</span>:address:array:character + <span class="Constant">10</span>:array:character<span class="Special"> <- </span>copy <span class="Constant">2</span>:address:array:character/deref +] +<span class="Comment"># first letter in the output should be '4' in unicode</span> +<span class="traceContains">+mem: storing 52 in location 11</span> + +<span class="Delimiter">:(scenario "run_interactive_returns_string")</span> +recipe main [ + <span class="Comment"># try to interactively add 2 and 2</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new [ + <span class="Constant">100</span>:address:array:character<span class="Special"> <- </span>new [a] + <span class="Constant">101</span>:address:array:character<span class="Special"> <- </span>new [b] + <span class="Constant">102</span>:address:array:character<span class="Special"> <- </span>string-append <span class="Constant">100</span>:address:array:character<span class="Delimiter">,</span> <span class="Constant">101</span>:address:array:character + ] + <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>run-interactive <span class="Constant">1</span>:address:array:character + <span class="Constant">10</span>:array:character<span class="Special"> <- </span>copy <span class="Constant">2</span>:address:array:character/deref +] +<span class="Comment"># output contains "ab"</span> +<span class="traceContains">+mem: storing 97 in location 11</span> +<span class="traceContains">+mem: storing 98 in location 12</span> + +<span class="Delimiter">:(scenario "run_interactive_returns_warnings")</span> +recipe main [ + <span class="Comment"># run a command that generates a warning</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new [get <span class="Constant">1234</span>:number<span class="Delimiter">,</span> foo:offset] + <span class="Constant">2</span>:address:array:character<span class="Delimiter">,</span> <span class="Constant">3</span>:address:array:character<span class="Special"> <- </span>run-interactive <span class="Constant">1</span>:address:array:character + <span class="Constant">10</span>:array:character<span class="Special"> <- </span>copy <span class="Constant">3</span>:address:array:character/deref +] +<span class="Comment"># warning should be "unknown element foo in container number"</span> +<span class="traceContains">+mem: storing 117 in location 11</span> +<span class="traceContains">+mem: storing 110 in location 12</span> +<span class="traceContains">+mem: storing 107 in location 13</span> +<span class="traceContains">+mem: storing 110 in location 14</span> + +<span class="Delimiter">:(before "End Globals")</span> +string Most_recent_results<span class="Delimiter">;</span> +<span class="Delimiter">:(before "End Setup")</span> +Most_recent_results = <span class="Constant">""</span><span class="Delimiter">;</span> +<span class="Delimiter">:(before "End of Instruction")</span> +if <span class="Delimiter">(</span>Running_interactive<span class="Delimiter">)</span> <span class="Delimiter">{</span> + record_products<span class="Delimiter">(</span>current_instruction<span class="Delimiter">(),</span> products<span class="Delimiter">);</span> +<span class="Delimiter">}</span> +<span class="Delimiter">:(code)</span> +void record_products<span class="Delimiter">(</span>const instruction& instruction<span class="Delimiter">,</span> const vector<vector<double> >& products<span class="Delimiter">)</span> <span class="Delimiter">{</span> + ostringstream out<span class="Delimiter">;</span> +<span class="CommentedCode">//? cerr << current_instruction().to_string() << '\n'; //? 1</span> + for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> + <span class="Comment">// string</span> + if <span class="Delimiter">(</span>i < SIZE<span class="Delimiter">(</span>instruction<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span class="CommentedCode">//? cerr << "AA\n"; //? 1</span> +<span class="CommentedCode">//? cerr << instruction.products.size() << " vs " << i << '\n'; //? 1</span> + if <span class="Delimiter">(</span>is_string<span class="Delimiter">(</span>instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span> +<span class="CommentedCode">//? cerr << "BB\n"; //? 1</span> + assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)));</span> + out << to_string<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> + <span class="Identifier">continue</span><span class="Delimiter">;</span> + <span class="Delimiter">}</span> + <span class="Comment">// End Record Product Special-cases</span> + <span class="Delimiter">}</span> + for <span class="Delimiter">(</span>long long int j = <span class="Constant">0</span><span class="Delimiter">;</span> j < SIZE<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span class="CommentedCode">//? cerr << "aa: " << i << ", " << j << ": " << products.at(i).at(j) << '\n'; //? 1</span> + out << products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)</span> << <span class="Constant">' '</span><span class="Delimiter">;</span> + <span class="Delimiter">}</span> + out << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> + <span class="Delimiter">}</span> +<span class="CommentedCode">//? cerr << "aa: {\n" << out.str() << "}\n"; //? 2</span> + Most_recent_results = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> +<span class="Delimiter">}</span> +<span class="Delimiter">:(before "Complete Call Fallthrough")</span> +if <span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation == RUN_INTERACTIVE && !current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> + assert<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> <= <span class="Constant">2</span><span class="Delimiter">);</span> + <span class="Comment">// Send the results of the most recently executed instruction, regardless of</span> + <span class="Comment">// call depth, to be converted to string and potentially printed to string.</span> + vector<double> result<span class="Delimiter">;</span> + result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new_string<span class="Delimiter">(</span>Most_recent_results<span class="Delimiter">));</span> + write_memory<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> result<span class="Delimiter">);</span> + if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> == <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + vector<double> warnings<span class="Delimiter">;</span> + warnings<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>warnings_from_trace<span class="Delimiter">());</span> + write_memory<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> warnings<span class="Delimiter">);</span> + <span class="Delimiter">}</span> <span class="Delimiter">}</span> +<span class="Delimiter">:(code)</span> string strip_comments<span class="Delimiter">(</span>string in<span class="Delimiter">)</span> <span class="Delimiter">{</span> ostringstream result<span class="Delimiter">;</span> -<span class="CommentedCode">//? cerr << in; //? 1</span> for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> result << in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> @@ -114,43 +216,79 @@ string strip_comments<span class="Delimiter">(</span>string in<span class="Delim if <span class="Delimiter">(</span>i < SIZE<span class="Delimiter">(</span>in<span class="Delimiter">)</span> && in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> ++i<span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> -<span class="CommentedCode">//? cerr << "ZZZ"; //? 1</span> <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span class="Delimiter">}</span> -void print_value_of_location_as_response<span class="Delimiter">(</span>long long int address<span class="Delimiter">)</span> <span class="Delimiter">{</span> +string to_string<span class="Delimiter">(</span>long long int address<span class="Delimiter">)</span> <span class="Delimiter">{</span> + long long int size = Memory[address]<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>size == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">""</span><span class="Delimiter">;</span> + ostringstream tmp<span class="Delimiter">;</span> + for <span class="Delimiter">(</span>long long int curr = address+<span class="Constant">1</span><span class="Delimiter">;</span> curr <= address+size<span class="Delimiter">;</span> ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> + <span class="Comment">// todo: unicode</span> + tmp << <span class="Delimiter">(</span>char<span class="Delimiter">)(</span>int<span class="Delimiter">)</span>Memory[curr]<span class="Delimiter">;</span> + <span class="Delimiter">}</span> +<span class="CommentedCode">//? tb_shutdown(); //? 1</span> +<span class="CommentedCode">//? cerr << tmp.str() << '\n'; //? 1</span> + <span class="Identifier">return</span> tmp<span class="Delimiter">.</span>str<span class="Delimiter">();</span> +<span class="Delimiter">}</span> + +long long int stringified_value_of_location<span class="Delimiter">(</span>long long int address<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// convert to string</span> ostringstream out<span class="Delimiter">;</span> - out << <span class="Constant">"=> "</span> << Memory[address]<span class="Delimiter">;</span> - string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> - <span class="Comment">// handle regular I/O</span> - if <span class="Delimiter">(</span>!tb_is_active<span class="Delimiter">())</span> <span class="Delimiter">{</span> - cerr << result << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> - <span class="Identifier">return</span><span class="Delimiter">;</span> - <span class="Delimiter">}</span> - <span class="Comment">// raw I/O; use termbox to print</span> - long long int bound = SIZE<span class="Delimiter">(</span>result<span class="Delimiter">);</span> - if <span class="Delimiter">(</span>bound > tb_width<span class="Delimiter">())</span> bound = tb_width<span class="Delimiter">();</span> - for <span class="Delimiter">(</span>long long int i = <span class="Constant">0</span><span class="Delimiter">;</span> i < bound<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> - tb_change_cell<span class="Delimiter">(</span>i<span class="Delimiter">,</span> Display_row<span class="Delimiter">,</span> result<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">computer's color</span><span class="Comment">*/</span><span class="Constant">245</span><span class="Delimiter">,</span> TB_BLACK<span class="Delimiter">);</span> - <span class="Delimiter">}</span> - <span class="Comment">// newline</span> - if <span class="Delimiter">(</span>Display_row < tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> - ++Display_row<span class="Delimiter">;</span> - Display_column = <span class="Constant">0</span><span class="Delimiter">;</span> - tb_set_cursor<span class="Delimiter">(</span>Display_column<span class="Delimiter">,</span> Display_row<span class="Delimiter">);</span> - tb_present<span class="Delimiter">();</span> +<span class="CommentedCode">//? trace(1, "foo") << "a: " << address; //? 1</span> + out << Memory[address]<span class="Delimiter">;</span> +<span class="CommentedCode">//? trace(1, "foo") << "b: " << Memory[address]; //? 1</span> + <span class="Identifier">return</span> new_string<span class="Delimiter">(</span>out<span class="Delimiter">.</span>str<span class="Delimiter">());</span> +<span class="Delimiter">}</span> + +bool is_string<span class="Delimiter">(</span>const reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> + <span class="Identifier">return</span> x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>size<span class="Delimiter">()</span> == <span class="Constant">3</span> + && x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">"address"</span>] + && x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">"array"</span>] + && x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">)</span> == Type_ordinal[<span class="Constant">"character"</span>]<span class="Delimiter">;</span> <span class="Delimiter">}</span> -<span class="SalientComment">//:: debugging tool</span> +long long int warnings_from_trace<span class="Delimiter">()</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> + if <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"warn"</span><span class="Delimiter">)</span> <= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> + ostringstream out<span class="Delimiter">;</span> + for <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> + if <span class="Delimiter">(</span>p<span class="Delimiter">-></span>label != <span class="Constant">"warn"</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> + out << p<span class="Delimiter">-></span>contents<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>*--p<span class="Delimiter">-></span>contents<span class="Delimiter">.</span>end<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> + <span class="Delimiter">}</span> + assert<span class="Delimiter">(</span>!out<span class="Delimiter">.</span>str<span class="Delimiter">().</span>empty<span class="Delimiter">());</span> + <span class="Identifier">return</span> new_string<span class="Delimiter">(</span>out<span class="Delimiter">.</span>str<span class="Delimiter">());</span> +<span class="Delimiter">}</span> +<span class="Comment">//: simpler version of run-interactive: doesn't do any running, just loads</span> +<span class="Comment">//: recipes and reports warnings.</span> +<span class="Delimiter">:(before "End Globals")</span> +bool Loading_interactive = <span class="Constant">false</span><span class="Delimiter">;</span> +<span class="Delimiter">:(before "End Setup")</span> +Loading_interactive = <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> -_RUN_DEPTH<span class="Delimiter">,</span> +RELOAD<span class="Delimiter">,</span> <span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -Recipe_number[<span class="Constant">"$run-depth"</span>] = _RUN_DEPTH<span class="Delimiter">;</span> +Recipe_ordinal[<span class="Constant">"reload"</span>] = RELOAD<span class="Delimiter">;</span> <span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> -case _RUN_DEPTH: <span class="Delimiter">{</span> - cerr << Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>size<span class="Delimiter">();</span> +case RELOAD: <span class="Delimiter">{</span> + assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> + Loading_interactive = <span class="Constant">true</span><span class="Delimiter">;</span> + Hide_warnings = <span class="Constant">true</span><span class="Delimiter">;</span> + load<span class="Delimiter">(</span>to_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span> +<span class="CommentedCode">//? static int foo = 0;</span> +<span class="CommentedCode">//? if (++foo == 2) {</span> +<span class="CommentedCode">//? tb_shutdown();</span> +<span class="CommentedCode">//? cerr << Recipe_ordinal["new-add"] << '\n';</span> +<span class="CommentedCode">//? cerr << Recipe[Recipe_ordinal["new-add"]].steps[2].to_string() << '\n';</span> +<span class="CommentedCode">//? exit(0);</span> +<span class="CommentedCode">//? }</span> + transform_all<span class="Delimiter">();</span> + Hide_warnings = <span class="Constant">false</span><span class="Delimiter">;</span> + Loading_interactive = <span class="Constant">false</span><span class="Delimiter">;</span> + products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> + products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>warnings_from_trace<span class="Delimiter">());</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> </pre> diff --git a/html/display.mu.html b/html/display.mu.html index 6d3cd7a9..d6e1560f 100644 --- a/html/display.mu.html +++ b/html/display.mu.html @@ -33,7 +33,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muRecipe">recipe</span> main [ open-console - print-character-to-display <span class="Constant">97:literal</span>, <span class="Constant">1:literal/red</span> + print-character-to-display <span class="Constant">97:literal</span>, <span class="Constant">1:literal/red</span>, <span class="Constant">2:literal/green</span> 1:number/<span class="Special">raw</span>, 2:number/<span class="Special">raw <- </span>cursor-position-on-display wait-for-some-interaction clear-display diff --git a/html/edit.mu.html b/html/edit.mu.html index 8481c441..3eb34a4b 100644 --- a/html/edit.mu.html +++ b/html/edit.mu.html @@ -33,43 +33,71 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } </head> <body> <pre id='vimCodeElement'> -<span class="Comment"># Editor widget: takes a string and screen coordinates, modifying them in place.</span> +<span class="Comment"># Environment for learning programming using mu.</span> <span class="muRecipe">recipe</span> main [ <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> open-console - width:number<span class="Special"> <- </span>display-width - height:number<span class="Special"> <- </span>display-height - <span class="Comment"># draw a line</span> + initial-recipe:address:array:character<span class="Special"> <- </span>new <span class="Constant">[recipe new-add [</span> +<span class="Constant"> x:number <- next-ingredient</span> +<span class="Constant"> y:number <- next-ingredient</span> +<span class="Constant"> z:number <- add x:number, y:number</span> +<span class="Constant"> reply z:number</span> +<span class="Constant">]</span>] + initial-sandbox:address:array:character<span class="Special"> <- </span>new <span class="Constant">[new-add 2:literal, 3:literal]</span> + env:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment <span class="Constant">0:literal/screen</span>, initial-recipe:address:array:character, initial-sandbox:address:array:character + render-all <span class="Constant">0:literal/address</span>, env:address:programming-environment-data + event-loop <span class="Constant">0:literal/screen</span>, <span class="Constant">0:literal/console</span>, env:address:programming-environment-data +] + +container programming-environment-data [ + recipes:address:editor-data + recipe-warnings:address:array:character + current-sandbox:address:editor-data + sandbox:address:sandbox-data + sandbox-in-focus?:boolean <span class="Comment"># false => focus in recipes; true => focus in current-sandbox</span> +] + +<span class="muRecipe">recipe</span> new-programming-environment [ + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + initial-recipe-contents:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + initial-sandbox-contents:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + width:number<span class="Special"> <- </span>screen-width screen:address + height:number<span class="Special"> <- </span>screen-height screen:address + <span class="Comment"># top menu</span> + result:address:programming-environment-data<span class="Special"> <- </span>new programming-environment-data:type + draw-horizontal screen:address, <span class="Constant">0:literal</span>, <span class="Constant">0:literal/left</span>, width:number, <span class="Constant">32:literal/space</span>, <span class="Constant">0:literal/black</span>, <span class="Constant">238:literal/grey</span> + button-start:number<span class="Special"> <- </span>subtract width:number, <span class="Constant">20:literal</span> + button-on-screen?:boolean<span class="Special"> <- </span>greater-or-equal button-start:number, <span class="Constant">0:literal</span> + assert button-on-screen?:boolean, <span class="Constant">[screen too narrow for menu]</span> + move-cursor screen:address, <span class="Constant">0:literal/row</span>, button-start:number/column + run-button:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ run (F10) ]</span> + print-string screen:address, run-button:address:array:character, <span class="Constant">255:literal/white</span>, <span class="Constant">161:literal/reddish</span> + <span class="Comment"># dotted line down the middle</span> divider:number, _<span class="Special"> <- </span>divide-with-remainder width:number, <span class="Constant">2:literal</span> - draw-vertical <span class="Constant">0:literal/screen</span>, divider:number, <span class="Constant">0:literal/top</span>, height:number - <span class="Comment"># editor on the left</span> - left:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcde]</span> - left-editor:address:editor-data<span class="Special"> <- </span>new-editor left:address:array:character, <span class="Constant">0:literal/screen</span>, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> <span class="Comment">#divider:number/right</span> - <span class="Comment"># editor on the right</span> - right:address:array:character<span class="Special"> <- </span>new <span class="Constant">[def]</span> - new-left:number<span class="Special"> <- </span>add divider:number/right, <span class="Constant">1:literal</span> - right-editor:address:editor-data<span class="Special"> <- </span>new-editor right:address:array:character, <span class="Constant">0:literal/screen</span>, <span class="Constant">0:literal/top</span>, new-left:number, width:number - <span class="Comment"># chain</span> - x:address:address:editor-data<span class="Special"> <- </span>get-address left-editor:address:editor-data/deref, next-editor:offset - x:address:address:editor-data/deref<span class="Special"> <- </span>copy right-editor:address:editor-data - <span class="Comment"># initialize focus</span> - reset-focus left-editor:address:editor-data - cursor-row:number<span class="Special"> <- </span>get left-editor:address:editor-data/deref, cursor-row:offset - cursor-column:number<span class="Special"> <- </span>get left-editor:address:editor-data/deref, cursor-column:offset - move-cursor <span class="Constant">0:literal/screen</span>, cursor-row:number, cursor-column:number - <span class="Comment"># and we're off!</span> - event-loop <span class="Constant">0:literal/screen</span>, <span class="Constant">0:literal/events</span>, left-editor:address:editor-data - close-console + draw-vertical screen:address, divider:number, <span class="Constant">1:literal/top</span>, height:number, <span class="Constant">9482:literal/vertical-dotted</span> + <span class="Comment"># recipe editor on the left</span> + recipes:address:address:editor-data<span class="Special"> <- </span>get-address result:address:programming-environment-data/deref, recipes:offset + recipes:address:address:editor-data/deref<span class="Special"> <- </span>new-editor initial-recipe-contents:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, divider:number/right + <span class="Comment"># sandbox editor on the right</span> + new-left:number<span class="Special"> <- </span>add divider:number, <span class="Constant">1:literal</span> + new-right:number<span class="Special"> <- </span>add new-left:number, <span class="Constant">5:literal</span> + current-sandbox:address:address:editor-data<span class="Special"> <- </span>get-address result:address:programming-environment-data/deref, current-sandbox:offset + current-sandbox:address:address:editor-data/deref<span class="Special"> <- </span>new-editor initial-sandbox-contents:address:array:character, screen:address, new-left:number, width:number + <span class="Comment"># initialize cursor</span> + update-cursor screen:address, recipes:address:address:editor-data/deref, current-sandbox:address:address:editor-data/deref, <span class="Constant">0:literal/focus-in-recipes</span> + <span class="muControl">reply</span> result:address:programming-environment-data ] <span class="muScenario">scenario</span> editor-initially-prints-string-to-screen [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> run [ 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> . .</span> ] @@ -79,30 +107,21 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="SalientComment">## text to the screen.</span> container editor-data [ - <span class="Comment"># doubly linked list of characters (head contains a special sentinel)</span> + <span class="Comment"># editable text: doubly linked list of characters (head contains a special sentinel)</span> data:address:duplex-list - <span class="Comment"># location of top-left of screen inside data (scrolling)</span> - top-of-screen:address:duplex-list <span class="Comment"># location before cursor inside data</span> before-cursor:address:duplex-list - screen:address:screen <span class="Comment"># raw bounds of display area on screen</span> - top:number + <span class="Comment"># always displays from row 1 and at most until bottom of screen</span> left:number - bottom:number right:number <span class="Comment"># raw screen coordinates of cursor</span> cursor-row:number cursor-column:number - - <span class="Comment"># pointer to another editor, responsible for a different area of screen.</span> - <span class="Comment"># helps organize editors in a 'chain'.</span> - next-editor:address:editor-data - in-focus?:boolean <span class="Comment"># set for the one editor in this chain currently being edited</span> ] -<span class="Comment"># editor:address, screen:address <- new-editor s:address:array:character, screen:address, top:number, left:number, bottom:number</span> +<span class="Comment"># editor:address, screen:address <- new-editor s:address:array:character, screen:address, left:number, right:number</span> <span class="Comment"># creates a new editor widget and renders its initial appearance to screen.</span> <span class="Comment"># top/left/right constrain the screen area available to the new editor.</span> <span class="Comment"># right is exclusive.</span> @@ -111,42 +130,24 @@ container editor-data [ s:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># no clipping of bounds</span> - top:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> left:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> right:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> right:number<span class="Special"> <- </span>subtract right:number, <span class="Constant">1:literal</span> result:address:editor-data<span class="Special"> <- </span>new editor-data:type <span class="Comment"># initialize screen-related fields</span> - sc:address:address:screen<span class="Special"> <- </span>get-address result:address:editor-data/deref, screen:offset - sc:address:address:screen/deref<span class="Special"> <- </span>copy screen:address - x:address:number<span class="Special"> <- </span>get-address result:address:editor-data/deref, top:offset - x:address:number/deref<span class="Special"> <- </span>copy top:number x:address:number<span class="Special"> <- </span>get-address result:address:editor-data/deref, left:offset x:address:number/deref<span class="Special"> <- </span>copy left:number x:address:number<span class="Special"> <- </span>get-address result:address:editor-data/deref, right:offset x:address:number/deref<span class="Special"> <- </span>copy right:number - <span class="Comment"># bottom = top (in case of early exit)</span> - x:address:number<span class="Special"> <- </span>get-address result:address:editor-data/deref, bottom:offset - x:address:number/deref<span class="Special"> <- </span>copy top:number <span class="Comment"># initialize cursor</span> x:address:number<span class="Special"> <- </span>get-address result:address:editor-data/deref, cursor-row:offset - x:address:number/deref<span class="Special"> <- </span>copy top:number + x:address:number/deref<span class="Special"> <- </span>copy <span class="Constant">1:literal/top</span> x:address:number<span class="Special"> <- </span>get-address result:address:editor-data/deref, cursor-column:offset -<span class="CommentedCode">#? $print left:number, [ </span> -<span class="CommentedCode">#? ] #? 1</span> x:address:number/deref<span class="Special"> <- </span>copy left:number - d:address:address:duplex-list<span class="Special"> <- </span>get-address result:address:editor-data/deref, data:offset - d:address:address:duplex-list/deref<span class="Special"> <- </span>push-duplex <span class="Constant">167:literal/§</span>, <span class="Constant">0:literal/tail</span> + init:address:address:duplex-list<span class="Special"> <- </span>get-address result:address:editor-data/deref, data:offset + init:address:address:duplex-list/deref<span class="Special"> <- </span>push-duplex <span class="Constant">167:literal/§</span>, <span class="Constant">0:literal/tail</span> y:address:address:duplex-list<span class="Special"> <- </span>get-address result:address:editor-data/deref, before-cursor:offset - y:address:address:duplex-list/deref<span class="Special"> <- </span>copy d:address:address:duplex-list/deref - init:address:address:duplex-list<span class="Special"> <- </span>get-address result:address:editor-data/deref, top-of-screen:offset - init:address:address:duplex-list/deref<span class="Special"> <- </span>copy d:address:address:duplex-list/deref - <span class="Comment"># set focus</span> - <span class="Comment"># if using multiple editors, must call reset-focus after chaining them all</span> - b:address:boolean<span class="Special"> <- </span>get-address result:address:editor-data/deref, in-focus?:offset - b:address:boolean/deref<span class="Special"> <- </span>copy <span class="Constant">1:literal/true</span> -<span class="CommentedCode">#? $print d:address:address:duplex-list/deref, [ </span> -<span class="CommentedCode">#? ] #? 1</span> + y:address:address:duplex-list/deref<span class="Special"> <- </span>copy init:address:address:duplex-list/deref <span class="Comment"># early exit if s is empty</span> <span class="muControl">reply-unless</span> s:address:array:character, result:address:editor-data len:number<span class="Special"> <- </span>length s:address:array:character/deref @@ -155,15 +156,9 @@ container editor-data [ <span class="Comment"># now we can start appending the rest, character by character</span> curr:address:duplex-list<span class="Special"> <- </span>copy init:address:address:duplex-list/deref <span class="Delimiter">{</span> -<span class="CommentedCode">#? $print idx:number, [ vs ], len:number, [ </span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? $print [append to ], curr:address:duplex-list, [ </span> -<span class="CommentedCode">#? ] #? 1</span> done?:boolean<span class="Special"> <- </span>greater-or-equal idx:number, len:number <span class="muControl">break-if</span> done?:boolean c:character<span class="Special"> <- </span>index s:address:array:character/deref, idx:number -<span class="CommentedCode">#? $print [aa: ], c:character, [ </span> -<span class="CommentedCode">#? ] #? 1</span> insert-duplex c:character, curr:address:duplex-list <span class="Comment"># next iter</span> curr:address:duplex-list<span class="Special"> <- </span>next-duplex curr:address:duplex-list @@ -173,29 +168,24 @@ container editor-data [ <span class="Comment"># initialize cursor to top of screen</span> y:address:address:duplex-list<span class="Special"> <- </span>get-address result:address:editor-data/deref, before-cursor:offset y:address:address:duplex-list/deref<span class="Special"> <- </span>copy init:address:address:duplex-list/deref - <span class="Comment"># perform initial rendering to screen</span> - bottom:address:number<span class="Special"> <- </span>get-address result:address:editor-data/deref, bottom:offset - result:address:editor-data<span class="Special"> <- </span>render result:address:editor-data + <span class="Comment"># initial render to screen, just for some old tests</span> + _, screen:address<span class="Special"> <- </span>render screen:address, result:address:editor-data <span class="muControl">reply</span> result:address:editor-data ] <span class="muScenario">scenario</span> editor-initializes-without-data [ assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span> run [ - 1:address:editor-data<span class="Special"> <- </span>new-editor <span class="Constant">0:literal/data</span>, screen:address, <span class="Constant">1:literal/top</span>, <span class="Constant">2:literal/left</span>, <span class="Constant">5:literal/right</span> + 1:address:editor-data<span class="Special"> <- </span>new-editor <span class="Constant">0:literal/data</span>, screen:address, <span class="Constant">2:literal/left</span>, <span class="Constant">5:literal/right</span> 2:editor-data<span class="Special"> <- </span>copy 1:address:editor-data/deref ] memory-should-contain [ - <span class="Comment"># 2 <- just the § sentinel</span> - <span class="Comment"># 3 (top of screen) <- the § sentinel</span> - <span class="Comment"># 4 (before cursor) <- the § sentinel</span> - <span class="Comment"># 5 <- screen</span> - 6<span class="Special"> <- </span>1 <span class="Comment"># top</span> - 7<span class="Special"> <- </span>2 <span class="Comment"># left</span> - 8<span class="Special"> <- </span>1 <span class="Comment"># bottom</span> - 9<span class="Special"> <- </span>4 <span class="Comment"># right (inclusive)</span> - 10<span class="Special"> <- </span>1 <span class="Comment"># cursor row</span> - 11<span class="Special"> <- </span>2 <span class="Comment"># cursor column</span> + <span class="Comment"># 2 (data) <- just the § sentinel</span> + <span class="Comment"># 3 (before cursor) <- the § sentinel</span> + 4<span class="Special"> <- </span>2 <span class="Comment"># left</span> + 5<span class="Special"> <- </span>4 <span class="Comment"># right (inclusive)</span> + 6<span class="Special"> <- </span>1 <span class="Comment"># cursor row</span> + 7<span class="Special"> <- </span>2 <span class="Comment"># cursor column</span> ] screen-should-contain [ <span class="Constant"> . .</span> @@ -204,23 +194,22 @@ container editor-data [ ] ] +<span class="Comment"># bottom:number, screen:address <- render screen:address, editor:address:editor-data</span> <span class="muRecipe">recipe</span> render [ <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">40:literal</span> + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> -<span class="CommentedCode">#? $print [=== render</span> -<span class="CommentedCode">#? ] #? 2</span> - screen:address<span class="Special"> <- </span>get editor:address:editor-data/deref, screen:offset - top:number<span class="Special"> <- </span>get editor:address:editor-data/deref, top:offset + <span class="muControl">reply-unless</span> editor:address:editor-data, <span class="Constant">1:literal/top</span>, screen:address/same-as-ingredient:0 left:number<span class="Special"> <- </span>get editor:address:editor-data/deref, left:offset screen-height:number<span class="Special"> <- </span>screen-height screen:address right:number<span class="Special"> <- </span>get editor:address:editor-data/deref, right:offset hide-screen screen:address <span class="Comment"># traversing editor</span> - curr:address:duplex-list<span class="Special"> <- </span>get editor:address:editor-data/deref, top-of-screen:offset + curr:address:duplex-list<span class="Special"> <- </span>get editor:address:editor-data/deref, data:offset prev:address:duplex-list<span class="Special"> <- </span>copy curr:address:duplex-list curr:address:duplex-list<span class="Special"> <- </span>next-duplex curr:address:duplex-list <span class="Comment"># traversing screen</span> - row:number<span class="Special"> <- </span>copy top:number + row:number<span class="Special"> <- </span>copy <span class="Constant">1:literal/top</span> column:number<span class="Special"> <- </span>copy left:number cursor-row:address:number<span class="Special"> <- </span>get-address editor:address:editor-data/deref, cursor-row:offset cursor-column:address:number<span class="Special"> <- </span>get-address editor:address:editor-data/deref, cursor-column:offset @@ -228,8 +217,6 @@ container editor-data [ move-cursor screen:address, row:number, column:number <span class="Delimiter">{</span> <span class="Constant"> +next-character</span> -<span class="CommentedCode">#? $print curr:address:duplex-list, [ </span> -<span class="CommentedCode">#? ] #? 1</span> <span class="muControl">break-unless</span> curr:address:duplex-list off-screen?:boolean<span class="Special"> <- </span>greater-or-equal row:number, screen-height:number <span class="muControl">break-if</span> off-screen?:boolean @@ -242,13 +229,8 @@ container editor-data [ at-cursor?:boolean<span class="Special"> <- </span>equal column:number, cursor-column:address:number/deref <span class="muControl">break-unless</span> at-cursor?:boolean before-cursor:address:address:duplex-list/deref<span class="Special"> <- </span>prev-duplex curr:address:duplex-list -<span class="CommentedCode">#? new-prev:character <- get before-cursor:address:address:duplex-list/deref/deref, value:offset #? 1</span> -<span class="CommentedCode">#? $print [render 0: cursor adjusted to after ], new-prev:character, [(], cursor-row:address:number/deref, [, ], cursor-column:address:number/deref, [)</span> -<span class="CommentedCode">#? ] #? 1</span> <span class="Delimiter">}</span> c:character<span class="Special"> <- </span>get curr:address:duplex-list/deref, value:offset -<span class="CommentedCode">#? $print [rendering ], c:character, [ </span> -<span class="CommentedCode">#? ] #? 2</span> <span class="Delimiter">{</span> <span class="Comment"># newline? move to left rather than 0</span> newline?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">10:literal/newline</span> @@ -261,22 +243,9 @@ container editor-data [ <span class="muControl">break-unless</span> left-of-cursor?:boolean cursor-column:address:number/deref<span class="Special"> <- </span>copy column:number before-cursor:address:address:duplex-list/deref<span class="Special"> <- </span>prev-duplex curr:address:duplex-list -<span class="CommentedCode">#? new-prev:character <- get before-cursor:address:address:duplex-list/deref/deref, value:offset #? 1</span> -<span class="CommentedCode">#? $print [render 1: cursor adjusted to after ], new-prev:character, [(], cursor-row:address:number/deref, [, ], cursor-column:address:number/deref, [)</span> -<span class="CommentedCode">#? ] #? 1</span> <span class="Delimiter">}</span> <span class="Comment"># clear rest of line in this window</span> -<span class="CommentedCode">#? $print row:number, [ ], column:number, [ ], right:number, [ </span> -<span class="CommentedCode">#? ] #? 1</span> - <span class="Delimiter">{</span> - done?:boolean<span class="Special"> <- </span>greater-than column:number, right:number - <span class="muControl">break-if</span> done?:boolean - print-character screen:address, <span class="Constant">32:literal/space</span> - column:number<span class="Special"> <- </span>add column:number, <span class="Constant">1:literal</span> -<span class="CommentedCode">#? $print column:number, [ </span> -<span class="CommentedCode">#? ] #? 1</span> - <span class="muControl">loop</span> - <span class="Delimiter">}</span> + clear-line-delimited screen:address, column:number, right:number <span class="Comment"># skip to next line</span> row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> column:number<span class="Special"> <- </span>copy left:number @@ -286,15 +255,11 @@ container editor-data [ <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> <span class="Delimiter">}</span> <span class="Delimiter">{</span> - <span class="Comment"># at right? more than one letter left in the line? wrap</span> + <span class="Comment"># at right? wrap. even if there's only one more letter left; we need</span> + <span class="Comment"># room for clicking on the cursor after it.</span> at-right?:boolean<span class="Special"> <- </span>equal column:number, right:number <span class="muControl">break-unless</span> at-right?:boolean - next-node:address:duplex-list<span class="Special"> <- </span>next-duplex curr:address:duplex-list - <span class="muControl">break-unless</span> next-node:address:duplex-list - next:character<span class="Special"> <- </span>get next-node:address:duplex-list/deref, value:offset - next-character-is-newline?:boolean<span class="Special"> <- </span>equal next:character, <span class="Constant">10:literal/newline</span> - <span class="muControl">break-if</span> next-character-is-newline?:boolean - <span class="Comment"># wrap</span> + <span class="Comment"># print wrap icon</span> print-character screen:address, <span class="Constant">8617:literal/loop-back-to-left</span>, <span class="Constant">245:literal/grey</span> column:number<span class="Special"> <- </span>copy left:number row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> @@ -308,9 +273,6 @@ container editor-data [ column:number<span class="Special"> <- </span>add column:number, <span class="Constant">1:literal</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Comment"># bottom = row</span> - bottom:address:number<span class="Special"> <- </span>get-address editor:address:editor-data/deref, bottom:offset - bottom:address:number/deref<span class="Special"> <- </span>copy row:number <span class="Comment"># is cursor to the right of the last line? move to end</span> <span class="Delimiter">{</span> at-cursor-row?:boolean<span class="Special"> <- </span>equal row:number, cursor-row:address:number/deref @@ -319,12 +281,8 @@ container editor-data [ above-cursor-row?:boolean<span class="Special"> <- </span>lesser-than row:number, cursor-row:address:number/deref before-cursor?:boolean<span class="Special"> <- </span>or before-cursor-on-same-line?:boolean, above-cursor-row?:boolean <span class="muControl">break-unless</span> before-cursor?:boolean -<span class="CommentedCode">#? $print [pointed after all text</span> -<span class="CommentedCode">#? ] #? 1</span> cursor-row:address:number/deref<span class="Special"> <- </span>copy row:number cursor-column:address:number/deref<span class="Special"> <- </span>copy column:number -<span class="CommentedCode">#? $print [render: cursor moved to ], cursor-row:address:number/deref, [, ], cursor-column:address:number/deref, [ </span> -<span class="CommentedCode">#? ] #? 1</span> <span class="Comment"># line not wrapped but cursor outside bounds? wrap cursor</span> <span class="Delimiter">{</span> too-far-right?:boolean<span class="Special"> <- </span>greater-than cursor-column:address:number/deref, right:number @@ -334,62 +292,106 @@ container editor-data [ above-screen-bottom?:boolean<span class="Special"> <- </span>lesser-than cursor-row:address:number/deref, screen-height:number assert above-screen-bottom?:boolean, <span class="Constant">[unimplemented: wrapping cursor past bottom of screen]</span> <span class="Delimiter">}</span> -<span class="CommentedCode">#? $print [now ], cursor-row:address:number/deref, [, ], cursor-column:address:number/deref, [ </span> -<span class="CommentedCode">#? ] #? 1</span> before-cursor:address:address:duplex-list/deref<span class="Special"> <- </span>copy prev:address:duplex-list -<span class="CommentedCode">#? new-prev:character <- get before-cursor:address:address:duplex-list/deref/deref, value:offset #? 1</span> -<span class="CommentedCode">#? $print [render Ω: cursor adjusted to after ], new-prev:character, [(], cursor-row:address:number/deref, [, ], cursor-column:address:number/deref, [)</span> -<span class="CommentedCode">#? ] #? 1</span> <span class="Delimiter">}</span> -<span class="CommentedCode">#? $print [clearing ], row:number, [ ], column:number, [ ], right:number, [ </span> -<span class="CommentedCode">#? ] #? 2</span> + <span class="Comment"># clear rest of current line</span> + clear-line-delimited screen:address, column:number, right:number + <span class="muControl">reply</span> row:number, screen:address/same-as-ingredient:0 +] + +<span class="Comment"># row:number, screen:address <- render-string screen:address, s:address:array:character, left:number, right:number, color:number, row:number</span> +<span class="Comment"># print a string 's' to 'editor' in 'color' starting at 'row'</span> +<span class="Comment"># leave cursor at start of next line</span> +<span class="muRecipe">recipe</span> render-string [ + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">40:literal</span> + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + s:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + left:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + right:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + color:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + row:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> + <span class="muControl">reply-unless</span> s:address:array:character, row:number/same-as-ingredient:5, screen:address/same-as-ingredient:0 + column:number<span class="Special"> <- </span>copy left:number + move-cursor screen:address, row:number, column:number + screen-height:number<span class="Special"> <- </span>screen-height screen:address + i:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> + len:number<span class="Special"> <- </span>length s:address:array:character/deref <span class="Delimiter">{</span> - <span class="Comment"># clear rest of current line</span> +<span class="Constant"> +next-character</span> + done?:boolean<span class="Special"> <- </span>greater-or-equal i:number, len:number + <span class="muControl">break-if</span> done?:boolean done?:boolean<span class="Special"> <- </span>greater-or-equal row:number, screen-height:number <span class="muControl">break-if</span> done?:boolean + c:character<span class="Special"> <- </span>index s:address:array:character/deref, i:number <span class="Delimiter">{</span> - line-done?:boolean<span class="Special"> <- </span>greater-than column:number, right:number - <span class="muControl">break-if</span> line-done?:boolean - print-character screen:address, <span class="Constant">32:literal/space</span> - column:number<span class="Special"> <- </span>add column:number, <span class="Constant">1:literal</span> - <span class="muControl">loop</span> + <span class="Comment"># at right? wrap.</span> + at-right?:boolean<span class="Special"> <- </span>equal column:number, right:number + <span class="muControl">break-unless</span> at-right?:boolean + <span class="Comment"># print wrap icon</span> + print-character screen:address, <span class="Constant">8617:literal/loop-back-to-left</span>, <span class="Constant">245:literal/grey</span> + column:number<span class="Special"> <- </span>copy left:number + row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> + move-cursor screen:address, row:number, column:number + <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> <span class="Comment"># retry i</span> <span class="Delimiter">}</span> - <span class="Comment"># clear one more line just in case we just backspaced out of it</span> - row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> - column:number<span class="Special"> <- </span>copy left:number - done?:boolean<span class="Special"> <- </span>greater-or-equal row:number, screen-height:number - <span class="muControl">break-if</span> done?:boolean - move-cursor screen:address, row:number, column:number + i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> <span class="Delimiter">{</span> - line-done?:boolean<span class="Special"> <- </span>greater-or-equal column:number, right:number - <span class="muControl">break-if</span> line-done?:boolean - print-character screen:address, <span class="Constant">32:literal/space</span> - column:number<span class="Special"> <- </span>add column:number, <span class="Constant">1:literal</span> - <span class="muControl">loop</span> + <span class="Comment"># newline? move to left rather than 0</span> + newline?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">10:literal/newline</span> + <span class="muControl">break-unless</span> newline?:boolean + <span class="Comment"># clear rest of line in this window</span> + <span class="Delimiter">{</span> + done?:boolean<span class="Special"> <- </span>greater-than column:number, right:number + <span class="muControl">break-if</span> done?:boolean + print-character screen:address, <span class="Constant">32:literal/space</span> + column:number<span class="Special"> <- </span>add column:number, <span class="Constant">1:literal</span> + <span class="muControl">loop</span> + <span class="Delimiter">}</span> + row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> + column:number<span class="Special"> <- </span>copy left:number + move-cursor screen:address, row:number, column:number + <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> <span class="Delimiter">}</span> + print-character screen:address, c:character, color:number + column:number<span class="Special"> <- </span>add column:number, <span class="Constant">1:literal</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Comment"># update cursor</span> <span class="Delimiter">{</span> - in-focus?:boolean<span class="Special"> <- </span>get editor:address:editor-data/deref, in-focus?:offset - <span class="muControl">break-unless</span> in-focus?:boolean - cursor-inside-right-margin?:boolean<span class="Special"> <- </span>lesser-or-equal cursor-column:address:number/deref, right:number - assert cursor-inside-right-margin?:boolean, <span class="Constant">[cursor outside right margin]</span> - cursor-inside-left-margin?:boolean<span class="Special"> <- </span>greater-or-equal cursor-column:address:number/deref, left:number - assert cursor-inside-left-margin?:boolean, <span class="Constant">[cursor outside left margin]</span> - move-cursor screen:address, cursor-row:address:number/deref, cursor-column:address:number/deref + <span class="Comment"># clear rest of current line</span> + line-done?:boolean<span class="Special"> <- </span>greater-than column:number, right:number + <span class="muControl">break-if</span> line-done?:boolean + print-character screen:address, <span class="Constant">32:literal/space</span> + column:number<span class="Special"> <- </span>add column:number, <span class="Constant">1:literal</span> + <span class="muControl">loop</span> + <span class="Delimiter">}</span> + <span class="muControl">reply</span> row:number/same-as-ingredient:5, screen:address/same-as-ingredient:0 +] + +<span class="muRecipe">recipe</span> clear-line-delimited [ + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">40:literal</span> + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + left:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + right:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + column:number<span class="Special"> <- </span>copy left:number + <span class="Delimiter">{</span> + done?:boolean<span class="Special"> <- </span>greater-than column:number, right:number + <span class="muControl">break-if</span> done?:boolean + print-character screen:address, <span class="Constant">32:literal/space</span> + column:number<span class="Special"> <- </span>add column:number, <span class="Constant">1:literal</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> - show-screen screen:address - <span class="muControl">reply</span> editor:address:editor-data/same-as-ingredient:0 ] <span class="muScenario">scenario</span> editor-initially-prints-multiple-lines [ - assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span> + assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span> run [ s:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">def]</span> - new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> .def .</span> <span class="Constant"> . .</span> @@ -397,26 +399,27 @@ container editor-data [ ] <span class="muScenario">scenario</span> editor-initially-handles-offsets [ - assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span> + assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span> run [ s:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">1:literal/left</span>, <span class="Constant">5:literal/right</span> + new-editor s:address:array:character, screen:address, <span class="Constant">1:literal/left</span>, <span class="Constant">5:literal/right</span> ] screen-should-contain [ - <span class="Constant"> . abc .</span> <span class="Constant"> . .</span> + <span class="Constant"> . abc .</span> <span class="Constant"> . .</span> ] ] <span class="muScenario">scenario</span> editor-initially-prints-multiple-lines-at-offset [ - assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span> + assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span> run [ s:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">def]</span> - new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">1:literal/left</span>, <span class="Constant">5:literal/right</span> + new-editor s:address:array:character, screen:address, <span class="Constant">1:literal/left</span>, <span class="Constant">5:literal/right</span> ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> . abc .</span> <span class="Constant"> . def .</span> <span class="Constant"> . .</span> @@ -424,17 +427,41 @@ container editor-data [ ] <span class="muScenario">scenario</span> editor-initially-wraps-long-lines [ - assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span> + assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span> run [ s:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc def]</span> - new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc ↩.</span> <span class="Constant"> .def .</span> <span class="Constant"> . .</span> ] screen-should-contain-in-color, <span class="Constant">245:literal/grey</span> [ + <span class="Constant"> . .</span> + <span class="Constant"> . ↩.</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + ] +] + +<span class="muScenario">scenario</span> editor-initially-wraps-barely-long-lines [ + assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span> + run [ + s:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcde]</span> + new-editor s:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + ] + <span class="Comment"># still wrap, even though the line would fit. We need room to click on the</span> + <span class="Comment"># end of the line</span> + screen-should-contain [ + <span class="Constant"> . .</span> +<span class="Constant"> .abcd↩.</span> + <span class="Constant"> .e .</span> + <span class="Constant"> . .</span> + ] + screen-should-contain-in-color, <span class="Constant">245:literal/grey</span> [ + <span class="Constant"> . .</span> <span class="Constant"> . ↩.</span> <span class="Constant"> . .</span> <span class="Constant"> . .</span> @@ -442,10 +469,10 @@ container editor-data [ ] <span class="muScenario">scenario</span> editor-initializes-empty-text [ - assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span> + assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span> run [ 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] @@ -455,86 +482,112 @@ container editor-data [ <span class="Constant"> . .</span> ] memory-should-contain [ - 3<span class="Special"> <- </span>0 <span class="Comment"># cursor row</span> + 3<span class="Special"> <- </span>1 <span class="Comment"># cursor row</span> 4<span class="Special"> <- </span>0 <span class="Comment"># cursor column</span> ] ] <span class="SalientComment">## handling events from the keyboard, mouse, touch screen, ...</span> -<span class="Comment"># Takes a chain of editors (chained using editor-data.next-editor), sends each</span> -<span class="Comment"># event from the console to each editor.</span> <span class="muRecipe">recipe</span> event-loop [ <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + env:address:programming-environment-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + recipes:address:editor-data<span class="Special"> <- </span>get env:address:programming-environment-data/deref, recipes:offset + current-sandbox:address:editor-data<span class="Special"> <- </span>get env:address:programming-environment-data/deref, current-sandbox:offset + sandbox-in-focus?:address:boolean<span class="Special"> <- </span>get-address env:address:programming-environment-data/deref, sandbox-in-focus?:offset <span class="Delimiter">{</span> - <span class="Comment"># send each event to each editor</span> + <span class="Comment"># looping over each (keyboard or touch) event as it occurs</span> +<span class="Constant"> +next-event</span> e:event, console:address, found?:boolean, quit?:boolean<span class="Special"> <- </span>read-event console:address <span class="muControl">loop-unless</span> found?:boolean <span class="muControl">break-if</span> quit?:boolean <span class="Comment"># only in tests</span> trace <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span> -<span class="CommentedCode">#? $print [--- new event</span> -<span class="CommentedCode">#? ] #? 1</span> - curr:address:editor-data<span class="Special"> <- </span>copy editor:address:editor-data + <span class="Comment"># check for global events that will trigger regardless of which editor has focus</span> <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> curr:address:editor-data - handle-event screen:address, console:address, curr:address:editor-data, e:event - curr:address:editor-data<span class="Special"> <- </span>get curr:address:editor-data/deref, next-editor:offset - <span class="muControl">loop</span> + k:address:number<span class="Special"> <- </span>maybe-convert e:event, keycode:variant + <span class="muControl">break-unless</span> k:address:number + <span class="Comment"># F10? load all code and run all sandboxes.</span> + <span class="Delimiter">{</span> + do-run?:boolean<span class="Special"> <- </span>equal k:address:number/deref, <span class="Constant">65526:literal/F10</span> + <span class="muControl">break-unless</span> do-run?:boolean + run-sandboxes env:address:programming-environment-data + <span class="muControl">jump</span> <span class="Constant">+continue:label</span> + <span class="Delimiter">}</span> <span class="Delimiter">}</span> - <span class="Comment"># after each non-trivial event, render all editors</span> - curr:address:editor-data<span class="Special"> <- </span>copy editor:address:editor-data + <span class="Comment"># 'touch' event - send to both editors</span> <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> curr:address:editor-data - render curr:address:editor-data - curr:address:editor-data<span class="Special"> <- </span>get curr:address:editor-data/deref, next-editor:offset - <span class="muControl">loop</span> + t:address:touch-event<span class="Special"> <- </span>maybe-convert e:event, touch:variant + <span class="muControl">break-unless</span> t:address:touch-event + _<span class="Special"> <- </span>move-cursor-in-editor screen:address, recipes:address:editor-data, t:address:touch-event/deref + sandbox-in-focus?:address:boolean/deref<span class="Special"> <- </span>move-cursor-in-editor screen:address, current-sandbox:address:editor-data, t:address:touch-event/deref + <span class="muControl">jump</span> <span class="Constant">+continue:label</span> <span class="Delimiter">}</span> - <span class="Comment"># ..and position the cursor</span> - curr:address:editor-data<span class="Special"> <- </span>copy editor:address:editor-data + <span class="Comment"># if it's not global, send to appropriate editor</span> <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> curr:address:editor-data <span class="Delimiter">{</span> - in-focus?:boolean<span class="Special"> <- </span>get curr:address:editor-data/deref, in-focus?:offset - <span class="muControl">break-unless</span> in-focus?:boolean - cursor-row:number<span class="Special"> <- </span>get curr:address:editor-data/deref, cursor-row:offset - cursor-column:number<span class="Special"> <- </span>get curr:address:editor-data/deref, cursor-column:offset - move-cursor screen:address, cursor-row:number, cursor-column:number + <span class="muControl">break-if</span> sandbox-in-focus?:address:boolean/deref + handle-event screen:address, console:address, recipes:address:editor-data, e:event <span class="Delimiter">}</span> - curr:address:editor-data<span class="Special"> <- </span>get curr:address:editor-data/deref, next-editor:offset - <span class="muControl">loop</span> + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> sandbox-in-focus?:address:boolean/deref + handle-event screen:address, console:address, current-sandbox:address:editor-data, e:event + <span class="Delimiter">}</span> + <span class="Delimiter">}</span> +<span class="Constant"> +continue</span> + <span class="Comment"># if no more events currently left to process, render</span> + <span class="Comment"># todo: test this</span> + <span class="Delimiter">{</span> + more-events?:boolean<span class="Special"> <- </span>has-more-events? console:address + <span class="muControl">break-if</span> more-events?:boolean + render-all screen:address, env:address:programming-environment-data <span class="Delimiter">}</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> ] +<span class="Comment"># helper for testing a single editor</span> +<span class="muRecipe">recipe</span> editor-event-loop [ + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Delimiter">{</span> + <span class="Comment"># looping over each (keyboard or touch) event as it occurs</span> +<span class="Constant"> +next-event</span> + e:event, console:address, found?:boolean, quit?:boolean<span class="Special"> <- </span>read-event console:address + <span class="muControl">loop-unless</span> found?:boolean + <span class="muControl">break-if</span> quit?:boolean <span class="Comment"># only in tests</span> + trace <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span> + <span class="Comment"># 'touch' event - send to both editors</span> + <span class="Delimiter">{</span> + t:address:touch-event<span class="Special"> <- </span>maybe-convert e:event, touch:variant + <span class="muControl">break-unless</span> t:address:touch-event + move-cursor-in-editor screen:address, editor:address:editor-data, t:address:touch-event/deref + <span class="muControl">jump</span> <span class="Constant">+continue:label</span> + <span class="Delimiter">}</span> + <span class="Comment"># other events - send to appropriate editor</span> + handle-event screen:address, console:address, editor:address:editor-data, e:event +<span class="Constant"> +continue</span> + row:number, screen:address<span class="Special"> <- </span>render screen:address, editor:address:editor-data + <span class="Comment"># clear next line, in case we just processed a backspace</span> + left:number<span class="Special"> <- </span>get editor:address:editor-data/deref, left:offset + right:number<span class="Special"> <- </span>get editor:address:editor-data/deref, right:offset + row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> + move-cursor screen:address, row:number, left:number + clear-line-delimited screen:address, left:number, right:number + <span class="muControl">loop</span> + <span class="Delimiter">}</span> +] + <span class="muRecipe">recipe</span> handle-event [ <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">50:literal</span> screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> e:event<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - <span class="Comment"># 'touch' event</span> - <span class="Delimiter">{</span> - t:address:touch-event<span class="Special"> <- </span>maybe-convert e:event, touch:variant - <span class="muControl">break-unless</span> t:address:touch-event - move-cursor-in-editor editor:address:editor-data, t:address:touch-event/deref - <span class="muControl">reply</span> - <span class="Delimiter">}</span> - <span class="Comment"># other events trigger only if this editor is in focus</span> -<span class="CommentedCode">#? $print [checking ], editor:address:editor-data, [ </span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? x:address:boolean <- get-address editor:address:editor-data/deref, in-focus?:offset #? 1</span> -<span class="CommentedCode">#? $print [address of focus: ], x:address:boolean, [ </span> -<span class="CommentedCode">#? ] #? 1</span> - in-focus?:address:boolean<span class="Special"> <- </span>get-address editor:address:editor-data/deref, in-focus?:offset -<span class="CommentedCode">#? $print [ at ], in-focus?:address:boolean, [ </span> -<span class="CommentedCode">#? ] #? 1</span> - <span class="muControl">reply-unless</span> in-focus?:address:boolean/deref -<span class="CommentedCode">#? $print [in focus: ], editor:address:editor-data, [ </span> -<span class="CommentedCode">#? ] #? 1</span> + <span class="muControl">reply-unless</span> editor:address:editor-data <span class="Comment"># typing a character</span> <span class="Delimiter">{</span> c:address:character<span class="Special"> <- </span>maybe-convert e:event, text:variant @@ -546,7 +599,7 @@ container editor-data [ delete-before-cursor editor:address:editor-data <span class="muControl">reply</span> <span class="Delimiter">}</span> - insert-at-cursor editor:address:editor-data, c:address:character/deref + insert-at-cursor editor:address:editor-data, c:address:character/deref, screen:address <span class="muControl">reply</span> <span class="Delimiter">}</span> <span class="Comment"># otherwise it's a special key to control the editor</span> @@ -557,7 +610,8 @@ container editor-data [ cursor-row:address:number<span class="Special"> <- </span>get-address editor:address:editor-data/deref, cursor-row:offset cursor-column:address:number<span class="Special"> <- </span>get-address editor:address:editor-data/deref, cursor-column:offset screen-height:number<span class="Special"> <- </span>screen-height screen:address - top:number<span class="Special"> <- </span>get editor:address:editor-data/deref, top:offset + left:number<span class="Special"> <- </span>get editor:address:editor-data/deref, left:offset + right:number<span class="Special"> <- </span>get editor:address:editor-data/deref, right:offset <span class="Comment"># arrows; update cursor-row and cursor-column, leave before-cursor to 'render'.</span> <span class="Comment"># right arrow</span> <span class="Delimiter">{</span> @@ -574,7 +628,7 @@ container editor-data [ was-at-newline?:boolean<span class="Special"> <- </span>equal old-cursor-character:character, <span class="Constant">10:literal/newline</span> <span class="muControl">break-unless</span> was-at-newline?:boolean cursor-row:address:number/deref<span class="Special"> <- </span>add cursor-row:address:number/deref, <span class="Constant">1:literal</span> - cursor-column:address:number/deref<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> + cursor-column:address:number/deref<span class="Special"> <- </span>copy left:number <span class="Comment"># todo: what happens when cursor is too far down?</span> screen-height:number<span class="Special"> <- </span>screen-height screen:address above-screen-bottom?:boolean<span class="Special"> <- </span>lesser-than cursor-row:address:number/deref, screen-height:number @@ -584,21 +638,17 @@ container editor-data [ <span class="Comment"># if the line wraps, move cursor to start of next row</span> <span class="Delimiter">{</span> <span class="Comment"># if we're at the column just before the wrap indicator</span> - right:number<span class="Special"> <- </span>get editor:address:editor-data/deref, right:offset wrap-column:number<span class="Special"> <- </span>subtract right:number, <span class="Constant">1:literal</span> at-wrap?:boolean<span class="Special"> <- </span>equal cursor-column:address:number/deref, wrap-column:number <span class="muControl">break-unless</span> at-wrap?:boolean - <span class="Comment"># and if character after next isn't newline</span> -<span class="CommentedCode">#? $print [aaa] #? 1</span> + <span class="Comment"># and if next character isn't newline</span> new-cursor:address:duplex-list<span class="Special"> <- </span>next-duplex old-cursor:address:duplex-list <span class="muControl">break-unless</span> new-cursor:address:duplex-list - next:address:duplex-list<span class="Special"> <- </span>next-duplex new-cursor:address:duplex-list - <span class="muControl">break-unless</span> next:address:duplex-list - next-character:character<span class="Special"> <- </span>get next:address:duplex-list/deref, value:offset + next-character:character<span class="Special"> <- </span>get new-cursor:address:duplex-list/deref, value:offset newline?:boolean<span class="Special"> <- </span>equal next-character:character, <span class="Constant">10:literal/newline</span> <span class="muControl">break-if</span> newline?:boolean cursor-row:address:number/deref<span class="Special"> <- </span>add cursor-row:address:number/deref, <span class="Constant">1:literal</span> - cursor-column:address:number/deref<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> + cursor-column:address:number/deref<span class="Special"> <- </span>copy left:number <span class="Comment"># todo: what happens when cursor is too far down?</span> above-screen-bottom?:boolean<span class="Special"> <- </span>lesser-than cursor-row:address:number/deref, screen-height:number assert above-screen-bottom?:boolean, <span class="Constant">[unimplemented: moving past bottom of screen]</span> @@ -611,6 +661,7 @@ container editor-data [ <span class="Delimiter">{</span> move-to-previous-character?:boolean<span class="Special"> <- </span>equal k:address:number/deref, <span class="Constant">65515:literal/left-arrow</span> <span class="muControl">break-unless</span> move-to-previous-character?:boolean +<span class="CommentedCode">#? trace [app], [left arrow] #? 1</span> <span class="Comment"># if not at start of text (before-cursor at § sentinel)</span> prev:address:duplex-list<span class="Special"> <- </span>prev-duplex before-cursor:address:address:duplex-list/deref <span class="muControl">break-unless</span> prev:address:duplex-list @@ -618,6 +669,7 @@ container editor-data [ <span class="Delimiter">{</span> at-left-margin?:boolean<span class="Special"> <- </span>equal cursor-column:address:number/deref, <span class="Constant">0:literal</span> <span class="muControl">break-if</span> at-left-margin?:boolean +<span class="CommentedCode">#? trace [app], [decrementing] #? 1</span> cursor-column:address:number/deref<span class="Special"> <- </span>subtract cursor-column:address:number/deref, <span class="Constant">1:literal</span> <span class="muControl">reply</span> <span class="Delimiter">}</span> @@ -628,6 +680,7 @@ container editor-data [ prevc:character<span class="Special"> <- </span>get before-cursor:address:address:duplex-list/deref/deref, value:offset previous-character-is-newline?:boolean<span class="Special"> <- </span>equal prevc:character, <span class="Constant">10:literal/newline</span> <span class="muControl">break-unless</span> previous-character-is-newline?:boolean +<span class="CommentedCode">#? trace [app], [previous line] #? 1</span> <span class="Comment"># compute length of previous line</span> end-of-line:number<span class="Special"> <- </span>previous-line-length before-cursor:address:address:duplex-list/deref, d:address:duplex-list cursor-row:address:number/deref<span class="Special"> <- </span>subtract cursor-row:address:number/deref, <span class="Constant">1:literal</span> @@ -637,7 +690,6 @@ container editor-data [ <span class="Comment"># if before-cursor is not at newline, we're just at a wrapped line</span> assert cursor-row:address:number/deref, <span class="Constant">[unimplemented: moving cursor above top of screen]</span> cursor-row:address:number/deref<span class="Special"> <- </span>subtract cursor-row:address:number/deref, <span class="Constant">1:literal</span> - right:number<span class="Special"> <- </span>get editor:address:editor-data/deref, right:offset cursor-column:address:number/deref<span class="Special"> <- </span>subtract right:number, <span class="Constant">1:literal</span> <span class="Comment"># leave room for wrap icon</span> <span class="Delimiter">}</span> <span class="Comment"># down arrow</span> @@ -657,7 +709,7 @@ container editor-data [ move-to-previous-line?:boolean<span class="Special"> <- </span>equal k:address:number/deref, <span class="Constant">65517:literal/up-arrow</span> <span class="muControl">break-unless</span> move-to-previous-line?:boolean <span class="Comment"># todo: support scrolling</span> - already-at-top?:boolean<span class="Special"> <- </span>lesser-or-equal cursor-row:address:number/deref, top:number + already-at-top?:boolean<span class="Special"> <- </span>lesser-or-equal cursor-row:address:number/deref, <span class="Constant">1:literal/top</span> <span class="muControl">break-if</span> already-at-top?:boolean <span class="CommentedCode">#? $print [moving up</span> <span class="CommentedCode">#? ] #? 1</span> @@ -666,58 +718,58 @@ container editor-data [ <span class="Delimiter">}</span> ] +<span class="Comment"># process click, return if it was on current editor</span> +<span class="Comment"># todo: ignores menu bar (for now just displays shortcuts)</span> <span class="muRecipe">recipe</span> move-cursor-in-editor [ <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> t:touch-event<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - <span class="Comment"># always reset focus to start</span> - in-focus?:address:boolean<span class="Special"> <- </span>get-address editor:address:editor-data/deref, in-focus?:offset - in-focus?:address:boolean/deref<span class="Special"> <- </span>copy <span class="Constant">0:literal/true</span> + <span class="muControl">reply-unless</span> editor:address:editor-data, <span class="Constant">0:literal/false</span> click-column:number<span class="Special"> <- </span>get t:touch-event, column:offset left:number<span class="Special"> <- </span>get editor:address:editor-data/deref, left:offset too-far-left?:boolean<span class="Special"> <- </span>lesser-than click-column:number, left:number - <span class="muControl">reply-if</span> too-far-left?:boolean + <span class="muControl">reply-if</span> too-far-left?:boolean, <span class="Constant">0:literal/false</span> right:number<span class="Special"> <- </span>get editor:address:editor-data/deref, right:offset too-far-right?:boolean<span class="Special"> <- </span>greater-than click-column:number, right:number - <span class="muControl">reply-if</span> too-far-right?:boolean -<span class="CommentedCode">#? $print [focus now at ], editor:address:editor-data, [ </span> -<span class="CommentedCode">#? ] #? 2</span> - <span class="Comment"># click on this window; gain focus</span> - in-focus?:address:boolean/deref<span class="Special"> <- </span>copy <span class="Constant">1:literal/true</span> + <span class="muControl">reply-if</span> too-far-right?:boolean, <span class="Constant">0:literal/false</span> <span class="Comment"># update cursor</span> cursor-row:address:number<span class="Special"> <- </span>get-address editor:address:editor-data/deref, cursor-row:offset cursor-row:address:number/deref<span class="Special"> <- </span>get t:touch-event, row:offset cursor-column:address:number<span class="Special"> <- </span>get-address editor:address:editor-data/deref, cursor-column:offset cursor-column:address:number/deref<span class="Special"> <- </span>get t:touch-event, column:offset -<span class="CommentedCode">#? $print [column is at: ], cursor-column:address:number, [ </span> -<span class="CommentedCode">#? ] #? 1</span> + render screen:address, editor:address:editor-data + <span class="Comment"># gain focus</span> + <span class="muControl">reply</span> <span class="Constant">1:literal/true</span> ] <span class="muRecipe">recipe</span> insert-at-cursor [ <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> c:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="CommentedCode">#? $print [insert ], c:character, [ </span> <span class="CommentedCode">#? ] #? 1</span> before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address editor:address:editor-data/deref, before-cursor:offset d:address:duplex-list<span class="Special"> <- </span>get editor:address:editor-data/deref, data:offset insert-duplex c:character, before-cursor:address:address:duplex-list/deref - screen:address<span class="Special"> <- </span>get editor:address:editor-data/deref, screen:offset + before-cursor:address:address:duplex-list/deref<span class="Special"> <- </span>next-duplex before-cursor:address:address:duplex-list/deref cursor-row:address:number<span class="Special"> <- </span>get-address editor:address:editor-data/deref, cursor-row:offset cursor-column:address:number<span class="Special"> <- </span>get-address editor:address:editor-data/deref, cursor-column:offset + left:number<span class="Special"> <- </span>get editor:address:editor-data/deref, left:offset + right:number<span class="Special"> <- </span>get editor:address:editor-data/deref, right:offset <span class="Comment"># update cursor: if newline, move cursor to start of next line</span> <span class="Comment"># todo: bottom of screen</span> <span class="Delimiter">{</span> newline?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">10:literal/newline</span> <span class="muControl">break-unless</span> newline?:boolean cursor-row:address:number/deref<span class="Special"> <- </span>add cursor-row:address:number/deref, <span class="Constant">1:literal</span> - cursor-column:address:number/deref<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> + cursor-column:address:number/deref<span class="Special"> <- </span>copy left:number <span class="muControl">reply</span> <span class="Delimiter">}</span> <span class="Comment"># if the line wraps at the cursor, move cursor to start of next row</span> <span class="Delimiter">{</span> <span class="Comment"># if we're at the column just before the wrap indicator</span> - right:number<span class="Special"> <- </span>get editor:address:editor-data/deref, right:offset wrap-column:number<span class="Special"> <- </span>subtract right:number, <span class="Constant">1:literal</span> <span class="CommentedCode">#? $print [wrap? ], cursor-column:address:number/deref, [ vs ], wrap-column:number, [ </span> <span class="CommentedCode">#? ] #? 1</span> @@ -782,24 +834,116 @@ container editor-data [ <span class="muControl">reply</span> result:number ] +<span class="muRecipe">recipe</span> render-all [ + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">40:literal</span> + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + env:address:programming-environment-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + recipes:address:editor-data<span class="Special"> <- </span>get env:address:programming-environment-data/deref, recipes:offset + current-sandbox:address:editor-data<span class="Special"> <- </span>get env:address:programming-environment-data/deref, current-sandbox:offset + sandbox-in-focus?:boolean<span class="Special"> <- </span>get env:address:programming-environment-data/deref, sandbox-in-focus?:offset + <span class="Comment"># render recipes, along with any warnings</span> + left:number<span class="Special"> <- </span>get recipes:address:editor-data/deref, left:offset + right:number<span class="Special"> <- </span>get recipes:address:editor-data/deref, right:offset + row:number, screen:address<span class="Special"> <- </span>render screen:address, recipes:address:editor-data + recipe-warnings:address:array:character<span class="Special"> <- </span>get env:address:programming-environment-data/deref, recipe-warnings:offset + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> recipe-warnings:address:array:character + row:number, screen:address<span class="Special"> <- </span>render-string screen:address, recipe-warnings:address:array:character, left:number, right:number, <span class="Constant">1:literal/red</span>, row:number + <span class="Delimiter">}</span> + <span class="Delimiter">{</span> + <span class="Comment"># no warnings? move to next lin</span> + <span class="muControl">break-if</span> recipe-warnings:address:array:character + row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> + <span class="Delimiter">}</span> + <span class="Comment"># draw dotted line after recipes</span> + draw-horizontal screen:address, row:number, left:number, right:number, <span class="Constant">9480:literal/horizontal-dotted</span> + <span class="Comment"># clear next line, in case we just processed a backspace</span> + row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> + move-cursor screen:address, row:number, left:number + clear-line-delimited screen:address, left:number, right:number + <span class="Comment"># render sandboxes along with warnings for each</span> + left:number<span class="Special"> <- </span>get current-sandbox:address:editor-data/deref, left:offset + right:number<span class="Special"> <- </span>get current-sandbox:address:editor-data/deref, right:offset + row:number, screen:address<span class="Special"> <- </span>render screen:address, current-sandbox:address:editor-data + row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> + draw-horizontal screen:address, row:number, left:number, right:number, <span class="Constant">9473:literal/horizontal-double</span> + sandbox:address:sandbox-data<span class="Special"> <- </span>get env:address:programming-environment-data/deref, sandbox:offset + row:number, screen:address<span class="Special"> <- </span>render-sandboxes screen:address, sandbox:address:sandbox-data, left:number, right:number, row:number + <span class="Comment"># clear next line, in case we just processed a backspace</span> + row:number<span class="Special"> <- </span>add row:number, <span class="Constant">1:literal</span> + move-cursor screen:address, row:number, left:number + clear-line-delimited screen:address, left:number, right:number + update-cursor screen:address, recipes:address:editor-data, current-sandbox:address:editor-data, sandbox-in-focus?:boolean + show-screen screen:address + <span class="muControl">reply</span> screen:address/same-as-ingredient:0 +] + +<span class="muRecipe">recipe</span> render-sandboxes [ + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">40:literal</span> + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + sandbox:address:sandbox-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + left:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + right:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + row:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="muControl">reply-unless</span> sandbox:address:sandbox-data, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 + screen-height:number<span class="Special"> <- </span>screen-width screen:address + at-bottom?:boolean<span class="Special"> <- </span>greater-or-equal row:number screen-height:number + <span class="muControl">reply-if</span> at-bottom?:boolean, row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 + <span class="Comment"># render sandbox contents</span> + sandbox-data:address:array:character<span class="Special"> <- </span>get sandbox:address:sandbox-data/deref, data:offset + row:number, screen:address<span class="Special"> <- </span>render-string screen:address, sandbox-data:address:array:character, left:number, right:number, <span class="Constant">7:literal/white</span>, row:number + <span class="Comment"># render sandbox warnings or response, in that order</span> + sandbox-response:address:array:character<span class="Special"> <- </span>get sandbox:address:sandbox-data/deref, response:offset + sandbox-warnings:address:array:character<span class="Special"> <- </span>get sandbox:address:sandbox-data/deref, warnings:offset + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> sandbox-warnings:address:array:character + row:number, screen:address<span class="Special"> <- </span>render-string screen:address, sandbox-warnings:address:array:character, left:number, right:number, <span class="Constant">1:literal/red</span>, row:number + <span class="Delimiter">}</span> + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> sandbox-warnings:address:array:character + row:number, screen:address<span class="Special"> <- </span>render-string screen:address, sandbox-response:address:array:character, left:number, right:number, <span class="Constant">245:literal/grey</span>, row:number + <span class="Delimiter">}</span> + <span class="Comment"># draw solid line after sandbox</span> + draw-horizontal screen:address, row:number, left:number, right:number, <span class="Constant">9473:literal/horizontal-double</span> + <span class="Comment"># draw next sandbox</span> + next-sandbox:address:sandbox-data<span class="Special"> <- </span>get sandbox:address:sandbox-data/deref, next-sandbox:offset + row:number, screen:address<span class="Special"> <- </span>render-sandboxes screen:address, next-sandbox:address:sandbox-data, left:number, right:number, row:number + <span class="muControl">reply</span> row:number/same-as-ingredient:4, screen:address/same-as-ingredient:0 +] + +<span class="muRecipe">recipe</span> update-cursor [ + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">40:literal</span> + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + recipes:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + current-sandbox:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + sandbox-in-focus?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> sandbox-in-focus?:boolean +<span class="CommentedCode">#? $print [recipes in focus</span> +<span class="CommentedCode">#? ] #? 1</span> + cursor-row:number<span class="Special"> <- </span>get recipes:address:editor-data/deref, cursor-row:offset + cursor-column:number<span class="Special"> <- </span>get recipes:address:editor-data/deref, cursor-column:offset + <span class="Delimiter">}</span> + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> sandbox-in-focus?:boolean +<span class="CommentedCode">#? $print [sandboxes in focus</span> +<span class="CommentedCode">#? ] #? 1</span> + cursor-row:number<span class="Special"> <- </span>get current-sandbox:address:editor-data/deref, cursor-row:offset + cursor-column:number<span class="Special"> <- </span>get current-sandbox:address:editor-data/deref, cursor-column:offset + <span class="Delimiter">}</span> + move-cursor screen:address, cursor-row:number, cursor-column:number +] + <span class="muScenario">scenario</span> editor-handles-empty-event-queue [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> -<span class="CommentedCode">#? 3:number <- get screen:address/deref, num-rows:offset #? 1</span> -<span class="CommentedCode">#? $print [0: ], screen:address, [: ], 3:number, [ </span> -<span class="CommentedCode">#? ] #? 1</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> -<span class="CommentedCode">#? $print [1: ], screen:address, [ </span> -<span class="CommentedCode">#? ] #? 1</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console <span class="Constant">[]</span> -<span class="CommentedCode">#? $print [8: ], screen:address, [ </span> -<span class="CommentedCode">#? ] #? 1</span> run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] -<span class="CommentedCode">#? $print [9: ], screen:address, [ </span> -<span class="CommentedCode">#? ] #? 1</span> screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> . .</span> ] @@ -808,21 +952,22 @@ container editor-data [ <span class="muScenario">scenario</span> editor-handles-mouse-clicks [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 0, 1 <span class="Comment"># on the 'b'</span> + left-click 1, 1 <span class="Comment"># on the 'b'</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> . .</span> ] memory-should-contain [ - 3<span class="Special"> <- </span>0 <span class="Comment"># cursor is at row 0..</span> + 3<span class="Special"> <- </span>1 <span class="Comment"># cursor is at row 0..</span> 4<span class="Special"> <- </span>1 <span class="Comment"># ..and column 1</span> ] ] @@ -830,17 +975,17 @@ container editor-data [ <span class="muScenario">scenario</span> editor-handles-mouse-clicks-outside-text [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 0, 7 <span class="Comment"># last line, to the right of text</span> + left-click 1, 7 <span class="Comment"># last line, to the right of text</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] memory-should-contain [ - 3<span class="Special"> <- </span>0 <span class="Comment"># cursor row</span> + 3<span class="Special"> <- </span>1 <span class="Comment"># cursor row</span> 4<span class="Special"> <- </span>3 <span class="Comment"># cursor column</span> ] ] @@ -849,17 +994,17 @@ container editor-data [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">def]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 0, 7 <span class="Comment"># interior line, to the right of text</span> + left-click 1, 7 <span class="Comment"># interior line, to the right of text</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] memory-should-contain [ - 3<span class="Special"> <- </span>0 <span class="Comment"># cursor row</span> + 3<span class="Special"> <- </span>1 <span class="Comment"># cursor row</span> 4<span class="Special"> <- </span>3 <span class="Comment"># cursor column</span> ] ] @@ -868,17 +1013,17 @@ container editor-data [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">def]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 2, 7 <span class="Comment"># below text</span> + left-click 3, 7 <span class="Comment"># below text</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] memory-should-contain [ - 3<span class="Special"> <- </span>1 <span class="Comment"># cursor row</span> + 3<span class="Special"> <- </span>2 <span class="Comment"># cursor row</span> 4<span class="Special"> <- </span>3 <span class="Comment"># cursor column</span> ] ] @@ -887,22 +1032,23 @@ container editor-data [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> <span class="Comment"># editor occupies only left half of screen</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> assume-console [ <span class="Comment"># click on right half of screen</span> left-click 3, 8 ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> . .</span> ] memory-should-contain [ - 3<span class="Special"> <- </span>0 <span class="Comment"># no change to cursor row</span> + 3<span class="Special"> <- </span>1 <span class="Comment"># no change to cursor row</span> 4<span class="Special"> <- </span>0 <span class="Comment"># ..or column</span> ] ] @@ -910,14 +1056,15 @@ container editor-data [ <span class="muScenario">scenario</span> editor-inserts-characters-into-empty-editor [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> assume-console [ type <span class="Constant">[abc]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> . .</span> ] @@ -926,16 +1073,17 @@ container editor-data [ <span class="muScenario">scenario</span> editor-inserts-characters-at-cursor [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ type <span class="Constant">[0]</span> - left-click 0, 2 + left-click 1, 2 type <span class="Constant">[d]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .0adbc .</span> <span class="Constant"> . .</span> ] @@ -944,15 +1092,16 @@ container editor-data [ <span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-2 [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 0, 5 <span class="Comment"># right of last line</span> + left-click 1, 5 <span class="Comment"># right of last line</span> type <span class="Constant">[d]</span> <span class="Comment"># should append</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abcd .</span> <span class="Constant"> . .</span> ] @@ -961,15 +1110,16 @@ container editor-data [ <span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-3 [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ left-click 3, 5 <span class="Comment"># below all text</span> type <span class="Constant">[d]</span> <span class="Comment"># should append</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abcd .</span> <span class="Constant"> . .</span> ] @@ -979,15 +1129,16 @@ container editor-data [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">d]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ left-click 3, 5 <span class="Comment"># below all text</span> type <span class="Constant">[e]</span> <span class="Comment"># should append</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> .de .</span> <span class="Constant"> . .</span> @@ -998,61 +1149,38 @@ container editor-data [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">d]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ left-click 3, 5 <span class="Comment"># below all text</span> type <span class="Constant">[ef]</span> <span class="Comment"># should append multiple characters in order</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> .def .</span> <span class="Constant"> . .</span> ] ] -<span class="muScenario">scenario</span> editor-inserts-characters-at-cursor-6 [ - assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> - <span class="Comment"># text fills line</span> - 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcde]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> - <span class="Comment"># position cursor at end</span> - assume-console [ - left-click 3, 0 - ] - run [ - event-loop screen:address, console:address, 2:address:editor-data - 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset - 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset - ] - <span class="Comment"># text shouldn't wrap</span> - screen-should-contain [ - <span class="Constant"> .abcde .</span> - <span class="Constant"> . .</span> - ] - <span class="Comment"># cursor should wrap</span> - memory-should-contain [ - 3<span class="Special"> <- </span>1 - 4<span class="Special"> <- </span>0 - ] -] - <span class="muScenario">scenario</span> editor-wraps-line-on-insert [ - assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">3:literal/height</span> - 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcd]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + assume-screen <span class="Constant">5:literal/width</span>, <span class="Constant">5:literal/height</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> <span class="Comment"># type a letter</span> assume-console [ type <span class="Constant">[e]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] <span class="Comment"># no wrap yet</span> screen-should-contain [ -<span class="Constant"> .eabcd.</span> + <span class="Constant"> . .</span> + <span class="Constant"> .eabc .</span> + <span class="Constant"> . .</span> <span class="Constant"> . .</span> ] <span class="Comment"># type a second letter</span> @@ -1060,28 +1188,30 @@ container editor-data [ type <span class="Constant">[f]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] <span class="Comment"># now wrap</span> screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .efab↩.</span> - <span class="Constant"> .cd .</span> + <span class="Constant"> .c .</span> <span class="Constant"> . .</span> ] ] <span class="muScenario">scenario</span> editor-moves-cursor-after-inserting-characters [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> - 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ab]</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> assume-console [ type <span class="Constant">[01]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ - <span class="Constant"> .01abc .</span> + <span class="Constant"> . .</span> + <span class="Constant"> .01ab .</span> <span class="Constant"> . .</span> ] ] @@ -1089,23 +1219,24 @@ container editor-data [ <span class="muScenario">scenario</span> editor-wraps-cursor-after-inserting-characters [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcde]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> assume-console [ - left-click 0, 4 <span class="Comment"># line is full; no wrap icon yet</span> + left-click 1, 4 <span class="Comment"># line is full; no wrap icon yet</span> type <span class="Constant">[f]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abcd↩ .</span> <span class="Constant"> .fe .</span> <span class="Constant"> . .</span> ] memory-should-contain [ - 3<span class="Special"> <- </span>1 <span class="Comment"># cursor row</span> + 3<span class="Special"> <- </span>2 <span class="Comment"># cursor row</span> 4<span class="Special"> <- </span>1 <span class="Comment"># cursor column</span> ] ] @@ -1113,23 +1244,24 @@ container editor-data [ <span class="muScenario">scenario</span> editor-wraps-cursor-after-inserting-characters-2 [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcde]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> assume-console [ - left-click 0, 3 <span class="Comment"># right before the wrap icon</span> + left-click 1, 3 <span class="Comment"># right before the wrap icon</span> type <span class="Constant">[f]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abcf↩ .</span> <span class="Constant"> .de .</span> <span class="Constant"> . .</span> ] memory-should-contain [ - 3<span class="Special"> <- </span>1 <span class="Comment"># cursor row</span> + 3<span class="Special"> <- </span>2 <span class="Comment"># cursor row</span> 4<span class="Special"> <- </span>0 <span class="Comment"># cursor column</span> ] ] @@ -1137,66 +1269,92 @@ container editor-data [ <span class="muScenario">scenario</span> editor-moves-cursor-down-after-inserting-newline [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ type <span class="Constant">[0</span> <span class="Constant">1]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .0 .</span> <span class="Constant"> .1abc .</span> <span class="Constant"> . .</span> ] ] +<span class="muScenario">scenario</span> editor-moves-cursor-down-after-inserting-newline-2 [ + assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">1:literal/left</span>, <span class="Constant">10:literal/right</span> + assume-console [ + type <span class="Constant">[0</span> +<span class="Constant">1]</span> + ] + run [ + editor-event-loop screen:address, console:address, 2:address:editor-data + ] + screen-should-contain [ + <span class="Constant"> . .</span> + <span class="Constant"> . 0 .</span> + <span class="Constant"> . 1abc .</span> + <span class="Constant"> . .</span> + ] +] + <span class="muScenario">scenario</span> editor-clears-previous-line-completely-after-inserting-newline [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcde]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> <span class="Comment"># press just a 'newline'</span> assume-console [ type [ ] ] + screen-should-contain [ + <span class="Constant"> . .</span> + <span class="Constant"> .abcd↩ .</span> + <span class="Constant"> .e .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] <span class="Comment"># line should be fully cleared</span> screen-should-contain [ <span class="Constant"> . .</span> - <span class="Constant"> .abcde .</span> + <span class="Constant"> . .</span> + <span class="Constant"> .abcd↩ .</span> + <span class="Constant"> .e .</span> <span class="Constant"> . .</span> ] ] <span class="muScenario">scenario</span> editor-handles-backspace-key [ -<span class="CommentedCode">#? $print [=== new test</span> -<span class="CommentedCode">#? ] #? 1</span> assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> -<span class="CommentedCode">#? $print [editor: ], 2:address:editor-data, [ </span> -<span class="CommentedCode">#? ] #? 1</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 0, 1 + left-click 1, 1 type <span class="Constant">[«]</span> ] 3:event/backspace<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> replace-in-console <span class="Constant">171:literal/«</span>, 3:event/backspace run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 5:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .bc .</span> <span class="Constant"> . .</span> ] memory-should-contain [ - 4<span class="Special"> <- </span>0 + 4<span class="Special"> <- </span>1 5<span class="Special"> <- </span>0 ] ] @@ -1204,87 +1362,71 @@ container editor-data [ <span class="muScenario">scenario</span> editor-clears-last-line-on-backspace [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> <span class="Comment"># just one character in final line</span> - 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> -<span class="Constant">d]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ab</span> +<span class="Constant">cd]</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> assume-console [ - left-click 1, 0 <span class="Comment"># cursor at only character in final line</span> + left-click 2, 0 <span class="Comment"># cursor at only character in final line</span> type <span class="Constant">[«]</span> ] 3:event/backspace<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> replace-in-console <span class="Constant">171:literal/«</span>, 3:event/backspace run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abcd .</span> <span class="Constant"> . .</span> ] ] -<span class="muScenario">scenario</span> editor-handles-backspace-key-at-right-margin [ +<span class="muScenario">scenario</span> editor-moves-cursor-right-with-key [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> - <span class="Comment"># fill a line with text</span> - 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcde]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> - <span class="Comment"># position cursor at end</span> - assume-console [ - left-click 1, 3 <span class="Comment"># at end of text</span> - ] - run [ - event-loop screen:address, console:address, 2:address:editor-data - 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset - 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset - ] - <span class="Comment"># check that cursor wraps to next line</span> - memory-should-contain [ - 3<span class="Special"> <- </span>1 - 4<span class="Special"> <- </span>0 - ] - <span class="Comment"># now hit a backspace key</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - type <span class="Constant">[«]</span> + press 65514 <span class="Comment"># right arrow</span> + type <span class="Constant">[0]</span> ] - 5:event/backspace<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, 5:event/backspace run [ - event-loop screen:address, console:address, 2:address:editor-data - 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset - 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset - ] - <span class="Comment"># cursor unwraps</span> - memory-should-contain [ - 3<span class="Special"> <- </span>0 - 4<span class="Special"> <- </span>4 + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ - <span class="Constant"> .abcd .</span> + <span class="Constant"> . .</span> + <span class="Constant"> .a0bc .</span> <span class="Constant"> . .</span> ] ] -<span class="muScenario">scenario</span> editor-moves-cursor-right-with-key [ +<span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> - 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> +<span class="Constant">d]</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ press 65514 <span class="Comment"># right arrow</span> + press 65514 <span class="Comment"># right arrow</span> + press 65514 <span class="Comment"># right arrow</span> + press 65514 <span class="Comment"># right arrow - next line</span> type <span class="Constant">[0]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ - <span class="Constant"> .a0bc .</span> + <span class="Constant"> . .</span> + <span class="Constant"> .abc .</span> + <span class="Constant"> .0d .</span> <span class="Constant"> . .</span> ] ] -<span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow [ +<span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow-2 [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">d]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">1:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ press 65514 <span class="Comment"># right arrow</span> press 65514 <span class="Comment"># right arrow</span> @@ -1293,11 +1435,12 @@ container editor-data [ type <span class="Constant">[0]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ - <span class="Constant"> .abc .</span> - <span class="Constant"> .0d .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . abc .</span> + <span class="Constant"> . 0d .</span> <span class="Constant"> . .</span> ] ] @@ -1305,63 +1448,84 @@ container editor-data [ <span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcdef]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> assume-console [ - left-click 0, 3 + left-click 1, 3 press 65514 <span class="Comment"># right arrow</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abcd↩ .</span> <span class="Constant"> .ef .</span> <span class="Constant"> . .</span> ] memory-should-contain [ - 3<span class="Special"> <- </span>1 + 3<span class="Special"> <- </span>2 4<span class="Special"> <- </span>0 ] ] -<span class="muScenario">scenario</span> editor-does-not-wrap-cursor-when-line-does-not-wrap [ +<span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow-2 [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> + <span class="Comment"># line just barely wrapping</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcde]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + <span class="Comment"># position cursor at last character before wrap and hit right-arrow</span> assume-console [ - left-click 0, 3 <span class="Comment"># one before right, in the last line</span> + left-click 1, 3 press 65514 <span class="Comment"># right arrow</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data + 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset + 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset + ] + memory-should-contain [ + 3<span class="Special"> <- </span>2 + 4<span class="Special"> <- </span>0 + ] + <span class="Comment"># now hit right arrow again</span> + assume-console [ + press 65514 + ] + run [ + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] memory-should-contain [ - 3<span class="Special"> <- </span>0 - 4<span class="Special"> <- </span>4 + 3<span class="Special"> <- </span>2 + 4<span class="Special"> <- </span>1 ] ] -<span class="muScenario">scenario</span> editor-does-not-wrap-cursor-when-line-does-not-wrap-2 [ +<span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow-3 [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> - 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcde</span> -<span class="Constant">f]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcdef]</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">1:literal/left</span>, <span class="Constant">6:literal/right</span> assume-console [ - left-click 0, 3 <span class="Comment"># one before right, not the last line</span> + left-click 1, 4 press 65514 <span class="Comment"># right arrow</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] + screen-should-contain [ + <span class="Constant"> . .</span> + <span class="Constant"> . abcd↩ .</span> + <span class="Constant"> . ef .</span> + <span class="Constant"> . .</span> + ] memory-should-contain [ - 3<span class="Special"> <- </span>0 - 4<span class="Special"> <- </span>4 + 3<span class="Special"> <- </span>2 + 4<span class="Special"> <- </span>1 ] ] @@ -1369,16 +1533,17 @@ container editor-data [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">d]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 0, 3 + left-click 1, 3 press 65514 <span class="Comment"># right arrow - next line</span> type <span class="Constant">[0]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> .0d .</span> <span class="Constant"> . .</span> @@ -1388,16 +1553,17 @@ container editor-data [ <span class="muScenario">scenario</span> editor-moves-cursor-left-with-key [ assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 0, 2 + left-click 1, 2 press 65515 <span class="Comment"># left arrow</span> type <span class="Constant">[0]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .a0bc .</span> <span class="Constant"> . .</span> ] @@ -1408,20 +1574,20 @@ container editor-data [ <span class="Comment"># initialize editor with two lines</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">d]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> <span class="Comment"># position cursor at start of second line (so there's no previous newline)</span> assume-console [ - left-click 1, 0 + left-click 2, 0 press 65515 <span class="Comment"># left arrow</span> - type <span class="Constant">[0]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data + 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset + 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] - screen-should-contain [ - <span class="Constant"> .abc0 .</span> - <span class="Constant"> .d .</span> - <span class="Constant"> . .</span> + memory-should-contain [ + 3<span class="Special"> <- </span>1 + 4<span class="Special"> <- </span>3 ] ] @@ -1431,18 +1597,19 @@ container editor-data [ 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">def</span> <span class="Constant">g]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> <span class="Comment"># position cursor further down (so there's a newline before the character at</span> <span class="Comment"># the cursor)</span> assume-console [ - left-click 2, 0 + left-click 3, 0 press 65515 <span class="Comment"># left arrow</span> type <span class="Constant">[0]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> .def0 .</span> <span class="Constant"> .g .</span> @@ -1455,17 +1622,18 @@ container editor-data [ 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">def</span> <span class="Constant">g]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> <span class="Comment"># position cursor at start of text</span> assume-console [ - left-click 0, 0 + left-click 1, 0 press 65515 <span class="Comment"># left arrow should have no effect</span> type <span class="Constant">[0]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .0abc .</span> <span class="Constant"> .def .</span> <span class="Constant"> .g .</span> @@ -1479,17 +1647,18 @@ container editor-data [ 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> d] - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> <span class="Comment"># position cursor right after empty line</span> assume-console [ - left-click 2, 0 + left-click 3, 0 press 65515 <span class="Comment"># left arrow</span> type <span class="Constant">[0]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data ] screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abc .</span> <span class="Constant"> .0 .</span> <span class="Constant"> .d .</span> @@ -1501,24 +1670,25 @@ d] assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> <span class="Comment"># initialize editor with text containing an empty line</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcdef]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> screen-should-contain [ + <span class="Constant"> . .</span> <span class="Constant"> .abcd↩ .</span> <span class="Constant"> .ef .</span> <span class="Constant"> . .</span> ] <span class="Comment"># position cursor right after empty line</span> assume-console [ - left-click 1, 0 + left-click 2, 0 press 65515 <span class="Comment"># left arrow</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] memory-should-contain [ - 3<span class="Special"> <- </span>0 <span class="Comment"># previous row</span> + 3<span class="Special"> <- </span>1 <span class="Comment"># previous row</span> 4<span class="Special"> <- </span>3 <span class="Comment"># end of wrapped line</span> ] ] @@ -1527,18 +1697,18 @@ d] assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">def]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 1, 1 + left-click 2, 1 press 65517 <span class="Comment"># up arrow</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] memory-should-contain [ - 3<span class="Special"> <- </span>0 + 3<span class="Special"> <- </span>1 4<span class="Special"> <- </span>1 ] ] @@ -1547,19 +1717,19 @@ d] assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">def]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> - <span class="Comment"># cursor starts out at (0, 0)</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + <span class="Comment"># cursor starts out at (1, 0)</span> assume-console [ press 65516 <span class="Comment"># down arrow</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] - <span class="Comment"># ..and ends at (1, 0)</span> + <span class="Comment"># ..and ends at (2, 0)</span> memory-should-contain [ - 3<span class="Special"> <- </span>1 + 3<span class="Special"> <- </span>2 4<span class="Special"> <- </span>0 ] ] @@ -1568,18 +1738,18 @@ d] assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ab</span> <span class="Constant">def]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 1, 3 + left-click 2, 3 press 65517 <span class="Comment"># up arrow</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] memory-should-contain [ - 3<span class="Special"> <- </span>0 + 3<span class="Special"> <- </span>1 4<span class="Special"> <- </span>2 ] ] @@ -1588,164 +1758,402 @@ d] assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc</span> <span class="Constant">de]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> assume-console [ - left-click 0, 3 + left-click 1, 3 press 65516 <span class="Comment"># down arrow</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + editor-event-loop screen:address, console:address, 2:address:editor-data 3:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset 4:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset ] memory-should-contain [ - 3<span class="Special"> <- </span>1 + 3<span class="Special"> <- </span>2 4<span class="Special"> <- </span>2 ] ] <span class="muScenario">scenario</span> point-at-multiple-editors [ - assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> - <span class="Comment"># initialize an editor covering left half of screen</span> + assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> + <span class="Comment"># initialize both halves of screen</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> - 3:address:array:character<span class="Special"> <- </span>new <span class="Constant">[def]</span> - <span class="Comment"># chain new editor to it, covering the right half of the screen</span> - 4:address:address:editor-data<span class="Special"> <- </span>get-address 2:address:editor-data/deref, next-editor:offset - 4:address:address:editor-data/deref<span class="Special"> <- </span>new-editor 3:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">5:literal/left</span>, <span class="Constant">10:literal/right</span> - <span class="Comment"># type one letter in each of them</span> + 2:address:array:character<span class="Special"> <- </span>new <span class="Constant">[def]</span> + 3:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character + <span class="Comment"># focus on both sides</span> assume-console [ - left-click 0, 1 - left-click 0, 8 + left-click 1, 1 + left-click 1, 17 ] + <span class="Comment"># check cursor column in each</span> run [ - event-loop screen:address, console:address, 2:address:editor-data - 5:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset - 6:number<span class="Special"> <- </span>get 4:address:address:editor-data/deref/deref, cursor-column:offset + event-loop screen:address, console:address, 3:address:programming-environment-data + 4:address:editor-data<span class="Special"> <- </span>get 3:address:programming-environment-data/deref, recipes:offset + 5:number<span class="Special"> <- </span>get 4:address:editor-data/deref, cursor-column:offset + 6:address:editor-data<span class="Special"> <- </span>get 3:address:programming-environment-data/deref, current-sandbox:offset + 7:number<span class="Special"> <- </span>get 6:address:editor-data/deref, cursor-column:offset ] memory-should-contain [ 5<span class="Special"> <- </span>1 - 6<span class="Special"> <- </span>8 + 7<span class="Special"> <- </span>17 ] ] -<span class="muScenario">scenario</span> editors-chain-to-cover-multiple-columns [ - assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> - <span class="Comment"># initialize an editor covering left half of screen</span> +<span class="muScenario">scenario</span> edit-multiple-editors [ + assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> + <span class="Comment"># initialize both halves of screen</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> - 3:address:array:character<span class="Special"> <- </span>new <span class="Constant">[def]</span> - <span class="Comment"># chain new editor to it, covering the right half of the screen</span> - 4:address:address:editor-data<span class="Special"> <- </span>get-address 2:address:editor-data/deref, next-editor:offset - 4:address:address:editor-data/deref<span class="Special"> <- </span>new-editor 3:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">5:literal/left</span>, <span class="Constant">10:literal/right</span> - reset-focus 2:address:editor-data + 2:address:array:character<span class="Special"> <- </span>new <span class="Constant">[def]</span> + 3:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character <span class="Comment"># type one letter in each of them</span> assume-console [ - left-click 0, 1 + left-click 1, 1 type <span class="Constant">[0]</span> - left-click 0, 6 + left-click 1, 17 type <span class="Constant">[1]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data - 5:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset - 6:number<span class="Special"> <- </span>get 4:address:address:editor-data/deref/deref, cursor-column:offset + event-loop screen:address, console:address, 3:address:programming-environment-data + 4:address:editor-data<span class="Special"> <- </span>get 3:address:programming-environment-data/deref, recipes:offset + 5:number<span class="Special"> <- </span>get 4:address:editor-data/deref, cursor-column:offset + 6:address:editor-data<span class="Special"> <- </span>get 3:address:programming-environment-data/deref, current-sandbox:offset + 7:number<span class="Special"> <- </span>get 6:address:editor-data/deref, cursor-column:offset ] screen-should-contain [ - <span class="Constant"> .a0bc d1ef .</span> - <span class="Constant"> . .</span> + <span class="Constant"> . run (F10) . # this line has a different background, but we don't test that yet</span> + <span class="Constant"> .a0bc ┊d1ef .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> ] memory-should-contain [ - 5<span class="Special"> <- </span>2 - 6<span class="Special"> <- </span>7 + 5<span class="Special"> <- </span>2 <span class="Comment"># cursor column of recipe editor</span> + 7<span class="Special"> <- </span>18 <span class="Comment"># cursor column of sandbox editor</span> ] <span class="Comment"># show the cursor at the right window</span> run [ screen:address<span class="Special"> <- </span>print-character screen:address, <span class="Constant">9251:literal/␣</span> ] screen-should-contain [ - <span class="Constant"> .a0bc d1␣f .</span> - <span class="Constant"> . .</span> + <span class="Constant"> . run (F10) .</span> + <span class="Constant"> .a0bc ┊d1␣f .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> ] ] <span class="muScenario">scenario</span> multiple-editors-cover-only-their-own-areas [ - assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> + assume-screen <span class="Constant">60:literal/width</span>, <span class="Constant">10:literal/height</span> run [ - <span class="Comment"># draw a divider</span> - draw-vertical screen:address, <span class="Constant">5:literal/divider</span>, <span class="Constant">0:literal/top</span>, <span class="Constant">5:literal/height</span> - <span class="Comment"># initialize editors on both sides of it and chain the two</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> - 3:address:array:character<span class="Special"> <- </span>new <span class="Constant">[def]</span> - 4:address:address:editor-data<span class="Special"> <- </span>get-address 2:address:editor-data/deref, next-editor:offset - 4:address:address:editor-data/deref<span class="Special"> <- </span>new-editor 3:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">6:literal/left</span>, <span class="Constant">10:literal/right</span> + 2:address:array:character<span class="Special"> <- </span>new <span class="Constant">[def]</span> + 3:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character ] <span class="Comment"># divider isn't messed up</span> screen-should-contain [ - <span class="Constant"> .abc │def .</span> - <span class="Constant"> . │ .</span> - <span class="Constant"> . │ .</span> - <span class="Constant"> . │ .</span> - <span class="Constant"> . │ .</span> + <span class="Constant"> . run (F10) .</span> + <span class="Constant"> .abc ┊def .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> . ┊ .</span> ] ] <span class="muScenario">scenario</span> editor-in-focus-keeps-cursor [ - assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> - <span class="Comment"># initialize an editor covering left half of screen</span> + assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">0:literal/left</span>, <span class="Constant">5:literal/right</span> - 3:address:array:character<span class="Special"> <- </span>new <span class="Constant">[def]</span> - <span class="Comment"># chain new editor to it, covering the right half of the screen</span> - 4:address:address:editor-data<span class="Special"> <- </span>get-address 2:address:editor-data/deref, next-editor:offset - 4:address:address:editor-data/deref<span class="Special"> <- </span>new-editor 3:address:array:character, screen:address, <span class="Constant">0:literal/top</span>, <span class="Constant">5:literal/left</span>, <span class="Constant">10:literal/right</span> - <span class="Comment"># initialize cursor</span> + 2:address:array:character<span class="Special"> <- </span>new <span class="Constant">[def]</span> + <span class="Comment"># initialize programming environment and highlight cursor</span> + assume-console <span class="Constant">[]</span> run [ - reset-focus 2:address:editor-data - 5:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-row:offset - 6:number<span class="Special"> <- </span>get 2:address:editor-data/deref, cursor-column:offset - move-cursor screen:address, 5:number, 6:number + 3:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character + event-loop screen:address, console:address, 3:address:programming-environment-data screen:address<span class="Special"> <- </span>print-character screen:address, <span class="Constant">9251:literal/␣</span> ] - <span class="Comment"># is it at the right place?</span> + <span class="Comment"># is cursor at the right place?</span> screen-should-contain [ - <span class="Constant"> .␣bc def .</span> - <span class="Constant"> . .</span> + <span class="Constant"> . run (F10) .</span> + <span class="Constant"> .␣bc ┊def .</span> +<span class="Comment"># artifact of fake console: no events = no render</span> +<span class="Comment"># .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> ] <span class="Comment"># now try typing a letter</span> assume-console [ type <span class="Constant">[z]</span> ] run [ - event-loop screen:address, console:address, 2:address:editor-data + 3:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character + event-loop screen:address, console:address, 3:address:programming-environment-data screen:address<span class="Special"> <- </span>print-character screen:address, <span class="Constant">9251:literal/␣</span> ] <span class="Comment"># cursor should still be right</span> screen-should-contain [ - <span class="Constant"> .z␣bc def .</span> - <span class="Constant"> . .</span> + <span class="Constant"> . run (F10) .</span> + <span class="Constant"> .z␣bc ┊def .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] +] + +<span class="SalientComment">## Running code from the editors</span> + +container sandbox-data [ + data:address:array:character + response:address:array:character + warnings:address:array:character + next-sandbox:address:sandbox-data +] + +<span class="muScenario">scenario</span> run-and-show-results [ + $close-trace <span class="Comment"># trace too long for github</span> + assume-screen <span class="Constant">100:literal/width</span>, <span class="Constant">12:literal/height</span> + <span class="Comment"># recipe editor is empty</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[]</span> + <span class="Comment"># sandbox editor contains an instruction without storing outputs</span> + 2:address:array:character<span class="Special"> <- </span>new <span class="Constant">[divide-with-remainder 11:literal, 3:literal]</span> + 3:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character + <span class="Comment"># run the code in the editors</span> + assume-console [ + press 65526 <span class="Comment"># F10</span> + ] + run [ + event-loop screen:address, console:address, 3:address:programming-environment-data + ] + <span class="Comment"># check that screen prints the results</span> + screen-should-contain [ + <span class="Constant"> . run (F10) .</span> + <span class="Constant"> . ┊ .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊divide-with-remainder 11:literal, 3:literal .</span> + <span class="Constant"> . ┊3 .</span> + <span class="Constant"> . ┊2 .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . divide-with-remainder 11:literal, 3:literal .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + ] + screen-should-contain-in-color, <span class="Constant">245:literal/grey</span>, [ + <span class="Constant"> . .</span> + <span class="Constant"> . ┊ .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> . ┊3 .</span> + <span class="Constant"> . ┊2 .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + <span class="Comment"># run another command</span> + assume-console [ + left-click 1, 80 + type <span class="Constant">[add 2:literal, 2:literal]</span> + press 65526 <span class="Comment"># F10</span> + ] + run [ + event-loop screen:address, console:address, 3:address:programming-environment-data + ] + <span class="Comment"># check that screen prints the results</span> + screen-should-contain [ + <span class="Constant"> . run (F10) .</span> + <span class="Constant"> . ┊ .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊add 2:literal, 2:literal .</span> + <span class="Constant"> . ┊4 .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊divide-with-remainder 11:literal, 3:literal .</span> + <span class="Constant"> . ┊3 .</span> + <span class="Constant"> . ┊2 .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] +] + +<span class="muRecipe">recipe</span> run-sandboxes [ + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + env:address:programming-environment-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + recipes:address:editor-data<span class="Special"> <- </span>get env:address:programming-environment-data/deref, recipes:offset + current-sandbox:address:editor-data<span class="Special"> <- </span>get env:address:programming-environment-data/deref, current-sandbox:offset + <span class="Comment"># load code from recipe editor, save any warnings</span> + in:address:array:character<span class="Special"> <- </span>editor-contents recipes:address:editor-data + recipe-warnings:address:address:array:character<span class="Special"> <- </span>get-address env:address:programming-environment-data/deref, recipe-warnings:offset + recipe-warnings:address:address:array:character/deref<span class="Special"> <- </span>reload in:address:array:character + <span class="Comment"># check contents of right editor (sandbox)</span> + <span class="Delimiter">{</span> + sandbox-contents:address:array:character<span class="Special"> <- </span>editor-contents current-sandbox:address:editor-data + <span class="muControl">break-unless</span> sandbox-contents:address:array:character + <span class="Comment"># if contents exist, run them and turn them into a new sandbox-data</span> + new-sandbox:address:sandbox-data<span class="Special"> <- </span>new sandbox-data:type + data:address:address:array:character<span class="Special"> <- </span>get-address new-sandbox:address:sandbox-data/deref, data:offset + data:address:address:array:character/deref<span class="Special"> <- </span>copy sandbox-contents:address:array:character + <span class="Comment"># push to head of sandbox list</span> + dest:address:address:sandbox-data<span class="Special"> <- </span>get-address env:address:programming-environment-data/deref, sandbox:offset + next:address:address:sandbox-data<span class="Special"> <- </span>get-address new-sandbox:address:sandbox-data/deref, next-sandbox:offset + next:address:address:sandbox-data/deref<span class="Special"> <- </span>copy dest:address:address:sandbox-data/deref + dest:address:address:sandbox-data/deref<span class="Special"> <- </span>copy new-sandbox:address:sandbox-data + <span class="Comment"># clear sandbox editor</span> + init:address:address:duplex-list<span class="Special"> <- </span>get-address current-sandbox:address:editor-data/deref, data:offset + init:address:address:duplex-list/deref<span class="Special"> <- </span>push-duplex <span class="Constant">167:literal/§</span>, <span class="Constant">0:literal/tail</span> + <span class="Delimiter">}</span> + <span class="Comment"># rerun other sandboxes</span> + curr:address:sandbox-data<span class="Special"> <- </span>get env:address:programming-environment-data/deref, sandbox:offset + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> curr:address:sandbox-data + data:address:address:array:character<span class="Special"> <- </span>get-address curr:address:sandbox-data/deref, data:offset + response:address:address:array:character<span class="Special"> <- </span>get-address curr:address:sandbox-data/deref, response:offset + warnings:address:address:array:character<span class="Special"> <- </span>get-address curr:address:sandbox-data/deref, warnings:offset + response:address:address:array:character/deref, warnings:address:address:array:character/deref<span class="Special"> <- </span>run-interactive data:address:address:array:character/deref + curr:address:sandbox-data<span class="Special"> <- </span>get curr:address:sandbox-data/deref, next-sandbox:offset + <span class="muControl">loop</span> + <span class="Delimiter">}</span> +] + +<span class="muScenario">scenario</span> run-updates-results [ + $close-trace <span class="Comment"># trace too long for github</span> + assume-screen <span class="Constant">100:literal/width</span>, <span class="Constant">12:literal/height</span> + <span class="Comment"># define a recipe (no indent for the 'add' line below so column numbers are more obvious)</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ </span> +<span class="Constant">recipe foo [</span> +<span class="Constant">z:number <- add 2:literal, 2:literal</span> +<span class="Constant">]</span>] + <span class="Comment"># sandbox editor contains an instruction without storing outputs</span> + 2:address:array:character<span class="Special"> <- </span>new <span class="Constant">[foo]</span> + 3:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character + <span class="Comment"># run the code in the editors</span> + assume-console [ + press 65526 <span class="Comment"># F10</span> + ] + run [ + event-loop screen:address, console:address, 3:address:programming-environment-data + ] + <span class="Comment"># check that screen prints the results</span> + screen-should-contain [ + <span class="Constant"> . run (F10) .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> .z:number <- add 2:literal, 2:literal ┊foo .</span> + <span class="Constant"> .] ┊4 .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + <span class="Comment"># make a change (incrementing one of the args to 'add'), then rerun</span> + assume-console [ + left-click 3, 28 <span class="Comment"># one past the value of the second arg</span> + type <span class="Constant">[«3]</span> <span class="Comment"># replace</span> + press 65526 <span class="Comment"># F10</span> + ] + 4:event/backspace<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> + replace-in-console <span class="Constant">171:literal/«</span>, 4:event/backspace + run [ + event-loop screen:address, console:address, 3:address:programming-environment-data + ] + <span class="Comment"># check that screen updates the result on the right</span> + screen-should-contain [ + <span class="Constant"> . run (F10) .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> .z:number <- add 2:literal, 3:literal ┊foo .</span> + <span class="Constant"> .] ┊5 .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> ] ] -<span class="Comment"># set focus to first editor, reset it in later ones</span> -<span class="muRecipe">recipe</span> reset-focus [ +<span class="muScenario">scenario</span> run-instruction-and-print-warnings [ + $close-trace <span class="Comment"># trace too long for github</span> + assume-screen <span class="Constant">100:literal/width</span>, <span class="Constant">10:literal/height</span> + <span class="Comment"># left editor is empty</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[]</span> + <span class="Comment"># right editor contains an illegal instruction</span> + 2:address:array:character<span class="Special"> <- </span>new <span class="Constant">[get 1234:number, foo:offset]</span> + 3:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, 1:address:array:character, 2:address:array:character + <span class="Comment"># run the code in the editors</span> + assume-console [ + press 65526 <span class="Comment"># F10</span> + ] + run [ + event-loop screen:address, console:address, 3:address:programming-environment-data + ] + <span class="Comment"># check that screen prints error message in red</span> + screen-should-contain [ + <span class="Constant"> . run (F10) .</span> + <span class="Constant"> . ┊ .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊get 1234:number, foo:offset .</span> + <span class="Constant"> . ┊unknown element foo in container number .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . get 1234:number, foo:offset .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + ] + screen-should-contain-in-color, <span class="Constant">1:literal/red</span>, [ + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . unknown element foo in container number .</span> + <span class="Constant"> . .</span> + ] + screen-should-contain-in-color, <span class="Constant">245:literal/grey</span>, [ + <span class="Constant"> . .</span> + <span class="Constant"> . ┊ .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] +] + +<span class="muRecipe">recipe</span> editor-contents [ <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - in-focus:address:boolean<span class="Special"> <- </span>get-address editor:address:editor-data/deref, in-focus?:offset - in-focus:address:boolean/deref<span class="Special"> <- </span>copy <span class="Constant">1:literal/true</span> - e:address:editor-data<span class="Special"> <- </span>get editor:address:editor-data/deref, next-editor:offset + buf:address:buffer<span class="Special"> <- </span>new-buffer <span class="Constant">80:literal</span> + curr:address:duplex-list<span class="Special"> <- </span>get editor:address:editor-data/deref, data:offset + <span class="Comment"># skip § sentinel</span> + assert curr:address:duplex-list, <span class="Constant">[editor without data is illegal; must have at least a sentinel]</span> + curr:address:duplex-list<span class="Special"> <- </span>next-duplex curr:address:duplex-list + <span class="muControl">reply-unless</span> curr:address:duplex-list, <span class="Constant">0:literal</span> <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> e:address:editor-data -<span class="CommentedCode">#? $print [resetting focus in ], e:address:editor-data, [ </span> -<span class="CommentedCode">#? ] #? 1</span> - x:address:boolean<span class="Special"> <- </span>get-address e:address:editor-data/deref, in-focus?:offset -<span class="CommentedCode">#? $print [ at ], x:address:boolean, [ </span> -<span class="CommentedCode">#? ] #? 1</span> - x:address:boolean/deref<span class="Special"> <- </span>copy <span class="Constant">0:literal/false</span> - e:address:editor-data<span class="Special"> <- </span>get e:address:editor-data/deref, next-editor:offset + <span class="muControl">break-unless</span> curr:address:duplex-list + c:character<span class="Special"> <- </span>get curr:address:duplex-list/deref, value:offset + buffer-append buf:address:buffer, c:character + curr:address:duplex-list<span class="Special"> <- </span>next-duplex curr:address:duplex-list <span class="muControl">loop</span> <span class="Delimiter">}</span> + result:address:array:character<span class="Special"> <- </span>buffer-to-array buf:address:buffer + <span class="muControl">reply</span> result:address:array:character +] + +<span class="muScenario">scenario</span> editor-provides-edited-contents [ + assume-screen <span class="Constant">10:literal/width</span>, <span class="Constant">5:literal/height</span> + 1:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> + 2:address:editor-data<span class="Special"> <- </span>new-editor 1:address:array:character, screen:address, <span class="Constant">0:literal/left</span>, <span class="Constant">10:literal/right</span> + assume-console [ + left-click 1, 2 + type <span class="Constant">[def]</span> + ] + run [ + editor-event-loop screen:address, console:address, 2:address:editor-data + 3:address:array:character<span class="Special"> <- </span>editor-contents 2:address:editor-data + 4:array:character<span class="Special"> <- </span>copy 3:address:array:character/deref + ] + memory-should-contain [ + 4:string<span class="Special"> <- </span><span class="Constant">[abdefc]</span> + ] ] <span class="SalientComment">## helpers for drawing editor borders</span> @@ -1784,17 +2192,27 @@ d] row:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> x:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> right:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + style:character, style-found?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> style-found?:boolean + style:character<span class="Special"> <- </span>copy <span class="Constant">9472:literal/horizontal</span> + <span class="Delimiter">}</span> color:number, color-found?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="Comment"># default color to white</span> <span class="muControl">break-if</span> color-found?:boolean color:number<span class="Special"> <- </span>copy <span class="Constant">245:literal/grey</span> <span class="Delimiter">}</span> + bg-color:number, bg-color-found?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> bg-color-found?:boolean + bg-color:number<span class="Special"> <- </span>copy <span class="Constant">0:literal/black</span> + <span class="Delimiter">}</span> move-cursor screen:address, row:number, x:number <span class="Delimiter">{</span> - continue?:boolean<span class="Special"> <- </span>lesser-than x:number, right:number + continue?:boolean<span class="Special"> <- </span>lesser-or-equal x:number, right:number <span class="Comment"># right is inclusive, to match editor-data semantics</span> <span class="muControl">break-unless</span> continue?:boolean - print-character screen:address, <span class="Constant">9472:literal/horizontal</span>, color:number + print-character screen:address, style:character, color:number, bg-color:number x:number<span class="Special"> <- </span>add x:number, <span class="Constant">1:literal</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> @@ -1806,6 +2224,11 @@ d] col:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> x:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> bottom:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + style:character, style-found?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> style-found?:boolean + style:character<span class="Special"> <- </span>copy <span class="Constant">9474:literal/vertical</span> + <span class="Delimiter">}</span> color:number, color-found?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="Comment"># default color to white</span> @@ -1816,7 +2239,7 @@ d] continue?:boolean<span class="Special"> <- </span>lesser-than x:number, bottom:number <span class="muControl">break-unless</span> continue?:boolean move-cursor screen:address, x:number, col:number - print-character screen:address, <span class="Constant">9474:literal/vertical</span>, color:number + print-character screen:address, style:character, color:number x:number<span class="Special"> <- </span>add x:number, <span class="Constant">1:literal</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> @@ -1881,6 +2304,37 @@ d] move-cursor screen:address, bottom:number, right:number print-character screen:address, <span class="Constant">9496:literal/up-left</span>, color:number ] + +<span class="muRecipe">recipe</span> print-string-with-gradient-background [ + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> + x:address:screen<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + s:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + color:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + bg-color1:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + bg-color2:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + len:number<span class="Special"> <- </span>length s:address:array:character/deref + color-range:number<span class="Special"> <- </span>subtract bg-color2:number, bg-color1:number + color-quantum:number<span class="Special"> <- </span>divide color-range:number, len:number +<span class="CommentedCode">#? close-console #? 2</span> +<span class="CommentedCode">#? $print len:number, [, ], color-range:number, [, ], color-quantum:number, [ </span> +<span class="CommentedCode">#? ] #? 2</span> +<span class="CommentedCode">#? #? $exit #? 3</span> + bg-color:number<span class="Special"> <- </span>copy bg-color1:number + i:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> + <span class="Delimiter">{</span> + done?:boolean<span class="Special"> <- </span>greater-or-equal i:number, len:number + <span class="muControl">break-if</span> done?:boolean + c:character<span class="Special"> <- </span>index s:address:array:character/deref, i:number + print-character x:address:screen, c:character, color:number, bg-color:number + i:number<span class="Special"> <- </span>add i:number, <span class="Constant">1:literal</span> + bg-color:number<span class="Special"> <- </span>add bg-color:number, color-quantum:number +<span class="CommentedCode">#? $print [=> ], bg-color:number, [ </span> +<span class="CommentedCode">#? ] #? 1</span> + <span class="muControl">loop</span> + <span class="Delimiter">}</span> +<span class="CommentedCode">#? $exit #? 1</span> + <span class="muControl">reply</span> x:address:screen/same-as-ingredient:0 +] </pre> </body> </html> diff --git a/html/repl.mu.html b/html/repl.mu.html deleted file mode 100644 index 4a0f2c21..00000000 --- a/html/repl.mu.html +++ /dev/null @@ -1,876 +0,0 @@ -<!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 - repl.mu</title> -<meta name="Generator" content="Vim/7.4"> -<meta name="plugin-version" content="vim7.4_v1"> -<meta name="syntax" content="none"> -<meta name="settings" content="use_css,pre_wrap,no_foldcolumn,expand_tabs,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-family: monospace; color: #eeeeee; background-color: #080808; } -* { font-size: 1.05em; } -.muScenario { color: #00af00; } -.Delimiter { color: #a04060; } -.Comment { color: #9090ff; } -.Constant { color: #00a0a0; } -.Special { color: #ff6060; } -.CommentedCode { color: #6c6c6c; } -.muControl { color: #c0a020; } -.muRecipe { color: #ff8700; } ---> -</style> - -<script type='text/javascript'> -<!-- - ---> -</script> -</head> -<body> -<pre id='vimCodeElement'> -<span class="Comment"># interactive prompt for mu</span> - -<span class="muRecipe">recipe</span> main [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - open-console - msg:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ready! type in an instruction, then hit enter. ctrl-d exits.</span> -<span class="Constant">]</span> - <span class="Constant">0:literal/real-screen</span><span class="Special"> <- </span>print-string <span class="Constant">0:literal/real-screen</span>, msg:address:array:character, <span class="Constant">245:literal/grey</span> - <span class="Constant">0:literal/real-console</span>, <span class="Constant">0:literal/real-screen</span><span class="Special"> <- </span>color-session <span class="Constant">0:literal/real-console</span>, <span class="Constant">0:literal/real-screen</span> - close-console -] - -<span class="muRecipe">recipe</span> color-session [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - <span class="Delimiter">{</span> - inst:address:array:character, console:address, screen:address<span class="Special"> <- </span>read-instruction console:address, screen:address - <span class="muControl">break-unless</span> inst:address:array:character - run-interactive inst:address:array:character - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - <span class="muControl">reply</span> console:address/same-as-ingredient:0, screen:address/same-as-ingredient:1 -] - -<span class="Comment"># basic console input; just text and enter</span> -<span class="muScenario">scenario</span> read-instruction1 [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[x <- copy y</span> -<span class="Constant">]</span> - ] - run [ - 1:address:array:character<span class="Special"> <- </span>read-instruction console:address, screen:address - 2:address:array:character<span class="Special"> <- </span>new <span class="Constant">[=> ]</span> - print-string screen:address, 2:address:array:character - print-string screen:address, 1:address:array:character - ] - screen-should-contain [ - <span class="Constant"> .x <- copy y .</span> - <span class="Constant"> .=> x <- copy y .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .x copy y .</span> - <span class="Constant"> .=> x <- copy y .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . <- .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="Comment"># Read characters as they're typed at the console, print them to the screen,</span> -<span class="Comment"># accumulate them in a string, return the string at the end.</span> -<span class="Comment"># Most of the complexity is for the printing to screen, to highlight strings</span> -<span class="Comment"># and comments specially. Especially in the presence of backspacing.</span> -<span class="muRecipe">recipe</span> read-instruction [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">60:literal</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - result:address:buffer<span class="Special"> <- </span>new-buffer <span class="Constant">10:literal</span> <span class="Comment"># string to maybe add to</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[read-instruction]</span> - <span class="Comment"># start state machine by calling slurp-regular-characters, which will return</span> - <span class="Comment"># by calling the complete continuation</span> - complete:continuation<span class="Special"> <- </span><span class="muControl">current-continuation</span> - <span class="Comment"># If result is not empty, we've run slurp-regular-characters below, called</span> - <span class="Comment"># the continuation and so bounced back here. We're done.</span> - len:number<span class="Special"> <- </span>get result:address:buffer/deref, length:offset - completed?:boolean<span class="Special"> <- </span>greater-than len:number, <span class="Constant">0:literal</span> - <span class="muControl">jump-if</span> completed?:boolean, <span class="Constant">+completed:label</span> - <span class="Comment"># Otherwise we're just getting started.</span> - result:address:buffer, console:address, screen:address<span class="Special"> <- </span>slurp-regular-characters result:address:buffer, console:address, screen:address, complete:continuation -<span class="CommentedCode">#? $print [aaa: ], result:address:buffer #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - trace <span class="Constant">[error]</span>, <span class="Constant">[slurp-regular-characters should never return normally]</span> -<span class="Constant"> +completed</span> - result2:address:array:character<span class="Special"> <- </span>buffer-to-array result:address:buffer -<span class="CommentedCode">#? $print [bbb: ], result2:address:array:character #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[exiting read-instruction]</span> - <span class="muControl">reply</span> result2:address:array:character, console:address/same-as-ingredient:0, screen:address/same-as-ingredient:1 -] - -<span class="Comment"># read characters from the console, print them to the screen in *white*.</span> -<span class="Comment"># Transition to other routines for comments and strings.</span> -<span class="muRecipe">recipe</span> slurp-regular-characters [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - result:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - complete:continuation<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters]</span> - characters-slurped:number<span class="Special"> <- </span>copy <span class="Constant">0:literal</span> -<span class="CommentedCode">#? $run-depth #? 1</span> - <span class="Delimiter">{</span> -<span class="Constant"> +next-character</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: next]</span> -<span class="CommentedCode">#? $print [a0 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - <span class="Comment"># read character</span> - c:character, console:address found?:boolean<span class="Special"> <- </span>read-key console:address - <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span> -<span class="CommentedCode">#? print-character screen:address, c:character #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - <span class="Comment"># quit?</span> - <span class="Delimiter">{</span> -<span class="CommentedCode">#? $print [aaa] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - ctrl-d?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span> - <span class="muControl">break-unless</span> ctrl-d?:boolean -<span class="CommentedCode">#? $print [ctrl-d] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: ctrl-d]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - null?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">0:literal/null</span> - <span class="muControl">break-unless</span> null?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: null]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Comment"># comment?</span> - <span class="Delimiter">{</span> - comment?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">35:literal/hash</span> - <span class="muControl">break-unless</span> comment?:boolean - print-character screen:address, c:character, <span class="Constant">4:literal/blue</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - result:address:buffer, console:address, screen:address<span class="Special"> <- </span>slurp-comment result:address:buffer, console:address, screen:address, complete:continuation - <span class="Comment"># continue appending to this instruction, whether comment ended or was backspaced out of</span> - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># string</span> - <span class="Delimiter">{</span> - string?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">91:literal/open-bracket</span> - <span class="muControl">break-unless</span> string?:boolean - print-character screen:address, c:character, <span class="Constant">6:literal/cyan</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - result:address:buffer, _, console:address, screen:address<span class="Special"> <- </span>slurp-string result:address:buffer, console:address, screen:address, complete:continuation - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># assignment</span> - <span class="Delimiter">{</span> - assign?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">60:literal/less-than</span> - <span class="muControl">break-unless</span> assign?:boolean - print-character screen:address, c:character, <span class="Constant">1:literal/red</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[start of assignment: <]</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - result:address:buffer, console:address, screen:address<span class="Special"> <- </span>slurp-assignment result:address:buffer, console:address, screen:address, complete:continuation - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># print</span> - print-character screen:address, c:character <span class="Comment"># default color</span> - <span class="Comment"># append</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character -<span class="CommentedCode">#? $print [a1 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - <span class="Comment"># backspace? decrement and maybe return</span> - <span class="Delimiter">{</span> -<span class="CommentedCode">#? $print [a2 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - backspace?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8:literal/backspace</span> - <span class="muControl">break-unless</span> backspace?:boolean -<span class="CommentedCode">#? $print [a3 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - characters-slurped:number<span class="Special"> <- </span>subtract characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Delimiter">{</span> -<span class="CommentedCode">#? $print [a4 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - done?:boolean<span class="Special"> <- </span>lesser-or-equal characters-slurped:number, <span class="Constant">-1:literal</span> - <span class="muControl">break-unless</span> done?:boolean -<span class="CommentedCode">#? $print [a5 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: too many backspaces; returning]</span> -<span class="CommentedCode">#? $print [a6 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - <span class="muControl">reply</span> result:address:buffer, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> -<span class="CommentedCode">#? $print [a9 #? 1</span> -<span class="CommentedCode">#? ] #? 1</span> -<span class="CommentedCode">#? move-cursor-down-on-display #? 1</span> - <span class="Comment"># otherwise increment</span> - characters-slurped:number<span class="Special"> <- </span>add characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Comment"># done with this instruction?</span> - done?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">10:literal/newline</span> - <span class="muControl">break-if</span> done?:boolean - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - <span class="Comment"># newline encountered; terminate all recursive calls</span> -<span class="CommentedCode">#? xx:address:array:character <- new [completing!] #? 1</span> -<span class="CommentedCode">#? print-string screen:address, xx:address:array:character #? 1</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: newline encountered; unwinding stack]</span> - <span class="muControl">continue-from</span> complete:continuation -] - -<span class="Comment"># read characters from console, print them to screen in the comment color.</span> -<span class="Comment">#</span> -<span class="Comment"># Simpler version of slurp-regular-characters; doesn't handle comments or</span> -<span class="Comment"># strings. Tracks an extra count in case we backspace out of it</span> -<span class="muRecipe">recipe</span> slurp-comment [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - result:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - complete:continuation<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment]</span> - <span class="Comment"># use this to track when backspace should reset color</span> - characters-slurped:number<span class="Special"> <- </span>copy <span class="Constant">1:literal</span> <span class="Comment"># for the initial '#' that's already appended to result</span> - <span class="Delimiter">{</span> -<span class="Constant"> +next-character</span> - <span class="Comment"># read character</span> - c:character, console:address, found?:boolean<span class="Special"> <- </span>read-key console:address - <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span> - <span class="Comment"># quit?</span> - <span class="Delimiter">{</span> - ctrl-d?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span> - <span class="muControl">break-unless</span> ctrl-d?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment: ctrl-d]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - null?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">0:literal/null</span> - <span class="muControl">break-unless</span> null?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment: null]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Comment"># print</span> - print-character screen:address, c:character, <span class="Constant">4:literal/blue</span> - <span class="Comment"># append</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - <span class="Comment"># backspace? decrement</span> - <span class="Delimiter">{</span> - backspace?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8:literal/backspace</span> - <span class="muControl">break-unless</span> backspace?:boolean - characters-slurped:number<span class="Special"> <- </span>subtract characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Delimiter">{</span> - reset-color?:boolean<span class="Special"> <- </span>lesser-or-equal characters-slurped:number, <span class="Constant">0:literal</span> - <span class="muControl">break-unless</span> reset-color?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-comment: too many backspaces; returning]</span> - <span class="muControl">reply</span> result:address:buffer, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># otherwise increment</span> - characters-slurped:number<span class="Special"> <- </span>add characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Comment"># done with this instruction?</span> - done?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">10:literal/newline</span> - <span class="muControl">break-if</span> done?:boolean - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-regular-characters: newline encountered; unwinding stack]</span> - <span class="muControl">continue-from</span> complete:continuation -] - -<span class="Comment"># read characters from console, print them to screen in the string color and</span> -<span class="Comment"># accumulate them into a buffer.</span> -<span class="Comment">#</span> -<span class="Comment"># Version of slurp-regular-characters that:</span> -<span class="Comment"># a) doesn't handle comments</span> -<span class="Comment"># b) handles nested strings using recursive calls to itself. Tracks an extra</span> -<span class="Comment"># count in case we backspace out of it.</span> -<span class="muRecipe">recipe</span> slurp-string [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - result:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - complete:continuation<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - nested-string?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string]</span> - <span class="Comment"># use this to track when backspace should reset color</span> - characters-slurped:number<span class="Special"> <- </span>copy <span class="Constant">1:literal</span> <span class="Comment"># for the initial '[' that's already appended to result</span> - <span class="Delimiter">{</span> -<span class="Constant"> +next-character</span> - <span class="Comment"># read character</span> - c:character, console:address, found?:boolean<span class="Special"> <- </span>read-key console:address - <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span> - <span class="Comment"># quit?</span> - <span class="Delimiter">{</span> - ctrl-d?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span> - <span class="muControl">break-unless</span> ctrl-d?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: ctrl-d]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - null?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">0:literal/null</span> - <span class="muControl">break-unless</span> null?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: null]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Comment"># string</span> - <span class="Delimiter">{</span> - string?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">91:literal/open-bracket</span> - <span class="muControl">break-unless</span> string?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: open-bracket encountered; recursing]</span> - print-character screen:address, c:character, <span class="Constant">6:literal/cyan</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - <span class="Comment"># make a recursive call to handle nested strings</span> - result:address:buffer, tmp:number, console:address, screen:address<span class="Special"> <- </span>slurp-string result:address:buffer, console:address, screen:address, complete:continuation, <span class="Constant">1:literal/nested?</span> - <span class="Comment"># but if we backspace over a completed nested string, handle it in the caller</span> - characters-slurped:number<span class="Special"> <- </span>add characters-slurped:number, tmp:number, <span class="Constant">1:literal</span> <span class="Comment"># for the leading '['</span> - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># print</span> - print-character screen:address, c:character, <span class="Constant">6:literal/cyan</span> - <span class="Comment"># append</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - <span class="Comment"># backspace? decrement</span> - <span class="Delimiter">{</span> - backspace?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8:literal/backspace</span> - <span class="muControl">break-unless</span> backspace?:boolean - characters-slurped:number<span class="Special"> <- </span>subtract characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Delimiter">{</span> - reset-color?:boolean<span class="Special"> <- </span>lesser-or-equal characters-slurped:number, <span class="Constant">0:literal</span> - <span class="muControl">break-unless</span> reset-color?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: too many backspaces; returning]</span> - <span class="muControl">reply</span> result:address:buffer/same-as-ingredient:0, <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="muControl">loop</span> <span class="Constant">+next-character:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># otherwise increment</span> - characters-slurped:number<span class="Special"> <- </span>add characters-slurped:number, <span class="Constant">1:literal</span> - <span class="Comment"># done with this instruction?</span> - done?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">93:literal/close-bracket</span> - <span class="muControl">break-if</span> done?:boolean - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> nested-string?:boolean - <span class="Comment"># nested string? return like a normal recipe</span> - <span class="muControl">reply</span> result:address:buffer, characters-slurped:number, console:address, screen:address - <span class="Delimiter">}</span> - <span class="Comment"># top-level string call? recurse</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: close-bracket encountered; recursing to regular characters]</span> - result:address:buffer, console:address, screen:address<span class="Special"> <- </span>slurp-regular-characters result:address:buffer, console:address, screen:address, complete:continuation - <span class="Comment"># backspaced back into this string</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-string: backspaced back into string; restarting]</span> - <span class="muControl">jump</span> <span class="Constant">+next-character:label</span> -] - -<span class="muRecipe">recipe</span> slurp-assignment [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30:literal</span> - result:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - console:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - complete:continuation<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - <span class="Delimiter">{</span> -<span class="Constant"> +next-character</span> - <span class="Comment"># read character</span> - c:character, console:address, found?:boolean<span class="Special"> <- </span>read-key console:address - <span class="muControl">loop-unless</span> found?:boolean <span class="Constant">+next-character:label</span> - <span class="Comment"># quit?</span> - <span class="Delimiter">{</span> - ctrl-d?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">4:literal/ctrl-d/eof</span> - <span class="muControl">break-unless</span> ctrl-d?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: ctrl-d]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - null?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">0:literal/null</span> - <span class="muControl">break-unless</span> null?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: null]</span> - <span class="muControl">reply</span> <span class="Constant">0:literal</span>, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Comment"># print</span> - print-character screen:address, c:character, <span class="Constant">1:literal/red</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: saved one character]</span> - <span class="Comment"># append</span> - result:address:buffer<span class="Special"> <- </span>buffer-append result:address:buffer, c:character - <span class="Comment"># backspace? return</span> - <span class="Delimiter">{</span> - backspace?:boolean<span class="Special"> <- </span>equal c:character, <span class="Constant">8:literal/backspace</span> - <span class="muControl">break-unless</span> backspace?:boolean - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: backspace; returning]</span> - <span class="muControl">reply</span> result:address:buffer/same-as-ingredient:0, console:address/same-as-ingredient:1, screen:address/same-as-ingredient:2 - <span class="Delimiter">}</span> - <span class="Delimiter">}</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: done, recursing to regular characters]</span> - result:address:buffer, console:address, screen:address<span class="Special"> <- </span>slurp-regular-characters result:address:buffer, console:address, screen:address, complete:continuation - <span class="Comment"># backspaced back into this string</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[slurp-assignment: backspaced back into assignment; restarting]</span> - <span class="muControl">jump</span> <span class="Constant">+next-character:label</span> -] - -<span class="muScenario">scenario</span> read-instruction-color-comment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[# comment]</span> - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> .# comment .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-cancel-comment-on-backspace [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[#a««z]</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .z .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-cancel-comment-on-backspace2 [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[#ab«««z]</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .z .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-cancel-comment-on-backspace3 [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[#a«z]</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> .#z .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-stop-after-comment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - <span class="Comment"># console contains comment and then a second line</span> - assume-console [ - type <span class="Constant">[#abc</span> -<span class="Constant">3]</span> - ] - run [ - read-instruction console:address, screen:address - ] - <span class="Comment"># check that read-instruction reads just the comment</span> - screen-should-contain [ - <span class="Constant"> .#abc .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-color-string [ -<span class="CommentedCode">#? $start-tracing #? 1</span> - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc [string]</span>] - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .abc [string] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . [string] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-color-string-multiline [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc [line1</span> -<span class="Constant">line2]</span>] - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .abc [line1 .</span> - <span class="Constant"> .line2] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . [line1 .</span> - <span class="Constant"> .line2] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-color-string-and-comment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc [string]</span> <span class="Comment"># comment]</span> - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .abc [string] # comment .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> . # comment .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . [string] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-ignore-comment-inside-string [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc [string # not a comment]</span>] - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .abc [string # not a comment] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . [string # not a comment] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-ignore-string-inside-comment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc # comment [not a string]</span>] - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .abc # comment [not a string] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">4:literal/blue</span>, [ - <span class="Constant"> . # comment [not a string] .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-color-string-inside-string [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[abc [string [inner string]</span>]] - ] - run [ -<span class="CommentedCode">#? $start-tracing #? 1</span> - read-instruction console:address, screen:address -<span class="CommentedCode">#? $stop-tracing #? 1</span> -<span class="CommentedCode">#? $browse-trace #? 1</span> - ] - screen-should-contain [ - <span class="Constant"> .abc [string [inner string]] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . [string [inner string]] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .abc .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-cancel-string-on-backspace [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[(a««z]</span> <span class="Comment"># '(' is '[' and '«' is backspace</span> - ] - open-bracket:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">91:literal/open-bracket</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">40:literal/open-paren</span>, open-bracket:event - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ -<span class="CommentedCode">#? d:address:array:event <- get console:address/deref, data:offset #? 1</span> -<span class="CommentedCode">#? $print [a: ], d:address:array:event #? 1</span> -<span class="CommentedCode">#? x:number <- length d:address:array:event/deref #? 1</span> -<span class="CommentedCode">#? $print [b: ], x:number #? 1</span> - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .z .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-cancel-string-inside-string-on-backspace [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[(a[b]</span>«««b)] <span class="Comment"># '(' is '[' and '«' is backspace</span> - ] - open-bracket:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">91:literal/open-bracket</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">40:literal/open-paren</span>, open-bracket:event - close-bracket:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">93:literal/close-bracket</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">41:literal/close-paren</span>, close-bracket:event - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> .[ab] .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-backspace-back-into-string [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[[a]</span>«b] <span class="Comment"># '«' is backspace</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .\\\[ab .</span> - <span class="Constant"> . .</span> - ] -<span class="CommentedCode">#? $print [aaa] #? 1</span> - screen-should-contain-in-color <span class="Constant">6:literal/cyan</span>, [ - <span class="Constant"> .\\\[ab .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> . .</span> - <span class="Constant"> . .</span> - ] - <span class="Comment"># todo: trace sequence of events</span> - <span class="Comment"># slurp-regular-characters: [</span> - <span class="Comment"># slurp-regular-characters/slurp-string: a</span> - <span class="Comment"># slurp-regular-characters/slurp-string: ]</span> - <span class="Comment"># slurp-regular-characters/slurp-string/slurp-regular-characters: backspace</span> - <span class="Comment"># slurp-regular-characters/slurp-string: b</span> -] - -<span class="muScenario">scenario</span> read-instruction-highlight-start-of-assignment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[a <]</span> - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .a < .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . < .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .a .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-highlight-assignment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[a <- b]</span> - ] - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .a <- b .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . <- .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .a b .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-backspace-over-assignment [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[a <-«]</span> <span class="Comment"># '«' is backspace</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .a < .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . < .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .a .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-assignment-continues-after-backspace [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[a <-«-]</span> <span class="Comment"># '«' is backspace</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event -<span class="CommentedCode">#? $print [aaa] #? 1</span> - run [ - read-instruction console:address, screen:address - ] - screen-should-contain [ - <span class="Constant"> .a <- .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . <- .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .a .</span> - <span class="Constant"> . .</span> - ] -] - -<span class="muScenario">scenario</span> read-instruction-assignment-continues-after-backspace2 [ - assume-screen <span class="Constant">30:literal/width</span>, <span class="Constant">5:literal/height</span> - assume-console [ - type <span class="Constant">[a <- ««-]</span> <span class="Comment"># '«' is backspace</span> - ] - backspace:event<span class="Special"> <- </span>merge <span class="Constant">0:literal/text</span>, <span class="Constant">8:literal/backspace</span>, <span class="Constant">0:literal/dummy</span>, <span class="Constant">0:literal/dummy</span> - replace-in-console <span class="Constant">171:literal/«</span>, backspace:event - run [ - read-instruction console:address, screen:address -<span class="CommentedCode">#? $browse-trace #? 1</span> - ] - screen-should-contain [ - <span class="Constant"> .a <- .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">1:literal/red</span>, [ - <span class="Constant"> . <- .</span> - <span class="Constant"> . .</span> - ] - screen-should-contain-in-color <span class="Constant">7:literal/white</span>, [ - <span class="Constant"> .a .</span> - <span class="Constant"> . .</span> - ] -] -</pre> -</body> -</html> -<!-- vim: set foldmethod=manual : --> |