diff options
Diffstat (limited to 'html')
57 files changed, 1644 insertions, 959 deletions
diff --git a/html/001help.cc.html b/html/001help.cc.html index b7f03457..9affa16c 100644 --- a/html/001help.cc.html +++ b/html/001help.cc.html @@ -13,8 +13,8 @@ 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; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .SalientComment { color: #00ffff; } diff --git a/html/003trace.cc.html b/html/003trace.cc.html index ea09cda6..22764804 100644 --- a/html/003trace.cc.html +++ b/html/003trace.cc.html @@ -136,7 +136,7 @@ struct trace_stream <span class="Delimiter">{</span> string curr_layer<span class="Delimiter">;</span> int curr_depth<span class="Delimiter">;</span> string dump_layer<span class="Delimiter">;</span> - string collect_layer<span class="Delimiter">;</span> <span class="Comment">// if set, ignore all other layers</span> + set<string> collect_layers<span class="Delimiter">;</span> <span class="Comment">// if not empty, ignore all absent layers</span> ofstream null_stream<span class="Delimiter">;</span> <span class="Comment">// never opens a file, so writes silently fail</span> trace_stream<span class="Delimiter">()</span> :curr_stream<span class="Delimiter">(</span><span class="Constant">NULL</span><span class="Delimiter">),</span> curr_depth<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{}</span> ~trace_stream<span class="Delimiter">()</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>curr_stream<span class="Delimiter">)</span> delete curr_stream<span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -146,13 +146,21 @@ struct trace_stream <span class="Delimiter">{</span> <span class="Delimiter">}</span> ostream& stream<span class="Delimiter">(</span>int depth<span class="Delimiter">,</span> string layer<span class="Delimiter">)</span> <span class="Delimiter">{</span> - if <span class="Delimiter">(</span>!collect_layer<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> && layer != collect_layer<span class="Delimiter">)</span> <span class="Identifier">return</span> null_stream<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>!is_collecting<span class="Delimiter">(</span>layer<span class="Delimiter">))</span> <span class="Identifier">return</span> null_stream<span class="Delimiter">;</span> curr_stream = new ostringstream<span class="Delimiter">;</span> curr_layer = layer<span class="Delimiter">;</span> curr_depth = depth<span class="Delimiter">;</span> <span class="Identifier">return</span> *curr_stream<span class="Delimiter">;</span> <span class="Delimiter">}</span> + bool is_collecting<span class="Delimiter">(</span>const string& layer<span class="Delimiter">)</span> <span class="Delimiter">{</span> + <span class="Identifier">return</span> collect_layers<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> || collect_layers<span class="Delimiter">.</span>find<span class="Delimiter">(</span>layer<span class="Delimiter">)</span> != collect_layers<span class="Delimiter">.</span>end<span class="Delimiter">();</span> + <span class="Delimiter">}</span> + + bool is_narrowly_collecting<span class="Delimiter">(</span>const string& layer<span class="Delimiter">)</span> <span class="Delimiter">{</span> + <span class="Identifier">return</span> collect_layers<span class="Delimiter">.</span>find<span class="Delimiter">(</span>layer<span class="Delimiter">)</span> != collect_layers<span class="Delimiter">.</span>end<span class="Delimiter">();</span> + <span class="Delimiter">}</span> + <span class="Comment">// be sure to call this before messing with curr_stream or curr_layer</span> void newline<span class="Delimiter">()</span> <span class="Delimiter">{</span> if <span class="Delimiter">(</span>!curr_stream<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> diff --git a/html/003trace.test.cc.html b/html/003trace.test.cc.html index e800a8cc..839fb91a 100644 --- a/html/003trace.test.cc.html +++ b/html/003trace.test.cc.html @@ -13,8 +13,8 @@ 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; } -.cSpecial { color: #008000; } .Delimiter { color: #a04060; } +.cSpecial { color: #008000; } .Constant { color: #00a0a0; } .Comment { color: #9090ff; } --> diff --git a/html/010vm.cc.html b/html/010vm.cc.html index 4d1ed5fc..cb1f962b 100644 --- a/html/010vm.cc.html +++ b/html/010vm.cc.html @@ -13,8 +13,8 @@ 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; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .SalientComment { color: #00ffff; } diff --git a/html/011load.cc.html b/html/011load.cc.html index 73e924c9..97ae9cea 100644 --- a/html/011load.cc.html +++ b/html/011load.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/013literal_string.cc.html b/html/013literal_string.cc.html index b6c539cf..906c367c 100644 --- a/html/013literal_string.cc.html +++ b/html/013literal_string.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } @@ -166,11 +166,14 @@ if <span class="Delimiter">(</span>s<span class="Delimiter">.</span>at<span clas <span class="Comment">//: b) Escape newlines in the string to make it more friendly to trace().</span> <span class="Delimiter">:(after "string reagent::to_string()")</span> - if <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>empty<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> + if <span class="Delimiter">(</span>is_literal_string<span class="Delimiter">(</span>*this<span class="Delimiter">))</span> <span class="Identifier">return</span> emit_literal_string<span class="Delimiter">(</span>name<span class="Delimiter">);</span> - <span class="Delimiter">}</span> <span class="Delimiter">:(code)</span> +bool is_literal_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>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>second<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> && x<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> + string emit_literal_string<span class="Delimiter">(</span>string name<span class="Delimiter">)</span> <span class="Delimiter">{</span> size_t pos = <span class="Constant">0</span><span class="Delimiter">;</span> while <span class="Delimiter">(</span>pos != string::npos<span class="Delimiter">)</span> diff --git a/html/014literal_noninteger.cc.html b/html/014literal_noninteger.cc.html index 7235bf47..7275c135 100644 --- a/html/014literal_noninteger.cc.html +++ b/html/014literal_noninteger.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/020run.cc.html b/html/020run.cc.html index bf21779f..dbbfce8a 100644 --- a/html/020run.cc.html +++ b/html/020run.cc.html @@ -13,11 +13,11 @@ 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; } +.traceAbsent { color: #c00000; } .traceContains { color: #008000; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } -.traceAbsent { color: #c00000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } @@ -99,7 +99,7 @@ void run_current_routine<span class="Delimiter">()</span> trace<span class="Delimiter">(</span>Initial_callstack_depth+Callstack_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << end<span class="Delimiter">();</span> if <span class="Delimiter">(</span>Memory[<span class="Constant">0</span>] != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> raise << <span class="Constant">"something wrote to location 0; this should never happen</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> - <span class="Identifier">break</span><span class="Delimiter">;</span> + Memory[<span class="Constant">0</span>] = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Comment">// Read all ingredients from memory.</span> <span class="Comment">// Each ingredient loads a vector of values rather than a single value; mu</span> @@ -124,10 +124,13 @@ void run_current_routine<span class="Delimiter">()</span> cout << <span class="Constant">"not a primitive op: "</span> << current_instruction<span class="Delimiter">().</span>operation << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> - if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> < SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">))</span> + if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> < SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span> raise << SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> << <span class="Constant">" vs "</span> << SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> << <span class="Constant">": failed to write to all products! "</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << end<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>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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>i<span class="Delimiter">),</span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> + <span class="Delimiter">}</span> + else <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>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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>i<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="Delimiter">}</span> <span class="Comment">// End of Instruction</span> ++current_step_index<span class="Delimiter">();</span> @@ -169,7 +172,7 @@ if <span class="Delimiter">(</span>!Run_tests<span class="Delimiter">)</span> <s setup<span class="Delimiter">();</span> <span class="CommentedCode">//? Trace_file = "interactive"; //? 2</span> <span class="CommentedCode">//? START_TRACING_UNTIL_END_OF_SCOPE; //? 2</span> -<span class="CommentedCode">//? Trace_stream->collect_layer = "app"; //? 1</span> +<span class="CommentedCode">//? Trace_stream->collect_layer.insert("app"); //? 1</span> transform_all<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> if <span class="Delimiter">(</span>r<span class="Delimiter">)</span> run<span class="Delimiter">(</span>r<span class="Delimiter">);</span> diff --git a/html/021arithmetic.cc.html b/html/021arithmetic.cc.html index b43cb286..c3e35229 100644 --- a/html/021arithmetic.cc.html +++ b/html/021arithmetic.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } @@ -197,13 +197,13 @@ 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> + products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><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> raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": 'divide-with-remainder' requires exactly two ingredients, but got "</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <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> long long int remainder = static_cast<long long int><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> % static_cast<long long int><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> - products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span> <span class="Comment">// very large integers will lose precision</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>quotient<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>remainder<span class="Delimiter">);</span> diff --git a/html/023jump.cc.html b/html/023jump.cc.html index 472a964b..b25b74f7 100644 --- a/html/023jump.cc.html +++ b/html/023jump.cc.html @@ -13,10 +13,10 @@ 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; } +.traceAbsent { color: #c00000; } .traceContains { color: #008000; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } -.traceAbsent { color: #c00000; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/024compare.cc.html b/html/024compare.cc.html index 7944d4ff..df30ac7b 100644 --- a/html/024compare.cc.html +++ b/html/024compare.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/029tools.cc.html b/html/029tools.cc.html index 58b813e1..0f8ba6cd 100644 --- a/html/029tools.cc.html +++ b/html/029tools.cc.html @@ -14,14 +14,14 @@ 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; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } -.Identifier { color: #804000; } .CommentedCode { color: #6c6c6c; } +.Identifier { color: #804000; } --> </style> @@ -47,15 +47,22 @@ 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> - 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> - raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": 'trace' takes exactly two ingredients rather than '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> - <span class="Identifier">break</span><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>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> + string label = 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> + 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> + string message = 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>name<span class="Delimiter">;</span> + trace<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">,</span> label<span class="Delimiter">)</span> << message << end<span class="Delimiter">();</span> + <span class="Delimiter">}</span> + else 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>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> + string message = 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="CommentedCode">//? cerr << "tracing " << message << '\n'; //? 1</span> + trace<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">"app"</span><span class="Delimiter">)</span> << message << end<span class="Delimiter">();</span> + <span class="Delimiter">}</span> + else <span class="Delimiter">{</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": 'trace' takes one or two ingredients rather than '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <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> - string label = 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> - 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> - string message = 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>name<span class="Delimiter">;</span> - trace<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">,</span> label<span class="Delimiter">)</span> << message << end<span class="Delimiter">();</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -221,8 +228,8 @@ case _SYSTEM: <span class="Delimiter">{</span> raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": '$system' requires exactly one ingredient, but got none</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span class="Identifier">break</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> int status = system<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>c_str<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>status<span class="Delimiter">);</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> diff --git a/html/030container.cc.html b/html/030container.cc.html index 5d939c14..f56bcc74 100644 --- a/html/030container.cc.html +++ b/html/030container.cc.html @@ -13,11 +13,11 @@ 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; } +.traceAbsent { color: #c00000; } .traceContains { color: #008000; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } -.traceAbsent { color: #c00000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } @@ -149,6 +149,10 @@ case GET: <span class="Delimiter">{</span> <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> + if <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": tried to access location 0 in '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> + <span class="Identifier">break</span><span class="Delimiter">;</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> <span class="Delimiter">{</span> raise << current_recipe_name <span class="Delimiter">()</span> << <span class="Constant">": first ingredient of 'get' should be a container, but got "</span> << base<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> @@ -167,7 +171,6 @@ 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 << end<span class="Delimiter">();</span> if <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= SIZE<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": invalid offset "</span> << offset << <span class="Constant">" for "</span> << Type[base_type]<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> - products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span class="Identifier">break</span><span class="Delimiter">;</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> @@ -226,6 +229,10 @@ Recipe_ordinal[<span class="Constant">"get-address"</span>] = GET_ADDR 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> + if <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": tried to access location 0 in '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> + <span class="Identifier">break</span><span class="Delimiter">;</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> <span class="Delimiter">{</span> raise << current_recipe_name <span class="Delimiter">()</span> << <span class="Constant">": first ingredient of 'get-address' should be a container, but got "</span> << base<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> @@ -239,7 +246,6 @@ case GET_ADDRESS: <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> if <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= SIZE<span class="Delimiter">(</span>Type[base_type]<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> raise << <span class="Constant">"invalid offset "</span> << offset << <span class="Constant">" for "</span> << Type[base_type]<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> - products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> long long int result = base_address<span class="Delimiter">;</span> diff --git a/html/031address.cc.html b/html/031address.cc.html index 1709e1a1..06c08de7 100644 --- a/html/031address.cc.html +++ b/html/031address.cc.html @@ -13,9 +13,10 @@ 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; } +.traceAbsent { color: #c00000; } .traceContains { color: #008000; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } @@ -59,6 +60,20 @@ recipe main [ <span class="Delimiter">:(before "long long int base = x.value" following "void write_memory(reagent x, vector<double> data)")</span> x = canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span> +if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + raise << <span class="Constant">"can't write to location 0 in '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> + <span class="Identifier">return</span><span class="Delimiter">;</span> +<span class="Delimiter">}</span> + +<span class="Comment">//: writes to address 0 always loudly fail</span> +<span class="Delimiter">:(scenario store_to_0_warns)</span> +<span class="Special">% Hide_warnings = true;</span> +recipe main [ + <span class="Constant">1</span>:address:number<span class="Special"> <- </span>copy <span class="Constant">0</span> + <span class="Constant">1</span>:address:number/lookup<span class="Special"> <- </span>copy <span class="Constant">34</span> +] +<span class="traceAbsent">-mem: storing 34 in location 0</span> +<span class="traceContains">+warn: can't write to location 0 in '1:address:number/lookup <- copy 34'</span> <span class="Delimiter">:(code)</span> reagent canonize<span class="Delimiter">(</span>reagent x<span class="Delimiter">)</span> <span class="Delimiter">{</span> diff --git a/html/032array.cc.html b/html/032array.cc.html index 6086d339..249453b3 100644 --- a/html/032array.cc.html +++ b/html/032array.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } @@ -118,17 +118,20 @@ case INDEX: <span class="Delimiter">{</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <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> if <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> <span class="Delimiter">{</span> raise << current_recipe_name <span class="Delimiter">()</span> << <span class="Constant">": 'index' on a non-array "</span> << base<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> + long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": tried to access location 0 in '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> + <span class="Identifier">break</span><span class="Delimiter">;</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_ordinal> element_type = array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">);</span> if <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> || offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> >= Memory[base_address]<span class="Delimiter">)</span> <span class="Delimiter">{</span> raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": invalid index "</span> << offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> - products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span class="Identifier">break</span><span class="Delimiter">;</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> @@ -210,17 +213,20 @@ case INDEX_ADDRESS: <span class="Delimiter">{</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <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> if <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> <span class="Delimiter">{</span> raise << current_recipe_name <span class="Delimiter">()</span> << <span class="Constant">": 'index-address' on a non-array "</span> << base<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> + long long int base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": tried to access location 0 in '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> + <span class="Identifier">break</span><span class="Delimiter">;</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_ordinal> element_type = array_element<span class="Delimiter">(</span>base<span class="Delimiter">.</span>types<span class="Delimiter">);</span> if <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> || offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> >= Memory[base_address]<span class="Delimiter">)</span> <span class="Delimiter">{</span> raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": invalid index "</span> << offset_val<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> - products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span class="Identifier">break</span><span class="Delimiter">;</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> @@ -286,6 +292,10 @@ case LENGTH: <span class="Delimiter">{</span> raise << <span class="Constant">"tried to calculate length of non-array "</span> << x<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> + if <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": tried to access location 0 in '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> + <span class="Identifier">break</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>Memory[x<span class="Delimiter">.</span>value]<span class="Delimiter">);</span> <span class="Identifier">break</span><span class="Delimiter">;</span> diff --git a/html/033exclusive_container.cc.html b/html/033exclusive_container.cc.html index 2aaf30fb..efccf02f 100644 --- a/html/033exclusive_container.cc.html +++ b/html/033exclusive_container.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } @@ -123,6 +123,10 @@ case MAYBE_CONVERT: <span class="Delimiter">{</span> <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> + if <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": tried to access location 0 in '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> + <span class="Identifier">break</span><span class="Delimiter">;</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 != exclusive_container<span class="Delimiter">)</span> <span class="Delimiter">{</span> raise << current_recipe_name <span class="Delimiter">()</span> << <span class="Constant">": first ingredient of 'maybe-convert' should be an exclusive-container, but got "</span> << base<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> diff --git a/html/034call.cc.html b/html/034call.cc.html index 5e9d93b0..e408b840 100644 --- a/html/034call.cc.html +++ b/html/034call.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } @@ -117,8 +117,10 @@ inline const instruction& current_instruction<span class="Delimiter">()</spa default: <span class="Delimiter">{</span> <span class="Comment">// not a primitive; try to look up the book of recipes</span> if <span class="Delimiter">(</span>Recipe<span class="Delimiter">.</span>find<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">)</span> == Recipe<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> - raise << <span class="Constant">"undefined operation "</span> << current_instruction<span class="Delimiter">().</span>operation << <span class="Constant">": "</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> - <span class="Identifier">break</span><span class="Delimiter">;</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": undefined operation in '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> + <span class="Comment">// stop running this instruction immediately</span> + ++current_step_index<span class="Delimiter">();</span> + <span class="Identifier">continue</span><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>current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">));</span> call_housekeeping: @@ -127,6 +129,20 @@ default: <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">:(scenario calling_undefined_recipe_warns)</span> +<span class="Special">% Hide_warnings = true;</span> +recipe main [ + foo +] +<span class="traceContains">+warn: main: undefined operation in 'foo '</span> + +<span class="Delimiter">:(scenario calling_undefined_recipe_handles_missing_result)</span> +<span class="Special">% Hide_warnings = true;</span> +recipe main [ + x:number<span class="Special"> <- </span>foo +] +<span class="traceContains">+warn: main: undefined operation in 'x:number <- foo '</span> + <span class="SalientComment">//:: finally, we need to fix the termination conditions for the run loop</span> <span class="Delimiter">:(replace{} "inline bool routine::completed() const")</span> diff --git a/html/035call_ingredient.cc.html b/html/035call_ingredient.cc.html index 14c718a6..0435c8f9 100644 --- a/html/035call_ingredient.cc.html +++ b/html/035call_ingredient.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/036call_reply.cc.html b/html/036call_reply.cc.html index b293886c..3404cd37 100644 --- a/html/036call_reply.cc.html +++ b/html/036call_reply.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/037recipe.cc.html b/html/037recipe.cc.html index e0d7a2c4..4fe59bb0 100644 --- a/html/037recipe.cc.html +++ b/html/037recipe.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/038scheduler.cc.html b/html/038scheduler.cc.html index 667ad6e4..d6cb3c3f 100644 --- a/html/038scheduler.cc.html +++ b/html/038scheduler.cc.html @@ -13,11 +13,11 @@ 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; } +.traceAbsent { color: #c00000; } .traceContains { color: #008000; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } -.traceAbsent { color: #c00000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/039wait.cc.html b/html/039wait.cc.html index 311f37ca..2b5eeac4 100644 --- a/html/039wait.cc.html +++ b/html/039wait.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/040brace.cc.html b/html/040brace.cc.html index 7d468a9d..c2928477 100644 --- a/html/040brace.cc.html +++ b/html/040brace.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/041jump_label.cc.html b/html/041jump_label.cc.html index 05493404..960c7294 100644 --- a/html/041jump_label.cc.html +++ b/html/041jump_label.cc.html @@ -13,15 +13,15 @@ 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; } -.traceAbsent { color: #c00000; } -.cSpecial { color: #008000; } -.Constant { color: #00a0a0; } .traceContains { color: #008000; } +.Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } -.Identifier { color: #804000; } +.traceAbsent { color: #c00000; } .CommentedCode { color: #6c6c6c; } +.Identifier { color: #804000; } --> </style> diff --git a/html/042name.cc.html b/html/042name.cc.html index 1a0cc746..106b8e63 100644 --- a/html/042name.cc.html +++ b/html/042name.cc.html @@ -13,11 +13,11 @@ 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; } +.traceAbsent { color: #c00000; } .traceContains { color: #008000; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } -.traceAbsent { color: #c00000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } @@ -45,6 +45,7 @@ recipe main [ <span class="traceContains">+name: assign x 1</span> <span class="traceContains">+mem: storing 0 in location 1</span> +<span class="Delimiter">:(scenarios transform)</span> <span class="Delimiter">:(scenario transform_names_warns)</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ @@ -176,12 +177,16 @@ recipe main [ <span class="traceAbsent">-name: assign _ 1</span> <span class="Comment">//: an escape hatch to suppress name conversion that we'll use later</span> +<span class="Delimiter">:(scenarios run)</span> <span class="Delimiter">:(scenario transform_names_passes_raw)</span> +<span class="Special">% Hide_warnings = true;</span> recipe main [ x:number/<span class="Special">raw <- </span>copy <span class="Constant">0</span> ] <span class="traceAbsent">-name: assign x 1</span> +<span class="traceContains">+warn: can't write to location 0 in 'x:number/raw <- copy 0'</span> +<span class="Delimiter">:(scenarios transform)</span> <span class="Delimiter">:(scenario transform_names_warns_when_mixing_names_and_numeric_locations)</span> <span class="Special">% Hide_warnings = true;</span> recipe main [ @@ -233,7 +238,7 @@ recipe main [ 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> if <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> - raise << Recipe[r]<span class="Delimiter">.</span>name << <span class="Constant">": exactly 2 ingredients expected in '"</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> + raise << Recipe[r]<span class="Delimiter">.</span>name << <span class="Constant">": exactly 2 ingredients expected in '"</span> << inst<span class="Delimiter">.</span>to_string<span class="Delimiter">()</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> if <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> diff --git a/html/043new.cc.html b/html/043new.cc.html index 6175f3dc..e35772db 100644 --- a/html/043new.cc.html +++ b/html/043new.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } @@ -97,6 +97,7 @@ case NEW: <span class="Delimiter">{</span> <span class="Delimiter">}</span> if <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="Delimiter">{</span> raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": first ingredient of 'new' should be a type, but got "</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>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> + <span class="Identifier">break</span><span class="Delimiter">;</span> <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> diff --git a/html/044space.cc.html b/html/044space.cc.html index 7f4e742e..3f5b1b8c 100644 --- a/html/044space.cc.html +++ b/html/044space.cc.html @@ -14,15 +14,15 @@ 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; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } -.traceAbsent { color: #c00000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } -.Identifier { color: #804000; } +.traceAbsent { color: #c00000; } .CommentedCode { color: #6c6c6c; } +.Identifier { color: #804000; } --> </style> diff --git a/html/045space_surround.cc.html b/html/045space_surround.cc.html index 1b356165..87f5ff46 100644 --- a/html/045space_surround.cc.html +++ b/html/045space_surround.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/046closure_name.cc.html b/html/046closure_name.cc.html index b406f481..44854c80 100644 --- a/html/046closure_name.cc.html +++ b/html/046closure_name.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/047global.cc.html b/html/047global.cc.html index 941f8c90..6ff1dacd 100644 --- a/html/047global.cc.html +++ b/html/047global.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/048typecheck.cc.html b/html/048typecheck.cc.html index aafbd8f5..fe5be341 100644 --- a/html/048typecheck.cc.html +++ b/html/048typecheck.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } @@ -90,7 +90,8 @@ void deduce_missing_type<span class="Delimiter">(</span>map<string<span class if <span class="Delimiter">(</span>metadata<span class="Delimiter">.</span>find<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">)</span> == metadata<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> copy<span class="Delimiter">(</span>metadata[x<span class="Delimiter">.</span>name]<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> metadata[x<span class="Delimiter">.</span>name]<span class="Delimiter">.</span>end<span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<span class="Delimiter">,</span> x<span class="Delimiter">.</span>types<span class="Delimiter">.</span>begin<span class="Delimiter">()));</span> assert<span class="Delimiter">(</span>x<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>empty<span class="Delimiter">());</span> - x<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">"as-before"</span><span class="Delimiter">);</span> + x<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>resize<span class="Delimiter">(</span>metadata[x<span class="Delimiter">.</span>name]<span class="Delimiter">.</span>size<span class="Delimiter">());</span> + x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> vector<string> ><span class="Delimiter">(</span><span class="Constant">"as-before"</span><span class="Delimiter">,</span> vector<string><span class="Delimiter">()));</span> <span class="Delimiter">}</span> <span class="Delimiter">:(scenario transform_types_fills_in_missing_types_in_product)</span> @@ -113,8 +114,14 @@ recipe main [ x:number<span class="Special"> <- </span>copy <span class="Constant">2</span> ] <span class="traceContains">+warn: missing type in 'x <- copy 1'</span> -<span class="traceContains">+warn: x <- copy 1: reagent not initialized: x</span> -<span class="traceContains">+warn: main: size mismatch in storing to x at 'x <- copy 1'</span> + +<span class="Delimiter">:(scenario typo_in_address_type_warns)</span> +<span class="Special">% Hide_warnings = true;</span> +recipe main [ + y:address:charcter<span class="Special"> <- </span>new character:type + *y<span class="Special"> <- </span>copy <span class="Constant">67</span> +] +<span class="traceContains">+warn: unknown type: charcter</span> </pre> </body> </html> diff --git a/html/050scenario.cc.html b/html/050scenario.cc.html index dff6c56f..6126a5ce 100644 --- a/html/050scenario.cc.html +++ b/html/050scenario.cc.html @@ -13,11 +13,11 @@ 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; } +.traceAbsent { color: #c00000; } .traceContains { color: #008000; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .SalientComment { color: #00ffff; } -.traceAbsent { color: #c00000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/053continuation.cc.html b/html/053continuation.cc.html index 1118064c..171c0b7d 100644 --- a/html/053continuation.cc.html +++ b/html/053continuation.cc.html @@ -13,11 +13,11 @@ 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; } +.traceAbsent { color: #c00000; } .traceContains { color: #008000; } .cSpecial { color: #008000; } .Constant { color: #00a0a0; } .SalientComment { color: #00ffff; } -.traceAbsent { color: #c00000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/060string.mu.html b/html/060string.mu.html index 9b30c7fa..9f3c3c99 100644 --- a/html/060string.mu.html +++ b/html/060string.mu.html @@ -13,14 +13,14 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } -.Delimiter { color: #a04060; } .muScenario { color: #00af00; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } .CommentedCode { color: #6c6c6c; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> @@ -68,7 +68,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muScenario">scenario</span> string-equal-reflexive [ run [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new <span class="Constant">location:type</span>, <span class="Constant">30</span> x:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> <span class="Constant">3</span>:boolean/<span class="Special">raw <- </span>string-equal x, x ] @@ -79,7 +79,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muScenario">scenario</span> string-equal-identical [ run [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new <span class="Constant">location:type</span>, <span class="Constant">30</span> x:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> y:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> <span class="Constant">3</span>:boolean/<span class="Special">raw <- </span>string-equal x, y @@ -91,7 +91,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muScenario">scenario</span> string-equal-distinct-lengths [ run [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new <span class="Constant">location:type</span>, <span class="Constant">30</span> x:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> y:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcd]</span> <span class="Constant">3</span>:boolean/<span class="Special">raw <- </span>string-equal x, y @@ -109,7 +109,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muScenario">scenario</span> string-equal-with-empty [ run [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new <span class="Constant">location:type</span>, <span class="Constant">30</span> x:address:array:character<span class="Special"> <- </span>new <span class="Constant">[]</span> y:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcd]</span> <span class="Constant">3</span>:boolean/<span class="Special">raw <- </span>string-equal x, y @@ -121,7 +121,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muScenario">scenario</span> string-equal-common-lengths-but-distinct [ run [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new <span class="Constant">location:type</span>, <span class="Constant">30</span> x:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> y:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abd]</span> <span class="Constant">3</span>:boolean/<span class="Special">raw <- </span>string-equal x, y @@ -140,13 +140,13 @@ container buffer [ <span class="muRecipe">recipe</span> new-buffer [ <span class="Constant">local-scope</span> <span class="CommentedCode">#? $print default-space:address:array:location, 10/newline</span> - result:address:buffer<span class="Special"> <- </span>new buffer:type - len:address:number<span class="Special"> <- </span>get-address *result, length:offset + result:address:buffer<span class="Special"> <- </span>new <span class="Constant">buffer:type</span> + len:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">length:offset</span> *len:address:number<span class="Special"> <- </span>copy <span class="Constant">0</span> - s:address:address:array:character<span class="Special"> <- </span>get-address *result, data:offset + s:address:address:array:character<span class="Special"> <- </span>get-address *result, <span class="Constant">data:offset</span> capacity:number, found?:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> assert found?, <span class="Constant">[new-buffer must get a capacity argument]</span> - *s<span class="Special"> <- </span>new character:type, capacity + *s<span class="Special"> <- </span>new <span class="Constant">character:type</span>, capacity <span class="CommentedCode">#? $print *s, 10/newline</span> <span class="muControl">reply</span> result ] @@ -155,11 +155,11 @@ container buffer [ <span class="Constant">local-scope</span> in:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># double buffer size</span> - x:address:address:array:character<span class="Special"> <- </span>get-address *in, data:offset + x:address:address:array:character<span class="Special"> <- </span>get-address *in, <span class="Constant">data:offset</span> oldlen:number<span class="Special"> <- </span>length **x newlen:number<span class="Special"> <- </span>multiply oldlen, <span class="Constant">2</span> olddata:address:array:character<span class="Special"> <- </span>copy *x - *x<span class="Special"> <- </span>new character:type, newlen + *x<span class="Special"> <- </span>new <span class="Constant">character:type</span>, newlen <span class="Comment"># copy old contents</span> i:number<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Delimiter">{</span> @@ -177,8 +177,8 @@ container buffer [ <span class="muRecipe">recipe</span> buffer-full? [ <span class="Constant">local-scope</span> in:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - len:number<span class="Special"> <- </span>get *in, length:offset - s:address:array:character<span class="Special"> <- </span>get *in, data:offset + len:number<span class="Special"> <- </span>get *in, <span class="Constant">length:offset</span> + s:address:array:character<span class="Special"> <- </span>get *in, <span class="Constant">data:offset</span> capacity:number<span class="Special"> <- </span>length *s result:boolean<span class="Special"> <- </span>greater-or-equal len, capacity <span class="muControl">reply</span> result @@ -189,7 +189,7 @@ container buffer [ <span class="Constant">local-scope</span> in:address:buffer<span class="Special"> <- </span><span class="Constant">next-ingredient</span> c:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - len:address:number<span class="Special"> <- </span>get-address *in, length:offset + len:address:number<span class="Special"> <- </span>get-address *in, <span class="Constant">length:offset</span> <span class="Delimiter">{</span> <span class="Comment"># backspace? just drop last character if it exists and return</span> backspace?:boolean<span class="Special"> <- </span>equal c, <span class="Constant">8/backspace</span> @@ -205,7 +205,7 @@ container buffer [ <span class="muControl">break-unless</span> full? in<span class="Special"> <- </span>grow-buffer in <span class="Delimiter">}</span> - s:address:array:character<span class="Special"> <- </span>get *in, data:offset + s:address:array:character<span class="Special"> <- </span>get *in, <span class="Constant">data:offset</span> <span class="CommentedCode">#? $print [array underlying buf: ], s, 10/newline</span> <span class="CommentedCode">#? $print [index: ], *len, 10/newline</span> dest:address:character<span class="Special"> <- </span>index-address *s, *len @@ -219,18 +219,18 @@ container buffer [ run [ <span class="Constant">local-scope</span> x:address:buffer<span class="Special"> <- </span>new-buffer <span class="Constant">3</span> - s1:address:array:character<span class="Special"> <- </span>get *x:address:buffer, data:offset + s1:address:array:character<span class="Special"> <- </span>get *x:address:buffer, <span class="Constant">data:offset</span> x:address:buffer<span class="Special"> <- </span>buffer-append x:address:buffer, <span class="Constant">97</span> <span class="Comment"># 'a'</span> x:address:buffer<span class="Special"> <- </span>buffer-append x:address:buffer, <span class="Constant">98</span> <span class="Comment"># 'b'</span> x:address:buffer<span class="Special"> <- </span>buffer-append x:address:buffer, <span class="Constant">99</span> <span class="Comment"># 'c'</span> - s2:address:array:character<span class="Special"> <- </span>get *x:address:buffer, data:offset + s2:address:array:character<span class="Special"> <- </span>get *x:address:buffer, <span class="Constant">data:offset</span> <span class="Constant">1</span>:boolean/<span class="Special">raw <- </span>equal s1:address:array:character, s2:address:array:character <span class="Constant">2</span>:array:character/<span class="Special">raw <- </span>copy *s2:address:array:character <span class="Constant"> +buffer-filled</span> x:address:buffer<span class="Special"> <- </span>buffer-append x:address:buffer, <span class="Constant">100</span> <span class="Comment"># 'd'</span> - s3:address:array:character<span class="Special"> <- </span>get *x:address:buffer, data:offset + s3:address:array:character<span class="Special"> <- </span>get *x:address:buffer, <span class="Constant">data:offset</span> <span class="Constant">10</span>:boolean/<span class="Special">raw <- </span>equal s1:address:array:character, s3:address:array:character - <span class="Constant">11</span>:number/<span class="Special">raw <- </span>get *x:address:buffer, length:offset + <span class="Constant">11</span>:number/<span class="Special">raw <- </span>get *x:address:buffer, <span class="Constant">length:offset</span> <span class="Constant">12</span>:array:character/<span class="Special">raw <- </span>copy *s3:address:array:character ] memory-should-contain [ @@ -305,9 +305,9 @@ container buffer [ tmp<span class="Special"> <- </span>buffer-append tmp, <span class="Constant">45</span> <span class="Comment"># '-'</span> <span class="Delimiter">}</span> <span class="Comment"># reverse buffer into string result</span> - len:number<span class="Special"> <- </span>get *tmp, length:offset - buf:address:array:character<span class="Special"> <- </span>get *tmp, data:offset - result:address:array:character<span class="Special"> <- </span>new character:type, len + len:number<span class="Special"> <- </span>get *tmp, <span class="Constant">length:offset</span> + buf:address:array:character<span class="Special"> <- </span>get *tmp, <span class="Constant">data:offset</span> + result:address:array:character<span class="Special"> <- </span>new <span class="Constant">character:type</span>, len i:number<span class="Special"> <- </span>subtract len, <span class="Constant">1</span> <span class="Comment"># source index, decreasing</span> j:number<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># destination index, increasing</span> <span class="Delimiter">{</span> @@ -333,11 +333,11 @@ container buffer [ <span class="muControl">break-if</span> in <span class="muControl">reply</span> <span class="Constant">0</span> <span class="Delimiter">}</span> - len:number<span class="Special"> <- </span>get *in, length:offset + len:number<span class="Special"> <- </span>get *in, <span class="Constant">length:offset</span> <span class="CommentedCode">#? $print [size ], len, 10/newline</span> - s:address:array:character<span class="Special"> <- </span>get *in, data:offset + s:address:array:character<span class="Special"> <- </span>get *in, <span class="Constant">data:offset</span> <span class="Comment"># we can't just return s because it is usually the wrong length</span> - result:address:array:character<span class="Special"> <- </span>new character:type, len + result:address:array:character<span class="Special"> <- </span>new <span class="Constant">character:type</span>, len i:number<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Delimiter">{</span> <span class="CommentedCode">#? $print i #? 1</span> @@ -393,7 +393,7 @@ container buffer [ b:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> b-len:number<span class="Special"> <- </span>length *b result-len:number<span class="Special"> <- </span>add a-len, b-len - result:address:array:character<span class="Special"> <- </span>new character:type, result-len + result:address:array:character<span class="Special"> <- </span>new <span class="Constant">character:type</span>, result-len <span class="Comment"># copy a into result</span> result-idx:number<span class="Special"> <- </span>copy <span class="Constant">0</span> i:number<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -459,7 +459,7 @@ container buffer [ <span class="CommentedCode">#? $print tem-len, [ ], $result-len, 10/newline</span> rewind-ingredients _<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># skip template</span> - result:address:array:character<span class="Special"> <- </span>new character:type, result-len + result:address:array:character<span class="Special"> <- </span>new <span class="Constant">character:type</span>, result-len <span class="Comment"># repeatedly copy sections of template and 'holes' into result</span> result-idx:number<span class="Special"> <- </span>copy <span class="Constant">0</span> i:number<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -632,7 +632,7 @@ container buffer [ <span class="Delimiter">{</span> at-end?:boolean<span class="Special"> <- </span>greater-or-equal start, len <span class="muControl">break-unless</span> at-end? - result:address:array:character<span class="Special"> <- </span>new character:type, <span class="Constant">0</span> + result:address:array:character<span class="Special"> <- </span>new <span class="Constant">character:type</span>, <span class="Constant">0</span> <span class="muControl">reply</span> result <span class="Delimiter">}</span> curr:character<span class="Special"> <- </span>index *s, start @@ -654,7 +654,7 @@ container buffer [ <span class="Delimiter">}</span> <span class="Comment"># result = new character[end+1 - start]</span> new-len:number<span class="Special"> <- </span>subtract end, start, -1 - result:address:array:character<span class="Special"> <- </span>new character:type, new-len + result:address:array:character<span class="Special"> <- </span>new <span class="Constant">character:type</span>, new-len <span class="Comment"># i = start, j = 0</span> i:number<span class="Special"> <- </span>copy start j:number<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -1050,7 +1050,7 @@ container buffer [ <span class="Delimiter">{</span> empty?:boolean<span class="Special"> <- </span>equal len, <span class="Constant">0</span> <span class="muControl">break-unless</span> empty? - result:address:array:address:array:character<span class="Special"> <- </span>new location:type, <span class="Constant">0</span> + result:address:array:address:array:character<span class="Special"> <- </span>new <span class="Constant">location:type</span>, <span class="Constant">0</span> <span class="muControl">reply</span> result <span class="Delimiter">}</span> <span class="Comment"># count #pieces we need room for</span> @@ -1065,7 +1065,7 @@ container buffer [ <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># allocate space</span> - result:address:array:address:array:character<span class="Special"> <- </span>new location:type, count + result:address:array:address:array:character<span class="Special"> <- </span>new <span class="Constant">location:type</span>, count <span class="Comment"># repeatedly copy slices start..end until delimiter into result[curr-result]</span> curr-result:number<span class="Special"> <- </span>copy <span class="Constant">0</span> start:number<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -1216,7 +1216,7 @@ container buffer [ end:number<span class="Special"> <- </span>min len, end <span class="Comment"># allocate space for result</span> len<span class="Special"> <- </span>subtract end, start - result:address:array:character<span class="Special"> <- </span>new character:type, len + result:address:array:character<span class="Special"> <- </span>new <span class="Constant">character:type</span>, len <span class="Comment"># copy start..end into result[curr-result]</span> src-idx:number<span class="Special"> <- </span>copy start dest-idx:number<span class="Special"> <- </span>copy <span class="Constant">0</span> diff --git a/html/061channel.mu.html b/html/061channel.mu.html index 89df9b83..b8cfae4c 100644 --- a/html/061channel.mu.html +++ b/html/061channel.mu.html @@ -13,14 +13,14 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } +.muScenario { color: #00af00; } .SalientComment { color: #00ffff; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> @@ -69,18 +69,18 @@ container channel [ <span class="muRecipe">recipe</span> new-channel [ <span class="Constant">local-scope</span> <span class="Comment"># result = new channel</span> - result:address:channel<span class="Special"> <- </span>new channel:type + result:address:channel<span class="Special"> <- </span>new <span class="Constant">channel:type</span> <span class="Comment"># result.first-full = 0</span> - full:address:number<span class="Special"> <- </span>get-address *result, first-full:offset + full:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">first-full:offset</span> *full<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># result.first-free = 0</span> - free:address:number<span class="Special"> <- </span>get-address *result, first-free:offset + free:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">first-free:offset</span> *free<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># result.data = new location[ingredient+1]</span> capacity:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> capacity<span class="Special"> <- </span>add capacity, <span class="Constant">1</span> <span class="Comment"># unused slot for 'full?' below</span> - dest:address:address:array:location<span class="Special"> <- </span>get-address *result, data:offset - *dest<span class="Special"> <- </span>new location:type, capacity + dest:address:address:array:location<span class="Special"> <- </span>get-address *result, <span class="Constant">data:offset</span> + *dest<span class="Special"> <- </span>new <span class="Constant">location:type</span>, capacity <span class="muControl">reply</span> result ] @@ -93,12 +93,12 @@ container channel [ <span class="Comment"># block if chan is full</span> full:boolean<span class="Special"> <- </span>channel-full? chan <span class="muControl">break-unless</span> full - full-address:address:number<span class="Special"> <- </span>get-address *chan, first-full:offset + full-address:address:number<span class="Special"> <- </span>get-address *chan, <span class="Constant">first-full:offset</span> wait-for-location *full-address <span class="Delimiter">}</span> <span class="Comment"># store val</span> - circular-buffer:address:array:location<span class="Special"> <- </span>get *chan, data:offset - free:address:number<span class="Special"> <- </span>get-address *chan, first-free:offset + circular-buffer:address:array:location<span class="Special"> <- </span>get *chan, <span class="Constant">data:offset</span> + free:address:number<span class="Special"> <- </span>get-address *chan, <span class="Constant">first-free:offset</span> dest:address:location<span class="Special"> <- </span>index-address *circular-buffer, *free *dest<span class="Special"> <- </span>copy val <span class="Comment"># mark its slot as filled</span> @@ -121,12 +121,12 @@ container channel [ <span class="Comment"># block if chan is empty</span> empty?:boolean<span class="Special"> <- </span>channel-empty? chan <span class="muControl">break-unless</span> empty? - free-address:address:number<span class="Special"> <- </span>get-address *chan, first-free:offset + free-address:address:number<span class="Special"> <- </span>get-address *chan, <span class="Constant">first-free:offset</span> wait-for-location *free-address <span class="Delimiter">}</span> <span class="Comment"># read result</span> - full:address:number<span class="Special"> <- </span>get-address *chan, first-full:offset - circular-buffer:address:array:location<span class="Special"> <- </span>get *chan, data:offset + full:address:number<span class="Special"> <- </span>get-address *chan, <span class="Constant">first-full:offset</span> + circular-buffer:address:array:location<span class="Special"> <- </span>get *chan, <span class="Constant">data:offset</span> result:location<span class="Special"> <- </span>index *circular-buffer, *full <span class="Comment"># increment full</span> *full<span class="Special"> <- </span>add *full, <span class="Constant">1</span> @@ -154,8 +154,8 @@ container channel [ <span class="muScenario">scenario</span> channel-initialization [ run [ <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">3/capacity</span> - <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, first-full:offset - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, first-free:offset + <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, <span class="Constant">first-full:offset</span> + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, <span class="Constant">first-free:offset</span> ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> <- </span><span class="Constant">0</span> <span class="Comment"># first-full</span> @@ -167,8 +167,8 @@ container channel [ run [ <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">3/capacity</span> <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>write <span class="Constant">1</span>:address:channel, <span class="Constant">34</span> - <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, first-full:offset - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, first-free:offset + <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, <span class="Constant">first-full:offset</span> + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, <span class="Constant">first-free:offset</span> ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> <- </span><span class="Constant">0</span> <span class="Comment"># first-full</span> @@ -181,8 +181,8 @@ container channel [ <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">3/capacity</span> <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>write <span class="Constant">1</span>:address:channel, <span class="Constant">34</span> _, <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>read <span class="Constant">1</span>:address:channel - <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, first-full:offset - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, first-free:offset + <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, <span class="Constant">first-full:offset</span> + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, <span class="Constant">first-free:offset</span> ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> <- </span><span class="Constant">1</span> <span class="Comment"># first-full</span> @@ -198,14 +198,14 @@ container channel [ <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>write <span class="Constant">1</span>:address:channel, <span class="Constant">34</span> _, <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>read <span class="Constant">1</span>:address:channel <span class="Comment"># first-free will now be 1</span> - <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, first-free:offset - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, first-free:offset + <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, <span class="Constant">first-free:offset</span> + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, <span class="Constant">first-free:offset</span> <span class="Comment"># write second value, verify that first-free wraps</span> <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>write <span class="Constant">1</span>:address:channel, <span class="Constant">34</span> - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, first-free:offset + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, <span class="Constant">first-free:offset</span> <span class="Comment"># read second value, verify that first-full wraps</span> _, <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>read <span class="Constant">1</span>:address:channel - <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, first-full:offset + <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:channel, <span class="Constant">first-full:offset</span> ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> <- </span><span class="Constant">1</span> <span class="Comment"># first-free after first write</span> @@ -222,8 +222,8 @@ container channel [ <span class="Constant">local-scope</span> chan:address:channel<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># return chan.first-full == chan.first-free</span> - full:number<span class="Special"> <- </span>get *chan, first-full:offset - free:number<span class="Special"> <- </span>get *chan, first-free:offset + full:number<span class="Special"> <- </span>get *chan, <span class="Constant">first-full:offset</span> + free:number<span class="Special"> <- </span>get *chan, <span class="Constant">first-free:offset</span> result:boolean<span class="Special"> <- </span>equal full, free <span class="muControl">reply</span> result ] @@ -234,7 +234,7 @@ container channel [ <span class="Constant">local-scope</span> chan:address:channel<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># tmp = chan.first-free + 1</span> - tmp:number<span class="Special"> <- </span>get *chan, first-free:offset + tmp:number<span class="Special"> <- </span>get *chan, <span class="Constant">first-free:offset</span> tmp<span class="Special"> <- </span>add tmp, <span class="Constant">1</span> <span class="Delimiter">{</span> <span class="Comment"># if tmp == chan.capacity, tmp = 0</span> @@ -244,7 +244,7 @@ container channel [ tmp<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Comment"># return chan.first-full == tmp</span> - full:number<span class="Special"> <- </span>get *chan, first-full:offset + full:number<span class="Special"> <- </span>get *chan, <span class="Constant">first-full:offset</span> result:boolean<span class="Special"> <- </span>equal full, tmp <span class="muControl">reply</span> result ] @@ -253,7 +253,7 @@ container channel [ <span class="muRecipe">recipe</span> channel-capacity [ <span class="Constant">local-scope</span> chan:address:channel<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - q:address:array:location<span class="Special"> <- </span>get *chan, data:offset + q:address:array:location<span class="Special"> <- </span>get *chan, <span class="Constant">data:offset</span> result:number<span class="Special"> <- </span>length *q <span class="muControl">reply</span> result ] @@ -330,7 +330,7 @@ container channel [ <span class="muControl">break-unless</span> backspace? <span class="Comment"># drop previous character</span> <span class="Delimiter">{</span> - buffer-length:address:number<span class="Special"> <- </span>get-address *line, length:offset + buffer-length:address:number<span class="Special"> <- </span>get-address *line, <span class="Constant">length:offset</span> buffer-empty?:boolean<span class="Special"> <- </span>equal *buffer-length, <span class="Constant">0</span> <span class="muControl">break-if</span> buffer-empty? *buffer-length<span class="Special"> <- </span>subtract *buffer-length, <span class="Constant">1</span> @@ -349,8 +349,8 @@ container channel [ <span class="Delimiter">}</span> <span class="Comment"># copy line into 'out'</span> i:number<span class="Special"> <- </span>copy <span class="Constant">0</span> - line-contents:address:array:character<span class="Special"> <- </span>get *line, data:offset - max:number<span class="Special"> <- </span>get *line, length:offset + line-contents:address:array:character<span class="Special"> <- </span>get *line, <span class="Constant">data:offset</span> + max:number<span class="Special"> <- </span>get *line, <span class="Constant">length:offset</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>greater-or-equal i, max <span class="muControl">break-if</span> done? @@ -372,7 +372,7 @@ container channel [ assert <span class="Constant">3</span>:boolean, [ F buffer-lines-blocks-until-newline: channel should be empty <span class="muRecipe">after</span> init] <span class="Comment"># buffer stdin into buffered-stdin, try to read from buffered-stdin</span> - <span class="Constant">4</span>:number/buffer-routine<span class="Special"> <- </span>start-running buffer-lines:<span class="muRecipe">recipe</span>, <span class="Constant">1</span>:address:channel/stdin, <span class="Constant">2</span>:address:channel/buffered-stdin + <span class="Constant">4</span>:number/buffer-routine<span class="Special"> <- </span>start-running <span class="Constant">buffer-lines:recipe</span>, <span class="Constant">1</span>:address:channel/stdin, <span class="Constant">2</span>:address:channel/buffered-stdin wait-for-routine <span class="Constant">4</span>:number/buffer-routine <span class="Constant">5</span>:boolean<span class="Special"> <- </span>channel-empty? <span class="Constant">2</span>:address:channel/buffered-stdin assert <span class="Constant">5</span>:boolean, [ diff --git a/html/062array.mu.html b/html/062array.mu.html index 55169dfe..32af078f 100644 --- a/html/062array.mu.html +++ b/html/062array.mu.html @@ -13,13 +13,13 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } +.muScenario { color: #00af00; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> @@ -55,7 +55,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } capacity<span class="Special"> <- </span>add capacity, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> - result:address:array:location<span class="Special"> <- </span>new location:type, capacity + result:address:array:location<span class="Special"> <- </span>new <span class="Constant">location:type</span>, capacity rewind-ingredients i:number<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Delimiter">{</span> diff --git a/html/063list.mu.html b/html/063list.mu.html index 50060a5f..7e0f6e61 100644 --- a/html/063list.mu.html +++ b/html/063list.mu.html @@ -13,13 +13,13 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } .muScenario { color: #00af00; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } .CommentedCode { color: #6c6c6c; } -.muControl { color: #c0a020; } --> </style> @@ -46,10 +46,10 @@ container list [ <span class="Constant">local-scope</span> x:location<span class="Special"> <- </span><span class="Constant">next-ingredient</span> in:address:list<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - result:address:list<span class="Special"> <- </span>new list:type - val:address:location<span class="Special"> <- </span>get-address *result, value:offset + result:address:list<span class="Special"> <- </span>new <span class="Constant">list:type</span> + val:address:location<span class="Special"> <- </span>get-address *result, <span class="Constant">value:offset</span> *val<span class="Special"> <- </span>copy x - next:address:address:list<span class="Special"> <- </span>get-address *result, next:offset + next:address:address:list<span class="Special"> <- </span>get-address *result, <span class="Constant">next:offset</span> *next<span class="Special"> <- </span>copy in <span class="muControl">reply</span> result ] @@ -58,7 +58,7 @@ container list [ <span class="muRecipe">recipe</span> first [ <span class="Constant">local-scope</span> in:address:list<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - result:location<span class="Special"> <- </span>get *in, value:offset + result:location<span class="Special"> <- </span>get *in, <span class="Constant">value:offset</span> <span class="muControl">reply</span> result ] @@ -66,7 +66,7 @@ container list [ <span class="muRecipe">recipe</span> rest [ <span class="Constant">local-scope</span> in:address:list<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - result:address:list<span class="Special"> <- </span>get *in, next:offset + result:address:list<span class="Special"> <- </span>get *in, <span class="Constant">next:offset</span> <span class="muControl">reply</span> result ] diff --git a/html/064random.cc.html b/html/064random.cc.html index 8735a580..5cfdf676 100644 --- a/html/064random.cc.html +++ b/html/064random.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .PreProc { color: #c000c0; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } diff --git a/html/065duplex_list.mu.html b/html/065duplex_list.mu.html index cbae7303..50ccbc35 100644 --- a/html/065duplex_list.mu.html +++ b/html/065duplex_list.mu.html @@ -13,14 +13,14 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } -.Delimiter { color: #a04060; } .muScenario { color: #00af00; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } .CommentedCode { color: #6c6c6c; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> @@ -45,13 +45,13 @@ container duplex-list [ <span class="Constant">local-scope</span> x:location<span class="Special"> <- </span><span class="Constant">next-ingredient</span> in:address:duplex-list<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - result:address:duplex-list<span class="Special"> <- </span>new duplex-list:type - val:address:location<span class="Special"> <- </span>get-address *result, value:offset + result:address:duplex-list<span class="Special"> <- </span>new <span class="Constant">duplex-list:type</span> + val:address:location<span class="Special"> <- </span>get-address *result, <span class="Constant">value:offset</span> *val<span class="Special"> <- </span>copy x - next:address:address:duplex-list<span class="Special"> <- </span>get-address *result, next:offset + next:address:address:duplex-list<span class="Special"> <- </span>get-address *result, <span class="Constant">next:offset</span> *next<span class="Special"> <- </span>copy in <span class="muControl">reply-unless</span> in, result - prev:address:address:duplex-list<span class="Special"> <- </span>get-address *in, prev:offset + prev:address:address:duplex-list<span class="Special"> <- </span>get-address *in, <span class="Constant">prev:offset</span> *prev<span class="Special"> <- </span>copy result <span class="muControl">reply</span> result ] @@ -61,7 +61,7 @@ container duplex-list [ <span class="Constant">local-scope</span> in:address:duplex-list<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="muControl">reply-unless</span> in, <span class="Constant">0</span> - result:location<span class="Special"> <- </span>get *in, value:offset + result:location<span class="Special"> <- </span>get *in, <span class="Constant">value:offset</span> <span class="muControl">reply</span> result ] @@ -70,7 +70,7 @@ container duplex-list [ <span class="Constant">local-scope</span> in:address:duplex-list<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="muControl">reply-unless</span> in, <span class="Constant">0</span> - result:address:duplex-list<span class="Special"> <- </span>get *in, next:offset + result:address:duplex-list<span class="Special"> <- </span>get *in, <span class="Constant">next:offset</span> <span class="muControl">reply</span> result ] @@ -79,7 +79,7 @@ container duplex-list [ <span class="Constant">local-scope</span> in:address:duplex-list<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="muControl">reply-unless</span> in, <span class="Constant">0</span> - result:address:duplex-list<span class="Special"> <- </span>get *in, prev:offset + result:address:duplex-list<span class="Special"> <- </span>get *in, <span class="Constant">prev:offset</span> <span class="muControl">reply</span> result ] @@ -93,19 +93,19 @@ container duplex-list [ <span class="Constant">3</span>:address:duplex-list<span class="Special"> <- </span>push-duplex <span class="Constant">4</span>, <span class="Constant">3</span>:address:duplex-list <span class="Constant">3</span>:address:duplex-list<span class="Special"> <- </span>push-duplex <span class="Constant">5</span>, <span class="Constant">3</span>:address:duplex-list <span class="Constant">4</span>:address:duplex-list<span class="Special"> <- </span>copy <span class="Constant">3</span>:address:duplex-list - <span class="Constant">5</span>:number<span class="Special"> <- </span>first <span class="Constant">4</span>:address:duplex-list + <span class="Constant">5</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">4</span>:address:duplex-list <span class="Constant">4</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">4</span>:address:duplex-list - <span class="Constant">6</span>:number<span class="Special"> <- </span>first <span class="Constant">4</span>:address:duplex-list + <span class="Constant">6</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">4</span>:address:duplex-list <span class="Constant">4</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">4</span>:address:duplex-list - <span class="Constant">7</span>:number<span class="Special"> <- </span>first <span class="Constant">4</span>:address:duplex-list + <span class="Constant">7</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">4</span>:address:duplex-list <span class="Constant">8</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">4</span>:address:duplex-list - <span class="Constant">9</span>:number<span class="Special"> <- </span>first <span class="Constant">8</span>:address:duplex-list + <span class="Constant">9</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">8</span>:address:duplex-list <span class="Constant">10</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">8</span>:address:duplex-list <span class="Constant">11</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">8</span>:address:duplex-list <span class="Constant">4</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">4</span>:address:duplex-list - <span class="Constant">12</span>:number<span class="Special"> <- </span>first <span class="Constant">4</span>:address:duplex-list + <span class="Constant">12</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">4</span>:address:duplex-list <span class="Constant">4</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">4</span>:address:duplex-list - <span class="Constant">13</span>:number<span class="Special"> <- </span>first <span class="Constant">4</span>:address:duplex-list + <span class="Constant">13</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">4</span>:address:duplex-list <span class="Constant">14</span>:boolean<span class="Special"> <- </span>equal <span class="Constant">3</span>:address:duplex-list, <span class="Constant">4</span>:address:duplex-list <span class="CommentedCode">#? $dump-trace #? 1</span> ] @@ -132,23 +132,23 @@ container duplex-list [ <span class="Constant">local-scope</span> x:location<span class="Special"> <- </span><span class="Constant">next-ingredient</span> in:address:duplex-list<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - new-node:address:duplex-list<span class="Special"> <- </span>new duplex-list:type - val:address:location<span class="Special"> <- </span>get-address *new-node, value:offset + new-node:address:duplex-list<span class="Special"> <- </span>new <span class="Constant">duplex-list:type</span> + val:address:location<span class="Special"> <- </span>get-address *new-node, <span class="Constant">value:offset</span> *val<span class="Special"> <- </span>copy x - next-node:address:duplex-list<span class="Special"> <- </span>get *in, next:offset + next-node:address:duplex-list<span class="Special"> <- </span>get *in, <span class="Constant">next:offset</span> <span class="Comment"># in.next = new-node</span> - y:address:address:duplex-list<span class="Special"> <- </span>get-address *in, next:offset + y:address:address:duplex-list<span class="Special"> <- </span>get-address *in, <span class="Constant">next:offset</span> *y<span class="Special"> <- </span>copy new-node <span class="Comment"># new-node.prev = in</span> - y<span class="Special"> <- </span>get-address *new-node, prev:offset + y<span class="Special"> <- </span>get-address *new-node, <span class="Constant">prev:offset</span> *y<span class="Special"> <- </span>copy in <span class="Comment"># new-node.next = next-node</span> - y<span class="Special"> <- </span>get-address *new-node, next:offset + y<span class="Special"> <- </span>get-address *new-node, <span class="Constant">next:offset</span> *y<span class="Special"> <- </span>copy next-node <span class="Comment"># if next-node is not null</span> <span class="muControl">reply-unless</span> next-node, new-node <span class="Comment"># next-node.prev = new-node</span> - y<span class="Special"> <- </span>get-address *next-node, prev:offset + y<span class="Special"> <- </span>get-address *next-node, <span class="Constant">prev:offset</span> *y<span class="Special"> <- </span>copy new-node <span class="muControl">reply</span> new-node <span class="Comment"># just signalling something changed; don't rely on the result</span> ] @@ -163,19 +163,19 @@ container duplex-list [ <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>insert-duplex <span class="Constant">6</span>, <span class="Constant">2</span>:address:duplex-list <span class="Comment"># check structure like before</span> <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:duplex-list - <span class="Constant">3</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">3</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">4</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">4</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">5</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">5</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">6</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">6</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">7</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">7</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">8</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">8</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">9</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">9</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">10</span>:boolean<span class="Special"> <- </span>equal <span class="Constant">1</span>:address:duplex-list, <span class="Constant">2</span>:address:duplex-list ] memory-should-contain [ @@ -201,19 +201,19 @@ container duplex-list [ <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>insert-duplex <span class="Constant">6</span>, <span class="Constant">2</span>:address:duplex-list <span class="Comment"># check structure like before</span> <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:duplex-list - <span class="Constant">3</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">3</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">4</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">4</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">5</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">5</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">6</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">6</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">7</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">7</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">8</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">8</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">9</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">9</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">10</span>:boolean<span class="Special"> <- </span>equal <span class="Constant">1</span>:address:duplex-list, <span class="Constant">2</span>:address:duplex-list ] memory-should-contain [ @@ -237,19 +237,19 @@ container duplex-list [ <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>insert-duplex <span class="Constant">6</span>, <span class="Constant">1</span>:address:duplex-list <span class="Comment"># check structure like before</span> <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:duplex-list - <span class="Constant">3</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">3</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">4</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">4</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">5</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">5</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">6</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">6</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">7</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">7</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">8</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">8</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">9</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">9</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">10</span>:boolean<span class="Special"> <- </span>equal <span class="Constant">1</span>:address:duplex-list, <span class="Constant">2</span>:address:duplex-list ] memory-should-contain [ @@ -275,25 +275,25 @@ container duplex-list [ in:address:duplex-list<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># if 'in' is null, return</span> <span class="muControl">reply-unless</span> in, in - next-node:address:duplex-list<span class="Special"> <- </span>get *in, next:offset - prev-node:address:duplex-list<span class="Special"> <- </span>get *in, prev:offset + next-node:address:duplex-list<span class="Special"> <- </span>get *in, <span class="Constant">next:offset</span> + prev-node:address:duplex-list<span class="Special"> <- </span>get *in, <span class="Constant">prev:offset</span> <span class="Comment"># null in's pointers</span> - x:address:address:duplex-list<span class="Special"> <- </span>get-address *in, next:offset + x:address:address:duplex-list<span class="Special"> <- </span>get-address *in, <span class="Constant">next:offset</span> *x<span class="Special"> <- </span>copy <span class="Constant">0</span> - x<span class="Special"> <- </span>get-address *in, prev:offset + x<span class="Special"> <- </span>get-address *in, <span class="Constant">prev:offset</span> *x<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Delimiter">{</span> <span class="Comment"># if next-node is not null</span> <span class="muControl">break-unless</span> next-node <span class="Comment"># next-node.prev = prev-node</span> - x<span class="Special"> <- </span>get-address *next-node, prev:offset + x<span class="Special"> <- </span>get-address *next-node, <span class="Constant">prev:offset</span> *x<span class="Special"> <- </span>copy prev-node <span class="Delimiter">}</span> <span class="Delimiter">{</span> <span class="Comment"># if prev-node is not null</span> <span class="muControl">break-unless</span> prev-node <span class="Comment"># prev-node.next = next-node</span> - x<span class="Special"> <- </span>get-address *prev-node, next:offset + x<span class="Special"> <- </span>get-address *prev-node, <span class="Constant">next:offset</span> *x<span class="Special"> <- </span>copy next-node <span class="muControl">reply</span> prev-node <span class="Delimiter">}</span> @@ -311,12 +311,12 @@ container duplex-list [ <span class="Constant">3</span>:boolean<span class="Special"> <- </span>equal <span class="Constant">2</span>:address:duplex-list, <span class="Constant">0</span> <span class="Comment"># check structure like before</span> <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:duplex-list - <span class="Constant">4</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">4</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">5</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">5</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">6</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">7</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">7</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">8</span>:boolean<span class="Special"> <- </span>equal <span class="Constant">1</span>:address:duplex-list, <span class="Constant">2</span>:address:duplex-list ] memory-should-contain [ @@ -339,12 +339,12 @@ container duplex-list [ <span class="Constant">1</span>:address:duplex-list<span class="Special"> <- </span>remove-duplex <span class="Constant">1</span>:address:duplex-list <span class="Comment"># check structure like before</span> <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:duplex-list - <span class="Constant">3</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">3</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">4</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">4</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">5</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">6</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">6</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">7</span>:boolean<span class="Special"> <- </span>equal <span class="Constant">1</span>:address:duplex-list, <span class="Constant">2</span>:address:duplex-list ] memory-should-contain [ @@ -369,12 +369,12 @@ container duplex-list [ <span class="Constant">3</span>:boolean<span class="Special"> <- </span>equal <span class="Constant">2</span>:address:duplex-list, <span class="Constant">0</span> <span class="Comment"># check structure like before</span> <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:duplex-list - <span class="Constant">4</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">4</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">5</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">5</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">6</span>:address:duplex-list<span class="Special"> <- </span>next-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>prev-duplex <span class="Constant">2</span>:address:duplex-list - <span class="Constant">7</span>:number<span class="Special"> <- </span>first <span class="Constant">2</span>:address:duplex-list + <span class="Constant">7</span>:number<span class="Special"> <- </span>first-duplex <span class="Constant">2</span>:address:duplex-list <span class="Constant">8</span>:boolean<span class="Special"> <- </span>equal <span class="Constant">1</span>:address:duplex-list, <span class="Constant">2</span>:address:duplex-list ] memory-should-contain [ @@ -392,8 +392,8 @@ container duplex-list [ <span class="Constant">1</span>:address:duplex-list<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># 1 points to singleton list</span> <span class="Constant">1</span>:address:duplex-list<span class="Special"> <- </span>push-duplex <span class="Constant">3</span>, <span class="Constant">1</span>:address:duplex-list <span class="Constant">2</span>:address:duplex-list<span class="Special"> <- </span>remove-duplex <span class="Constant">1</span>:address:duplex-list - <span class="Constant">3</span>:address:duplex-list<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:duplex-list, next:offset - <span class="Constant">4</span>:address:duplex-list<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:duplex-list, prev:offset + <span class="Constant">3</span>:address:duplex-list<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:duplex-list, <span class="Constant">next:offset</span> + <span class="Constant">4</span>:address:duplex-list<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:duplex-list, <span class="Constant">prev:offset</span> ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> <- </span><span class="Constant">0</span> <span class="Comment"># remove returned null</span> diff --git a/html/066stream.mu.html b/html/066stream.mu.html index ad7aebdf..2535cd8f 100644 --- a/html/066stream.mu.html +++ b/html/066stream.mu.html @@ -13,11 +13,11 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } -.muControl { color: #c0a020; } --> </style> @@ -37,10 +37,10 @@ container stream [ <span class="muRecipe">recipe</span> new-stream [ <span class="Constant">local-scope</span> - result:address:stream<span class="Special"> <- </span>new stream:type - i:address:number<span class="Special"> <- </span>get-address *result, index:offset + result:address:stream<span class="Special"> <- </span>new <span class="Constant">stream:type</span> + i:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">index:offset</span> *i<span class="Special"> <- </span>copy <span class="Constant">0</span> - d:address:address:array:character<span class="Special"> <- </span>get-address *result, data:offset + d:address:address:array:character<span class="Special"> <- </span>get-address *result, <span class="Constant">data:offset</span> *d<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="muControl">reply</span> result ] @@ -48,7 +48,7 @@ container stream [ <span class="muRecipe">recipe</span> rewind-stream [ <span class="Constant">local-scope</span> in:address:stream<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - x:address:number<span class="Special"> <- </span>get-address *in, index:offset + x:address:number<span class="Special"> <- </span>get-address *in, <span class="Constant">index:offset</span> *x<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="muControl">reply</span> in/same-as-arg:<span class="Constant">0</span> ] @@ -56,8 +56,8 @@ container stream [ <span class="muRecipe">recipe</span> read-line [ <span class="Constant">local-scope</span> in:address:stream<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - idx:address:number<span class="Special"> <- </span>get-address *in, index:offset - s:address:array:character<span class="Special"> <- </span>get *in, data:offset + idx:address:number<span class="Special"> <- </span>get-address *in, <span class="Constant">index:offset</span> + s:address:array:character<span class="Special"> <- </span>get *in, <span class="Constant">data:offset</span> next-idx:number<span class="Special"> <- </span>find-next s, <span class="Constant">10/newline</span>, *idx result:address:array:character<span class="Special"> <- </span>string-copy s, *idx, next-idx *idx<span class="Special"> <- </span>add next-idx, <span class="Constant">1</span> <span class="Comment"># skip newline</span> @@ -67,8 +67,8 @@ container stream [ <span class="muRecipe">recipe</span> end-of-stream? [ <span class="Constant">local-scope</span> in:address:stream<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - idx:address:number<span class="Special"> <- </span>get *in, index:offset - s:address:array:character<span class="Special"> <- </span>get *in, data:offset + idx:address:number<span class="Special"> <- </span>get *in, <span class="Constant">index:offset</span> + s:address:array:character<span class="Special"> <- </span>get *in, <span class="Constant">data:offset</span> len:number<span class="Special"> <- </span>length *s result:boolean<span class="Special"> <- </span>greater-or-equal idx, len <span class="muControl">reply</span> result diff --git a/html/071print.mu.html b/html/071print.mu.html index fb8d0ae7..8e21896f 100644 --- a/html/071print.mu.html +++ b/html/071print.mu.html @@ -13,14 +13,14 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } -.Delimiter { color: #a04060; } .muScenario { color: #00af00; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } .CommentedCode { color: #6c6c6c; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> @@ -50,18 +50,18 @@ container screen-cell [ <span class="muRecipe">recipe</span> new-fake-screen [ <span class="Constant">local-scope</span> - result:address:screen<span class="Special"> <- </span>new screen:type - width:address:number<span class="Special"> <- </span>get-address *result, num-columns:offset + result:address:screen<span class="Special"> <- </span>new <span class="Constant">screen:type</span> + width:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">num-columns:offset</span> *width<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - height:address:number<span class="Special"> <- </span>get-address *result, num-rows:offset + height:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">num-rows:offset</span> *height<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - row:address:number<span class="Special"> <- </span>get-address *result, cursor-row:offset + row:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">cursor-row:offset</span> *row<span class="Special"> <- </span>copy <span class="Constant">0</span> - column:address:number<span class="Special"> <- </span>get-address *result, cursor-column:offset + column:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">cursor-column:offset</span> *column<span class="Special"> <- </span>copy <span class="Constant">0</span> bufsize:number<span class="Special"> <- </span>multiply *width, *height - buf:address:address:array:screen-cell<span class="Special"> <- </span>get-address *result, data:offset - *buf<span class="Special"> <- </span>new screen-cell:type, bufsize + buf:address:address:array:screen-cell<span class="Special"> <- </span>get-address *result, <span class="Constant">data:offset</span> + *buf<span class="Special"> <- </span>new <span class="Constant">screen-cell:type</span>, bufsize clear-screen result <span class="muControl">reply</span> result ] @@ -73,24 +73,24 @@ container screen-cell [ <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc <span class="Comment"># clear fake screen</span> - buf:address:array:screen-cell<span class="Special"> <- </span>get *sc, data:offset + buf:address:array:screen-cell<span class="Special"> <- </span>get *sc, <span class="Constant">data:offset</span> max:number<span class="Special"> <- </span>length *buf i:number<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>greater-or-equal i, max <span class="muControl">break-if</span> done? curr:address:screen-cell<span class="Special"> <- </span>index-address *buf, i - curr-content:address:character<span class="Special"> <- </span>get-address *curr, contents:offset + curr-content:address:character<span class="Special"> <- </span>get-address *curr, <span class="Constant">contents:offset</span> *curr-content<span class="Special"> <- </span>copy <span class="Constant">[ ]</span> - curr-color:address:character<span class="Special"> <- </span>get-address *curr, color:offset + curr-color:address:character<span class="Special"> <- </span>get-address *curr, <span class="Constant">color:offset</span> *curr-color<span class="Special"> <- </span>copy <span class="Constant">7/white</span> i<span class="Special"> <- </span>add i, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># reset cursor</span> - x:address:number<span class="Special"> <- </span>get-address *sc, cursor-row:offset + x:address:number<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-row:offset</span> *x<span class="Special"> <- </span>copy <span class="Constant">0</span> - x<span class="Special"> <- </span>get-address *sc, cursor-column:offset + x<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> *x<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> @@ -103,14 +103,14 @@ container screen-cell [ <span class="Constant">local-scope</span> sc:address:screen<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="muControl">reply-unless</span> sc, <span class="Constant">1/true</span> - buf:address:array:screen-cell<span class="Special"> <- </span>get *sc, data:offset + buf:address:array:screen-cell<span class="Special"> <- </span>get *sc, <span class="Constant">data:offset</span> i:number<span class="Special"> <- </span>copy <span class="Constant">0</span> len:number<span class="Special"> <- </span>length *buf <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>greater-or-equal i, len <span class="muControl">break-if</span> done? curr:screen-cell<span class="Special"> <- </span>index *buf, i - curr-contents:character<span class="Special"> <- </span>get curr, contents:offset + curr-contents:character<span class="Special"> <- </span>get curr, <span class="Constant">contents:offset</span> i<span class="Special"> <- </span>add i, <span class="Constant">1</span> <span class="muControl">loop-unless</span> curr-contents <span class="Comment"># not 0</span> @@ -140,15 +140,15 @@ container screen-cell [ <span class="Comment"># if x exists</span> <span class="Comment"># (handle special cases exactly like in the real screen)</span> <span class="muControl">break-unless</span> sc - width:number<span class="Special"> <- </span>get *sc, num-columns:offset - height:number<span class="Special"> <- </span>get *sc, num-rows:offset + width:number<span class="Special"> <- </span>get *sc, <span class="Constant">num-columns:offset</span> + height:number<span class="Special"> <- </span>get *sc, <span class="Constant">num-rows:offset</span> <span class="Comment"># if cursor is out of bounds, silently exit</span> - row:address:number<span class="Special"> <- </span>get-address *sc, cursor-row:offset + row:address:number<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-row:offset</span> legal?:boolean<span class="Special"> <- </span>greater-or-equal *row, <span class="Constant">0</span> <span class="muControl">reply-unless</span> legal?, sc legal?<span class="Special"> <- </span>lesser-than *row, height <span class="muControl">reply-unless</span> legal?, sc - column:address:number<span class="Special"> <- </span>get-address *sc, cursor-column:offset + column:address:number<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> legal?<span class="Special"> <- </span>greater-or-equal *column, <span class="Constant">0</span> <span class="muControl">reply-unless</span> legal?, sc legal?<span class="Special"> <- </span>lesser-than *column, width @@ -172,7 +172,7 @@ container screen-cell [ <span class="Comment"># save character in fake screen</span> index:number<span class="Special"> <- </span>multiply *row, width index<span class="Special"> <- </span>add index, *column - buf:address:array:screen-cell<span class="Special"> <- </span>get *sc, data:offset + buf:address:array:screen-cell<span class="Special"> <- </span>get *sc, <span class="Constant">data:offset</span> len:number<span class="Special"> <- </span>length *buf <span class="Comment"># special-case: backspace</span> <span class="Delimiter">{</span> @@ -186,18 +186,18 @@ container screen-cell [ *column<span class="Special"> <- </span>subtract *column, <span class="Constant">1</span> index<span class="Special"> <- </span>subtract index, <span class="Constant">1</span> cursor:address:screen-cell<span class="Special"> <- </span>index-address *buf, index - cursor-contents:address:character<span class="Special"> <- </span>get-address *cursor, contents:offset + cursor-contents:address:character<span class="Special"> <- </span>get-address *cursor, <span class="Constant">contents:offset</span> *cursor-contents<span class="Special"> <- </span>copy <span class="Constant">32/space</span> - cursor-color:address:number<span class="Special"> <- </span>get-address *cursor, color:offset + cursor-color:address:number<span class="Special"> <- </span>get-address *cursor, <span class="Constant">color:offset</span> *cursor-color<span class="Special"> <- </span>copy <span class="Constant">7/white</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> <span class="CommentedCode">#? $print [saving character ], c, [ to fake screen ], cursor, 10/newline</span> cursor:address:screen-cell<span class="Special"> <- </span>index-address *buf, index - cursor-contents:address:character<span class="Special"> <- </span>get-address *cursor, contents:offset + cursor-contents:address:character<span class="Special"> <- </span>get-address *cursor, <span class="Constant">contents:offset</span> *cursor-contents<span class="Special"> <- </span>copy c - cursor-color:address:number<span class="Special"> <- </span>get-address *cursor, color:offset + cursor-color:address:number<span class="Special"> <- </span>get-address *cursor, <span class="Constant">color:offset</span> *cursor-color<span class="Special"> <- </span>copy color <span class="Comment"># increment column unless it's already all the way to the right</span> <span class="Delimiter">{</span> @@ -218,7 +218,7 @@ container screen-cell [ <span class="CommentedCode">#? $start-tracing #? 3</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> - <span class="Constant">2</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, data:offset + <span class="Constant">2</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">3</span>:array:screen-cell<span class="Special"> <- </span>copy *<span class="Constant">2</span>:address:array:screen-cell ] memory-should-contain [ @@ -233,7 +233,7 @@ container screen-cell [ run [ <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97/a</span>, <span class="Constant">1/red</span> - <span class="Constant">2</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, data:offset + <span class="Constant">2</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">3</span>:array:screen-cell<span class="Special"> <- </span>copy *<span class="Constant">2</span>:address:array:screen-cell ] memory-should-contain [ @@ -250,8 +250,8 @@ container screen-cell [ <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">8</span> <span class="Comment"># backspace</span> - <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, cursor-column:offset - <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, data:offset + <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> + <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">4</span>:array:screen-cell<span class="Special"> <- </span>copy *<span class="Constant">3</span>:address:array:screen-cell ] memory-should-contain [ @@ -269,8 +269,8 @@ container screen-cell [ <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">8</span> <span class="Comment"># backspace</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">8</span> <span class="Comment"># backspace</span> - <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, cursor-column:offset - <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, data:offset + <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> + <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">4</span>:array:screen-cell<span class="Special"> <- </span>copy *<span class="Constant">3</span>:address:array:screen-cell ] memory-should-contain [ @@ -288,8 +288,8 @@ container screen-cell [ <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">98</span> <span class="Comment"># 'b'</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">99</span> <span class="Comment"># 'c'</span> - <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, cursor-column:offset - <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, data:offset + <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> + <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">4</span>:array:screen-cell<span class="Special"> <- </span>copy *<span class="Constant">3</span>:address:array:screen-cell ] memory-should-contain [ @@ -309,9 +309,9 @@ container screen-cell [ <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> - <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, cursor-row:offset - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, cursor-column:offset - <span class="Constant">4</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, data:offset + <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-row:offset</span> + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> + <span class="Constant">4</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">5</span>:array:screen-cell<span class="Special"> <- </span>copy *<span class="Constant">4</span>:address:array:screen-cell ] memory-should-contain [ @@ -330,8 +330,8 @@ container screen-cell [ <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> - <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, cursor-row:offset - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, cursor-column:offset + <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-row:offset</span> + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">2</span><span class="Special"> <- </span><span class="Constant">1</span> <span class="Comment"># cursor row</span> @@ -348,9 +348,9 @@ container screen-cell [ <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">99</span> <span class="Comment"># 'c'</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">10/newline</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-character <span class="Constant">1</span>:address:screen, <span class="Constant">100</span> <span class="Comment"># 'd'</span> - <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, cursor-row:offset - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, cursor-column:offset - <span class="Constant">4</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, data:offset + <span class="Constant">2</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-row:offset</span> + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">cursor-column:offset</span> + <span class="Constant">4</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">5</span>:array:screen-cell<span class="Special"> <- </span>copy *<span class="Constant">4</span>:address:array:screen-cell ] memory-should-contain [ @@ -375,8 +375,8 @@ container screen-cell [ <span class="Comment"># if x exists, clear line in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc - width:number<span class="Special"> <- </span>get *sc, num-columns:offset - column:address:number<span class="Special"> <- </span>get-address *sc, cursor-column:offset + width:number<span class="Special"> <- </span>get *sc, <span class="Constant">num-columns:offset</span> + column:address:number<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> original-column:number<span class="Special"> <- </span>copy *column <span class="Comment"># space over the entire line</span> <span class="CommentedCode">#? $start-tracing #? 1</span> @@ -403,8 +403,8 @@ container screen-cell [ <span class="Comment"># if x exists, lookup cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc - row:number<span class="Special"> <- </span>get *sc, cursor-row:offset - column:number<span class="Special"> <- </span>get *sc, cursor-column:offset + row:number<span class="Special"> <- </span>get *sc, <span class="Constant">cursor-row:offset</span> + column:number<span class="Special"> <- </span>get *sc, <span class="Constant">cursor-column:offset</span> <span class="muControl">reply</span> row, column, sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> row, column<span class="Special"> <- </span>cursor-position-on-display @@ -419,9 +419,9 @@ container screen-cell [ <span class="Comment"># if x exists, move cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc - row:address:number<span class="Special"> <- </span>get-address *sc, cursor-row:offset + row:address:number<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-row:offset</span> *row<span class="Special"> <- </span>copy new-row - column:address:number<span class="Special"> <- </span>get-address *sc, cursor-column:offset + column:address:number<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> *column<span class="Special"> <- </span>copy new-column <span class="muControl">reply</span> sc/same-as-ingredient:<span class="Constant">0</span> <span class="Delimiter">}</span> @@ -440,7 +440,7 @@ container screen-cell [ <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>move-cursor <span class="Constant">1</span>:address:screen, <span class="Constant">0/row</span>, <span class="Constant">0/column</span> <span class="Comment"># clear line</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>clear-line <span class="Constant">1</span>:address:screen - <span class="Constant">2</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, data:offset + <span class="Constant">2</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">3</span>:array:screen-cell<span class="Special"> <- </span>copy *<span class="Constant">2</span>:address:array:screen-cell ] <span class="Comment"># screen should be blank</span> @@ -469,8 +469,8 @@ container screen-cell [ <span class="muControl">break-unless</span> sc <span class="Delimiter">{</span> <span class="Comment"># if row < height-1</span> - height:number<span class="Special"> <- </span>get *sc, num-rows:offset - row:address:number<span class="Special"> <- </span>get-address *sc, cursor-row:offset + height:number<span class="Special"> <- </span>get *sc, <span class="Constant">num-rows:offset</span> + row:address:number<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-row:offset</span> max:number<span class="Special"> <- </span>subtract height, <span class="Constant">1</span> at-bottom?:boolean<span class="Special"> <- </span>greater-or-equal *row, max <span class="muControl">break-if</span> at-bottom? @@ -492,7 +492,7 @@ container screen-cell [ <span class="muControl">break-unless</span> sc <span class="Delimiter">{</span> <span class="Comment"># if row > 0</span> - row:address:number<span class="Special"> <- </span>get-address *sc, cursor-row:offset + row:address:number<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-row:offset</span> at-top?:boolean<span class="Special"> <- </span>lesser-or-equal *row, <span class="Constant">0</span> <span class="muControl">break-if</span> at-top? <span class="Comment"># row = row-1</span> @@ -513,8 +513,8 @@ container screen-cell [ <span class="muControl">break-unless</span> sc <span class="Delimiter">{</span> <span class="Comment"># if column < width-1</span> - width:number<span class="Special"> <- </span>get *sc, num-columns:offset - column:address:number<span class="Special"> <- </span>get-address *sc, cursor-column:offset + width:number<span class="Special"> <- </span>get *sc, <span class="Constant">num-columns:offset</span> + column:address:number<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> max:number<span class="Special"> <- </span>subtract width, <span class="Constant">1</span> at-bottom?:boolean<span class="Special"> <- </span>greater-or-equal *column, max <span class="muControl">break-if</span> at-bottom? @@ -536,7 +536,7 @@ container screen-cell [ <span class="muControl">break-unless</span> sc <span class="Delimiter">{</span> <span class="Comment"># if column > 0</span> - column:address:number<span class="Special"> <- </span>get-address *sc, cursor-column:offset + column:address:number<span class="Special"> <- </span>get-address *sc, <span class="Constant">cursor-column:offset</span> at-top?:boolean<span class="Special"> <- </span>lesser-or-equal *column, <span class="Constant">0</span> <span class="muControl">break-if</span> at-top? <span class="Comment"># column = column-1</span> @@ -572,7 +572,7 @@ container screen-cell [ <span class="Comment"># if x exists, move cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc - width:number<span class="Special"> <- </span>get *sc, num-columns:offset + width:number<span class="Special"> <- </span>get *sc, <span class="Constant">num-columns:offset</span> <span class="muControl">reply</span> width <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> @@ -586,7 +586,7 @@ container screen-cell [ <span class="Comment"># if x exists, move cursor in fake screen</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sc - height:number<span class="Special"> <- </span>get *sc, num-rows:offset + height:number<span class="Special"> <- </span>get *sc, <span class="Constant">num-rows:offset</span> <span class="muControl">reply</span> height <span class="Delimiter">}</span> <span class="Comment"># otherwise, real screen</span> @@ -680,7 +680,7 @@ container screen-cell [ <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abcd]</span> <span class="Constant">1</span>:address:screen<span class="Special"> <- </span>print-string <span class="Constant">1</span>:address:screen, <span class="Constant">2</span>:address:array:character - <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, data:offset + <span class="Constant">3</span>:address:array:screen-cell<span class="Special"> <- </span>get *<span class="Constant">1</span>:address:screen, <span class="Constant">data:offset</span> <span class="Constant">4</span>:array:screen-cell<span class="Special"> <- </span>copy *<span class="Constant">3</span>:address:array:screen-cell ] memory-should-contain [ diff --git a/html/072scenario_screen.cc.html b/html/072scenario_screen.cc.html index 44757729..62c58b4a 100644 --- a/html/072scenario_screen.cc.html +++ b/html/072scenario_screen.cc.html @@ -13,10 +13,10 @@ 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; } +.traceAbsent { color: #c00000; } .traceContains { color: #008000; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } -.traceAbsent { color: #c00000; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/074console.mu.html b/html/074console.mu.html index 53c01cfe..d292d918 100644 --- a/html/074console.mu.html +++ b/html/074console.mu.html @@ -13,12 +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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } -.Delimiter { color: #a04060; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> @@ -53,10 +53,10 @@ container console [ <span class="muRecipe">recipe</span> new-fake-console [ <span class="Constant">local-scope</span> - result:address:console<span class="Special"> <- </span>new console:type - buf:address:address:array:character<span class="Special"> <- </span>get-address *result, data:offset + result:address:console<span class="Special"> <- </span>new <span class="Constant">console:type</span> + buf:address:address:array:character<span class="Special"> <- </span>get-address *result, <span class="Constant">data:offset</span> *buf<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - idx:address:number<span class="Special"> <- </span>get-address *result, index:offset + idx:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">index:offset</span> *idx<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="muControl">reply</span> result ] @@ -66,13 +66,13 @@ container console [ x:address:console<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> x - idx:address:number<span class="Special"> <- </span>get-address *x, index:offset - buf:address:array:event<span class="Special"> <- </span>get *x, data:offset + idx:address:number<span class="Special"> <- </span>get-address *x, <span class="Constant">index:offset</span> + buf:address:array:event<span class="Special"> <- </span>get *x, <span class="Constant">data:offset</span> <span class="Delimiter">{</span> max:number<span class="Special"> <- </span>length *buf done?:boolean<span class="Special"> <- </span>greater-or-equal *idx, max <span class="muControl">break-unless</span> done? - dummy:address:event<span class="Special"> <- </span>new event:type + dummy:address:event<span class="Special"> <- </span>new <span class="Constant">event:type</span> <span class="muControl">reply</span> *dummy, x/same-as-ingredient:<span class="Constant">0</span>, <span class="Constant">1/found</span>, <span class="Constant">1/quit</span> <span class="Delimiter">}</span> result:event<span class="Special"> <- </span>index *buf, *idx @@ -94,7 +94,7 @@ container console [ x:event, console, found?:boolean, quit?:boolean<span class="Special"> <- </span>read-event console <span class="muControl">reply-if</span> quit?, <span class="Constant">0</span>, console/same-as-ingredient:<span class="Constant">0</span>, found?, quit? <span class="muControl">reply-unless</span> found?, <span class="Constant">0</span>, console/same-as-ingredient:<span class="Constant">0</span>, found?, quit? - c:address:character<span class="Special"> <- </span>maybe-convert x, text:variant + c:address:character<span class="Special"> <- </span>maybe-convert x, <span class="Constant">text:variant</span> <span class="muControl">reply-unless</span> c, <span class="Constant">0</span>, console/same-as-ingredient:<span class="Constant">0</span>, <span class="Constant">0/found</span>, <span class="Constant">0/quit</span> <span class="muControl">reply</span> *c, console/same-as-ingredient:<span class="Constant">0</span>, <span class="Constant">1/found</span>, <span class="Constant">0/quit</span> ] diff --git a/html/075scenario_console.cc.html b/html/075scenario_console.cc.html index 3b965fdb..ed5c2a19 100644 --- a/html/075scenario_console.cc.html +++ b/html/075scenario_console.cc.html @@ -13,8 +13,8 @@ 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; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } diff --git a/html/080trace_browser.cc.html b/html/080trace_browser.cc.html index f2139f3f..2f47c417 100644 --- a/html/080trace_browser.cc.html +++ b/html/080trace_browser.cc.html @@ -13,8 +13,8 @@ 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; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Identifier { color: #804000; } diff --git a/html/081run_interactive.cc.html b/html/081run_interactive.cc.html index 03c1f523..4ece36af 100644 --- a/html/081run_interactive.cc.html +++ b/html/081run_interactive.cc.html @@ -14,8 +14,8 @@ 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; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } @@ -53,6 +53,7 @@ recipe main [ <span class="Comment">//: stringified output in case we want to print it to screen</span> <span class="Comment">//: any warnings encountered</span> <span class="Comment">//: simulated screen any prints went to</span> +<span class="Comment">//: any 'app' layer traces generated</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> @@ -68,12 +69,13 @@ case RUN_INTERACTIVE: <span class="Delimiter">{</span> raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": first ingredient of 'run-interactive' should be a literal string, but got "</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>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">3</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>resize<span class="Delimiter">(</span><span class="Constant">4</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> + 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>trace_contents<span class="Delimiter">(</span><span class="Constant">"warn"</span><span class="Delimiter">));</span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</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">3</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>trace_contents<span class="Delimiter">(</span><span class="Constant">"app"</span><span class="Delimiter">));</span> clean_up_interactive<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> @@ -115,7 +117,8 @@ bool run_interactive<span class="Delimiter">(</span>long long int address<span c 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> - Trace_stream<span class="Delimiter">-></span>collect_layer = <span class="Constant">"warn"</span><span class="Delimiter">;</span> + Trace_stream<span class="Delimiter">-></span>collect_layers<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">"warn"</span><span class="Delimiter">);</span> + Trace_stream<span class="Delimiter">-></span>collect_layers<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">"app"</span><span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Comment">// call run(string) but without the scheduling</span> <span class="Comment">// we won't create a local scope so that we can get to the new screen after</span> @@ -183,7 +186,15 @@ void record_products<span class="Delimiter">(</span>const instruction& instr 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> - 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> + if <span class="Delimiter">(</span>is_mu_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> + if <span class="Delimiter">(</span>!scalar<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span> + tb_shutdown<span class="Delimiter">();</span> + cerr << read_mu_string<span class="Delimiter">(</span>trace_contents<span class="Delimiter">(</span><span class="Constant">"warn"</span><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> + cerr << SIZE<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <span class="Constant">": "</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> + cerr << 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> + cerr << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> + <span class="Delimiter">}</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 << read_mu_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> @@ -198,7 +209,7 @@ void record_products<span class="Delimiter">(</span>const instruction& instr <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">3</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">4</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> @@ -206,7 +217,7 @@ if <span class="Delimiter">(</span>current_instruction<span class="Delimiter">() 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> + warnings<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_contents<span class="Delimiter">(</span><span class="Constant">"warn"</span><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> if <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> >= <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -214,6 +225,12 @@ if <span class="Delimiter">(</span>current_instruction<span class="Delimiter">() screen<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>Memory[SCREEN]<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">2</span><span class="Delimiter">),</span> screen<span class="Delimiter">);</span> <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">4</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span class="CommentedCode">//? cerr << "emitting trace\n"; //? 1</span> + vector<double> trace<span class="Delimiter">;</span> + trace<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_contents<span class="Delimiter">(</span><span class="Constant">"app"</span><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">3</span><span class="Delimiter">),</span> trace<span class="Delimiter">);</span> + <span class="Delimiter">}</span> <span class="Delimiter">}</span> <span class="Comment">//: clean up reply after we've popped it off the call-stack</span> @@ -231,8 +248,8 @@ void clean_up_interactive<span class="Delimiter">()</span> <span class="Delimite Trace_stream<span class="Delimiter">-></span>newline<span class="Delimiter">();</span> <span class="Comment">// flush trace</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="Comment">// hack: assume collect_layer isn't set anywhere else</span> - if <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>collect_layer == <span class="Constant">"warn"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> + <span class="Comment">// hack: assume collect_layers isn't set anywhere else</span> + if <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>is_narrowly_collecting<span class="Delimiter">(</span><span class="Constant">"warn"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> delete Trace_stream<span class="Delimiter">;</span> Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -275,23 +292,26 @@ long long int stringified_value_of_location<span class="Delimiter">(</span>long <span class="Identifier">return</span> new_mu_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> +bool is_mu_string<span class="Delimiter">(</span>const reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>types<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> -long long int warnings_from_trace<span class="Delimiter">()</span> <span class="Delimiter">{</span> +long long int trace_contents<span class="Delimiter">(</span>const string& layer<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> +<span class="CommentedCode">//? cerr << "trace stream exists\n"; //? 1</span> + if <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span>layer<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> +<span class="CommentedCode">//? cerr << layer << " has something\n"; //? 1</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> + if <span class="Delimiter">(</span>p<span class="Delimiter">-></span>label != layer<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="CommentedCode">//? cerr << layer << ":\n" << out.str() << "\n--\n"; //? 1</span> <span class="Identifier">return</span> new_mu_string<span class="Delimiter">(</span>out<span class="Delimiter">.</span>str<span class="Delimiter">());</span> <span class="Delimiter">}</span> @@ -314,7 +334,7 @@ case RELOAD: <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> - Trace_stream<span class="Delimiter">-></span>collect_layer = <span class="Constant">"warn"</span><span class="Delimiter">;</span> + Trace_stream<span class="Delimiter">-></span>collect_layers<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">"warn"</span><span class="Delimiter">);</span> <span class="Delimiter">}</span> Hide_warnings = <span class="Constant">true</span><span class="Delimiter">;</span> Disable_redefine_warnings = <span class="Constant">true</span><span class="Delimiter">;</span> @@ -324,8 +344,9 @@ case RELOAD: <span class="Delimiter">{</span> Disable_redefine_warnings = <span class="Constant">false</span><span class="Delimiter">;</span> Hide_warnings = <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> - if <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>collect_layer == <span class="Constant">"warn"</span><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>trace_contents<span class="Delimiter">(</span><span class="Constant">"warn"</span><span class="Delimiter">));</span> + <span class="Comment">// hack: assume collect_layers isn't set anywhere else</span> + if <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>is_narrowly_collecting<span class="Delimiter">(</span><span class="Constant">"warn"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> delete Trace_stream<span class="Delimiter">;</span> Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> diff --git a/html/082persist.cc.html b/html/082persist.cc.html index bb5582ee..0984d488 100644 --- a/html/082persist.cc.html +++ b/html/082persist.cc.html @@ -13,8 +13,8 @@ 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; } -.cSpecial { color: #008000; } .Constant { color: #00a0a0; } +.cSpecial { color: #008000; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Identifier { color: #804000; } @@ -45,14 +45,20 @@ case RESTORE: <span class="Delimiter">{</span> raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": 'restore' requires exactly one ingredient, but got "</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - if <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> - raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": first ingredient of 'restore' should be a literal string, but got "</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>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> - products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> + string filename<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>is_literal_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> <span class="Delimiter">{</span> + filename = 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> + else if <span class="Delimiter">(</span>is_mu_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> <span class="Delimiter">{</span> + filename = read_mu_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="Delimiter">}</span> + else <span class="Delimiter">{</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": first ingredient of 'restore' should be a string, but got "</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>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> + <span class="Identifier">break</span><span class="Delimiter">;</span> + <span class="Delimiter">}</span> if <span class="Delimiter">(</span>Current_scenario<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// do nothing in tests</span> - string filename = 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> - 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> - filename = 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> string contents = slurp<span class="Delimiter">(</span><span class="Constant">"lesson/"</span>+filename<span class="Delimiter">);</span> + products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> if <span class="Delimiter">(</span>contents<span class="Delimiter">.</span>empty<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> else @@ -89,21 +95,30 @@ case SAVE: <span class="Delimiter">{</span> raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": 'save' requires exactly two ingredients, but got "</span> << current_instruction<span class="Delimiter">().</span>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> - if <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> - raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": first ingredient of 'save' should be a literal string, but got "</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>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> - if <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> - raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": second ingredient of 'save' should be an address:array:character, but got "</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>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> if <span class="Delimiter">(</span>Current_scenario<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// do nothing in tests</span> - string filename = 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> - 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> - filename = 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> + string filename<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>is_literal_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> <span class="Delimiter">{</span> + filename = 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> + else if <span class="Delimiter">(</span>is_mu_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> <span class="Delimiter">{</span> + filename = read_mu_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="Delimiter">}</span> + else <span class="Delimiter">{</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": first ingredient of 'save' should be a string, but got "</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>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> + <span class="Identifier">break</span><span class="Delimiter">;</span> + <span class="Delimiter">}</span> + if <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> <span class="Delimiter">{</span> + raise << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">": second ingredient of 'save' should be an address:array:character, but got "</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>to_string<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> + <span class="Identifier">break</span><span class="Delimiter">;</span> + <span class="Delimiter">}</span> ofstream fout<span class="Delimiter">((</span><span class="Constant">"lesson/"</span>+filename<span class="Delimiter">).</span>c_str<span class="Delimiter">());</span> string contents = read_mu_string<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> fout << contents<span class="Delimiter">;</span> fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span> if <span class="Delimiter">(</span>!exists<span class="Delimiter">(</span><span class="Constant">"lesson/.git"</span><span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// bug in git: git diff -q messes up --exit-code</span> - int status = system<span class="Delimiter">(</span><span class="Constant">"cd lesson; git add .; git diff HEAD --exit-code >/dev/null || git commit -a -m . >/dev/null"</span><span class="Delimiter">);</span> + <span class="Comment">// explicitly say '--all' for git 1.9</span> + int status = system<span class="Delimiter">(</span><span class="Constant">"cd lesson; git add --all .; git diff HEAD --exit-code >/dev/null || git commit -a -m . >/dev/null"</span><span class="Delimiter">);</span> if <span class="Delimiter">(</span>status != <span class="Constant">0</span><span class="Delimiter">)</span> raise << <span class="Constant">"error in commit: contents "</span> << contents << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span class="Identifier">break</span><span class="Delimiter">;</span> diff --git a/html/callcc.mu.html b/html/callcc.mu.html index 20ebd83c..5e817501 100644 --- a/html/callcc.mu.html +++ b/html/callcc.mu.html @@ -13,11 +13,11 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } -.muControl { color: #c0a020; } --> </style> diff --git a/html/channel.mu.html b/html/channel.mu.html index 45450112..91f55497 100644 --- a/html/channel.mu.html +++ b/html/channel.mu.html @@ -13,12 +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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } -.Delimiter { color: #a04060; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> @@ -68,8 +68,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Constant">local-scope</span> chan:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">3</span> <span class="Comment"># create two background 'routines' that communicate by a channel</span> - routine1:number<span class="Special"> <- </span>start-running producer:<span class="muRecipe">recipe</span>, chan - routine2:number<span class="Special"> <- </span>start-running consumer:<span class="muRecipe">recipe</span>, chan + routine1:number<span class="Special"> <- </span>start-running <span class="Constant">producer:recipe</span>, chan + routine2:number<span class="Special"> <- </span>start-running <span class="Constant">consumer:recipe</span>, chan wait-for-routine routine1 wait-for-routine routine2 ] diff --git a/html/chessboard.mu.html b/html/chessboard.mu.html index d04f4df0..39ecd0bf 100644 --- a/html/chessboard.mu.html +++ b/html/chessboard.mu.html @@ -13,15 +13,15 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } -.Delimiter { color: #a04060; } .muScenario { color: #00af00; } .SalientComment { color: #00ffff; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } .CommentedCode { color: #6c6c6c; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> @@ -108,10 +108,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } board:address:array:address:array:character<span class="Special"> <- </span>initial-position <span class="Comment"># hook up stdin</span> stdin:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">10/capacity</span> - start-running send-keys-to-channel:<span class="muRecipe">recipe</span>, console, stdin, screen + start-running <span class="Constant">send-keys-to-channel:recipe</span>, console, stdin, screen <span class="Comment"># buffer lines in stdin</span> buffered-stdin:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">10/capacity</span> - start-running buffer-lines:<span class="muRecipe">recipe</span>, stdin, buffered-stdin + start-running <span class="Constant">buffer-lines:recipe</span>, stdin, buffered-stdin <span class="Delimiter">{</span> msg:address:array:character<span class="Special"> <- </span>new <span class="Constant">[Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves.</span> <span class="Constant">]</span> @@ -152,7 +152,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } correct-length?:boolean<span class="Special"> <- </span>equal len, <span class="Constant">64</span> assert correct-length?, <span class="Constant">[chessboard had incorrect size]</span> <span class="Comment"># board is an array of pointers to files; file is an array of characters</span> - board:address:array:address:array:character<span class="Special"> <- </span>new location:type, <span class="Constant">8</span> + board:address:array:address:array:character<span class="Special"> <- </span>new <span class="Constant">location:type</span>, <span class="Constant">8</span> col:number<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>equal col, <span class="Constant">8</span> @@ -170,7 +170,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } position:address:array:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> index:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> index<span class="Special"> <- </span>multiply index, <span class="Constant">8</span> - result:address:array:character<span class="Special"> <- </span>new character:type, <span class="Constant">8</span> + result:address:array:character<span class="Special"> <- </span>new <span class="Constant">character:type</span>, <span class="Constant">8</span> row:number<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>equal row, <span class="Constant">8</span> @@ -299,20 +299,20 @@ container move [ <span class="muControl">reply-if</span> quit?, <span class="Constant">0/dummy</span>, quit?, error? <span class="muControl">reply-if</span> error?, <span class="Constant">0/dummy</span>, quit?, error? <span class="Comment"># construct the move object</span> - result:address:move<span class="Special"> <- </span>new move:type - x:address:number<span class="Special"> <- </span>get-address *result, from-file:offset + result:address:move<span class="Special"> <- </span>new <span class="Constant">move:type</span> + x:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">from-file:offset</span> *x<span class="Special"> <- </span>copy from-file - x<span class="Special"> <- </span>get-address *result, from-rank:offset + x<span class="Special"> <- </span>get-address *result, <span class="Constant">from-rank:offset</span> *x, quit?, error?<span class="Special"> <- </span>read-rank stdin, screen <span class="muControl">reply-if</span> quit?, <span class="Constant">0/dummy</span>, quit?, error? <span class="muControl">reply-if</span> error?, <span class="Constant">0/dummy</span>, quit?, error? error?<span class="Special"> <- </span>expect-from-channel stdin, <span class="Constant">45/dash</span>, screen <span class="muControl">reply-if</span> error?, <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span>, error? - x<span class="Special"> <- </span>get-address *result, to-file:offset + x<span class="Special"> <- </span>get-address *result, <span class="Constant">to-file:offset</span> *x, quit?, error?<span class="Special"> <- </span>read-file stdin, screen <span class="muControl">reply-if</span> quit?:boolean, <span class="Constant">0/dummy</span>, quit?:boolean, error?:boolean <span class="muControl">reply-if</span> error?:boolean, <span class="Constant">0/dummy</span>, quit?:boolean, error?:boolean - x:address:number<span class="Special"> <- </span>get-address *result, to-rank:offset + x:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">to-rank:offset</span> *x, quit?, error?<span class="Special"> <- </span>read-rank stdin, screen <span class="muControl">reply-if</span> quit?, <span class="Constant">0/dummy</span>, quit?, error? <span class="muControl">reply-if</span> error?, <span class="Constant">0/dummy</span>, quit?, error? @@ -439,7 +439,7 @@ container move [ assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> run [ <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">2</span> - <span class="Constant">2</span>:number/routine<span class="Special"> <- </span>start-running read-move:<span class="muRecipe">recipe</span>, <span class="Constant">1</span>:address:channel, screen:address + <span class="Constant">2</span>:number/routine<span class="Special"> <- </span>start-running <span class="Constant">read-move:recipe</span>, <span class="Constant">1</span>:address:channel, screen:address <span class="Comment"># 'read-move' is waiting for input</span> wait-for-routine <span class="Constant">2</span>:number <span class="Constant">3</span>:number<span class="Special"> <- </span>routine-state <span class="Constant">2</span>:number/id @@ -511,7 +511,7 @@ F read-move-blocking: routine failed to terminate on newline] assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> run [ <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">2</span> - <span class="Constant">2</span>:number/routine<span class="Special"> <- </span>start-running read-move:<span class="muRecipe">recipe</span>, <span class="Constant">1</span>:address:channel, screen:address + <span class="Constant">2</span>:number/routine<span class="Special"> <- </span>start-running <span class="Constant">read-move:recipe</span>, <span class="Constant">1</span>:address:channel, screen:address <span class="Comment"># 'read-move' is waiting for input</span> wait-for-routine <span class="Constant">2</span>:number <span class="Constant">3</span>:number<span class="Special"> <- </span>routine-state <span class="Constant">2</span>:number/id @@ -538,7 +538,7 @@ F read-move-quit: routine failed to terminate on 'q'] assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> run [ <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">2</span> - <span class="Constant">2</span>:number/routine<span class="Special"> <- </span>start-running read-move:<span class="muRecipe">recipe</span>, <span class="Constant">1</span>:address:channel, screen:address + <span class="Constant">2</span>:number/routine<span class="Special"> <- </span>start-running <span class="Constant">read-move:recipe</span>, <span class="Constant">1</span>:address:channel, screen:address <span class="Comment"># 'read-move' is waiting for input</span> wait-for-routine <span class="Constant">2</span>:number <span class="Constant">3</span>:number<span class="Special"> <- </span>routine-state <span class="Constant">2</span>:number/id @@ -559,7 +559,7 @@ F read-move-file: routine failed to pause <span class="muRecipe">after</span> co assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> run [ <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">2</span> - <span class="Constant">2</span>:number/routine<span class="Special"> <- </span>start-running read-move:<span class="muRecipe">recipe</span>, <span class="Constant">1</span>:address:channel, screen:address + <span class="Constant">2</span>:number/routine<span class="Special"> <- </span>start-running <span class="Constant">read-move:recipe</span>, <span class="Constant">1</span>:address:channel, screen:address <span class="Comment"># 'read-move' is waiting for input</span> wait-for-routine <span class="Constant">2</span>:number <span class="Constant">3</span>:number<span class="Special"> <- </span>routine-state <span class="Constant">2</span>:number/id @@ -581,7 +581,7 @@ F read-move-file: routine failed to pause <span class="muRecipe">after</span> co assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> run [ <span class="Constant">1</span>:address:channel<span class="Special"> <- </span>new-channel <span class="Constant">2</span> - <span class="Constant">2</span>:number/routine<span class="Special"> <- </span>start-running read-move:<span class="muRecipe">recipe</span>, <span class="Constant">1</span>:address:channel, screen:address + <span class="Constant">2</span>:number/routine<span class="Special"> <- </span>start-running <span class="Constant">read-move:recipe</span>, <span class="Constant">1</span>:address:channel, screen:address <span class="Comment"># 'read-move' is waiting for input</span> wait-for-routine <span class="Constant">2</span>:number <span class="Constant">3</span>:number<span class="Special"> <- </span>routine-state <span class="Constant">2</span>:number/id @@ -603,10 +603,10 @@ F read-move-file: routine failed to pause <span class="muRecipe">after</span> co <span class="Constant">local-scope</span> b:address:array:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> m:address:move<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - from-file:number<span class="Special"> <- </span>get *m, from-file:offset - from-rank:number<span class="Special"> <- </span>get *m, from-rank:offset - to-file:number<span class="Special"> <- </span>get *m, to-file:offset - to-rank:number<span class="Special"> <- </span>get *m, to-rank:offset + from-file:number<span class="Special"> <- </span>get *m, <span class="Constant">from-file:offset</span> + from-rank:number<span class="Special"> <- </span>get *m, <span class="Constant">from-rank:offset</span> + to-file:number<span class="Special"> <- </span>get *m, <span class="Constant">to-file:offset</span> + to-rank:number<span class="Special"> <- </span>get *m, <span class="Constant">to-rank:offset</span> f:address:array:character<span class="Special"> <- </span>index *b, from-file src:address:character/square<span class="Special"> <- </span>index-address *f, from-rank f<span class="Special"> <- </span>index *b, to-file @@ -620,14 +620,14 @@ F read-move-file: routine failed to pause <span class="muRecipe">after</span> co assume-screen <span class="Constant">30/width</span>, <span class="Constant">12/height</span> run [ <span class="Constant">2</span>:address:array:address:array:character/board<span class="Special"> <- </span>initial-position - <span class="Constant">3</span>:address:move<span class="Special"> <- </span>new move:type - <span class="Constant">4</span>:address:number<span class="Special"> <- </span>get-address *<span class="Constant">3</span>:address:move, from-file:offset + <span class="Constant">3</span>:address:move<span class="Special"> <- </span>new <span class="Constant">move:type</span> + <span class="Constant">4</span>:address:number<span class="Special"> <- </span>get-address *<span class="Constant">3</span>:address:move, <span class="Constant">from-file:offset</span> *<span class="Constant">4</span>:address:number<span class="Special"> <- </span>copy <span class="Constant">6/g</span> - <span class="Constant">5</span>:address:number<span class="Special"> <- </span>get-address *<span class="Constant">3</span>:address:move, from-rank:offset + <span class="Constant">5</span>:address:number<span class="Special"> <- </span>get-address *<span class="Constant">3</span>:address:move, <span class="Constant">from-rank:offset</span> *<span class="Constant">5</span>:address:number<span class="Special"> <- </span>copy <span class="Constant">1/'2'</span> - <span class="Constant">6</span>:address:number<span class="Special"> <- </span>get-address *<span class="Constant">3</span>:address:move, to-file:offset + <span class="Constant">6</span>:address:number<span class="Special"> <- </span>get-address *<span class="Constant">3</span>:address:move, <span class="Constant">to-file:offset</span> *<span class="Constant">6</span>:address:number<span class="Special"> <- </span>copy <span class="Constant">6/g</span> - <span class="Constant">7</span>:address:number<span class="Special"> <- </span>get-address *<span class="Constant">3</span>:address:move, to-rank:offset + <span class="Constant">7</span>:address:number<span class="Special"> <- </span>get-address *<span class="Constant">3</span>:address:move, <span class="Constant">to-rank:offset</span> *<span class="Constant">7</span>:address:number<span class="Special"> <- </span>copy <span class="Constant">3/'4'</span> <span class="Constant">2</span>:address:array:address:array:character/board<span class="Special"> <- </span>make-move <span class="Constant">2</span>:address:array:address:array:character/board, <span class="Constant">3</span>:address:move screen:address<span class="Special"> <- </span>print-board screen:address, <span class="Constant">2</span>:address:array:address:array:character/board diff --git a/html/console.mu.html b/html/console.mu.html index 8e0f4284..e30185f7 100644 --- a/html/console.mu.html +++ b/html/console.mu.html @@ -13,12 +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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } .Constant { color: #00a0a0; } .Comment { color: #9090ff; } .Delimiter { color: #a04060; } .Special { color: #ff6060; } -.muControl { color: #c0a020; } --> </style> diff --git a/html/counters.mu.html b/html/counters.mu.html index 926eca68..122724c0 100644 --- a/html/counters.mu.html +++ b/html/counters.mu.html @@ -13,11 +13,11 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } -.muControl { color: #c0a020; } --> </style> @@ -33,7 +33,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Comment"># (spaces)</span> <span class="muRecipe">recipe</span> new-counter [ - <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">30</span> + <span class="Constant">default-space</span>:address:array:location<span class="Special"> <- </span>new <span class="Constant">location:type</span>, <span class="Constant">30</span> n:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="muControl">reply</span> <span class="Constant">default-space</span> ] diff --git a/html/edit.mu.html b/html/edit.mu.html index fa1b442f..2e612a7c 100644 --- a/html/edit.mu.html +++ b/html/edit.mu.html @@ -13,15 +13,15 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } -.Delimiter { color: #a04060; } .muScenario { color: #00af00; } .SalientComment { color: #00ffff; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } .CommentedCode { color: #6c6c6c; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> @@ -33,7 +33,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } </head> <body> <pre id='vimCodeElement'> -<span class="Comment"># Environment for learning programming using mu.</span> +<span class="Comment"># Environment for learning programming using mu: <a href="http://akkartik.name/post/mu">http://akkartik.name/post/mu</a></span> +<span class="Comment">#</span> +<span class="Comment"># Consists of one editor on the left for recipes and one on the right for the</span> +<span class="Comment"># sandbox.</span> <span class="muRecipe">recipe</span> main [ <span class="Constant">local-scope</span> @@ -48,44 +51,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Comment"># never gets here</span> ] -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">local-scope</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 - height:number<span class="Special"> <- </span>screen-height screen - <span class="Comment"># top menu</span> - result:address:programming-environment-data<span class="Special"> <- </span>new programming-environment-data:type - draw-horizontal screen, <span class="Constant">0</span>, <span class="Constant">0/left</span>, width, <span class="Constant">32/space</span>, <span class="Constant">0/black</span>, <span class="Constant">238/grey</span> - button-start:number<span class="Special"> <- </span>subtract width, <span class="Constant">20</span> - button-on-screen?:boolean<span class="Special"> <- </span>greater-or-equal button-start, <span class="Constant">0</span> - assert button-on-screen?, <span class="Constant">[screen too narrow for menu]</span> - move-cursor screen, <span class="Constant">0/row</span>, button-start - run-button:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ run (F4) ]</span> - print-string screen, run-button, <span class="Constant">255/white</span>, <span class="Constant">161/reddish</span> - <span class="Comment"># dotted line down the middle</span> - divider:number, _<span class="Special"> <- </span>divide-with-remainder width, <span class="Constant">2</span> - draw-vertical screen, divider, <span class="Constant">1/top</span>, height, <span class="Constant">9482/vertical-dotted</span> - <span class="Comment"># recipe editor on the left</span> - recipes:address:address:editor-data<span class="Special"> <- </span>get-address *result, recipes:offset - *recipes<span class="Special"> <- </span>new-editor initial-recipe-contents, screen, <span class="Constant">0/left</span>, divider/right - <span class="Comment"># sandbox editor on the right</span> - new-left:number<span class="Special"> <- </span>add divider, <span class="Constant">1</span> - new-right:number<span class="Special"> <- </span>add new-left, <span class="Constant">5</span> - current-sandbox:address:address:editor-data<span class="Special"> <- </span>get-address *result, current-sandbox:offset - *current-sandbox<span class="Special"> <- </span>new-editor initial-sandbox-contents, screen, new-left, width/right - screen<span class="Special"> <- </span>render-all screen, result - <span class="muControl">reply</span> result -] +<span class="SalientComment">## the basic editor data structure, and how it displays text to the screen</span> <span class="muScenario">scenario</span> editor-initially-prints-string-to-screen [ assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> @@ -100,9 +66,6 @@ container programming-environment-data [ ] ] -<span class="SalientComment">## In which we introduce the editor data structure, and show how it displays</span> -<span class="SalientComment">## text to the screen.</span> - container editor-data [ <span class="Comment"># editable text: doubly linked list of characters (head contains a special sentinel)</span> data:address:duplex-list @@ -110,7 +73,7 @@ container editor-data [ before-cursor:address:duplex-list <span class="Comment"># raw bounds of display area on screen</span> - <span class="Comment"># always displays from row 1 and at most until bottom of screen</span> + <span class="Comment"># always displays from row 1 (leaving row 0 for a menu) and at most until bottom of screen</span> left:number right:number <span class="Comment"># raw screen coordinates of cursor</span> @@ -130,44 +93,52 @@ container editor-data [ 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<span class="Special"> <- </span>subtract right, <span class="Constant">1</span> - result:address:editor-data<span class="Special"> <- </span>new editor-data:type + result:address:editor-data<span class="Special"> <- </span>new <span class="Constant">editor-data:type</span> <span class="Comment"># initialize screen-related fields</span> - x:address:number<span class="Special"> <- </span>get-address *result, left:offset + x:address:number<span class="Special"> <- </span>get-address *result, <span class="Constant">left:offset</span> *x<span class="Special"> <- </span>copy left - x<span class="Special"> <- </span>get-address *result, right:offset + x<span class="Special"> <- </span>get-address *result, <span class="Constant">right:offset</span> *x<span class="Special"> <- </span>copy right <span class="Comment"># initialize cursor</span> - x<span class="Special"> <- </span>get-address *result, cursor-row:offset + x<span class="Special"> <- </span>get-address *result, <span class="Constant">cursor-row:offset</span> *x<span class="Special"> <- </span>copy <span class="Constant">1/top</span> - x<span class="Special"> <- </span>get-address *result, cursor-column:offset + x<span class="Special"> <- </span>get-address *result, <span class="Constant">cursor-column:offset</span> *x<span class="Special"> <- </span>copy left - init:address:address:duplex-list<span class="Special"> <- </span>get-address *result, data:offset + init:address:address:duplex-list<span class="Special"> <- </span>get-address *result, <span class="Constant">data:offset</span> *init<span class="Special"> <- </span>push-duplex <span class="Constant">167/§</span>, <span class="Constant">0/tail</span> - y:address:address:duplex-list<span class="Special"> <- </span>get-address *result, before-cursor:offset + y:address:address:duplex-list<span class="Special"> <- </span>get-address *result, <span class="Constant">before-cursor:offset</span> *y<span class="Special"> <- </span>copy *init - <span class="Comment"># early exit if s is empty</span> - <span class="muControl">reply-unless</span> s, result - len:number<span class="Special"> <- </span>length *s - <span class="muControl">reply-unless</span> len, result + result<span class="Special"> <- </span>insert-text result, s + <span class="Comment"># initialize cursor to top of screen</span> + y<span class="Special"> <- </span>get-address *result, <span class="Constant">before-cursor:offset</span> + *y<span class="Special"> <- </span>copy *init + <span class="Comment"># initial render to screen, just for some old tests</span> + _, screen<span class="Special"> <- </span>render screen, result + <span class="muControl">reply</span> result +] + +<span class="muRecipe">recipe</span> insert-text [ + <span class="Constant">local-scope</span> + editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + text:address:array:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Comment"># early exit if text is empty</span> + <span class="muControl">reply-unless</span> text, editor/same-as-ingredient:<span class="Constant">0</span> + len:number<span class="Special"> <- </span>length *text + <span class="muControl">reply-unless</span> len, editor/same-as-ingredient:<span class="Constant">0</span> idx:number<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># now we can start appending the rest, character by character</span> - curr:address:duplex-list<span class="Special"> <- </span>copy *init + curr:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">data:offset</span> <span class="Delimiter">{</span> done?:boolean<span class="Special"> <- </span>greater-or-equal idx, len <span class="muControl">break-if</span> done? - c:character<span class="Special"> <- </span>index *s, idx + c:character<span class="Special"> <- </span>index *text, idx insert-duplex c, curr <span class="Comment"># next iter</span> curr<span class="Special"> <- </span>next-duplex curr idx<span class="Special"> <- </span>add idx, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Comment"># initialize cursor to top of screen</span> - y<span class="Special"> <- </span>get-address *result, before-cursor:offset - *y<span class="Special"> <- </span>copy *init - <span class="Comment"># initial render to screen, just for some old tests</span> - _, screen<span class="Special"> <- </span>render screen, result - <span class="muControl">reply</span> result + <span class="muControl">reply</span> editor/same-as-ingredient:<span class="Constant">0</span> ] <span class="muScenario">scenario</span> editor-initializes-without-data [ @@ -197,23 +168,22 @@ container editor-data [ 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="muControl">reply-unless</span> editor, <span class="Constant">1/top</span>, screen/same-as-ingredient:<span class="Constant">0</span> - left:number<span class="Special"> <- </span>get *editor, left:offset + left:number<span class="Special"> <- </span>get *editor, <span class="Constant">left:offset</span> screen-height:number<span class="Special"> <- </span>screen-height screen - right:number<span class="Special"> <- </span>get *editor, right:offset + right:number<span class="Special"> <- </span>get *editor, <span class="Constant">right:offset</span> hide-screen screen - <span class="Comment"># highlight mu code with color</span> - color:number<span class="Special"> <- </span>copy <span class="Constant">7/white</span> - highlighting-state:number<span class="Special"> <- </span>copy <span class="Constant">0/normal</span> <span class="Comment"># traversing editor</span> - curr:address:duplex-list<span class="Special"> <- </span>get *editor, data:offset + curr:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">data:offset</span> prev:address:duplex-list<span class="Special"> <- </span>copy curr curr<span class="Special"> <- </span>next-duplex curr <span class="Comment"># traversing screen</span> +<span class="Constant"> +render-loop-initialization</span> + color:number<span class="Special"> <- </span>copy <span class="Constant">7/white</span> row:number<span class="Special"> <- </span>copy <span class="Constant">1/top</span> column:number<span class="Special"> <- </span>copy left - cursor-row:address:number<span class="Special"> <- </span>get-address *editor, cursor-row:offset - cursor-column:address:number<span class="Special"> <- </span>get-address *editor, cursor-column:offset - before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, before-cursor:offset + cursor-row:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-row:offset</span> + cursor-column:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-column:offset</span> + before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, <span class="Constant">before-cursor:offset</span> move-cursor screen, row, column <span class="Delimiter">{</span> <span class="Constant"> +next-character</span> @@ -230,8 +200,8 @@ container editor-data [ <span class="muControl">break-unless</span> at-cursor? *before-cursor<span class="Special"> <- </span>prev-duplex curr <span class="Delimiter">}</span> - c:character<span class="Special"> <- </span>get *curr, value:offset - color, highlighting-state<span class="Special"> <- </span>get-color color, highlighting-state, c + c:character<span class="Special"> <- </span>get *curr, <span class="Constant">value:offset</span> +<span class="Constant"> +character-c-recived</span> <span class="Delimiter">{</span> <span class="Comment"># newline? move to left rather than 0</span> newline?:boolean<span class="Special"> <- </span>equal c, <span class="Constant">10/newline</span> @@ -370,75 +340,6 @@ container editor-data [ <span class="muControl">reply</span> row/same-as-ingredient:<span class="Constant">5</span>, screen/same-as-ingredient:<span class="Constant">0</span> ] -<span class="Comment"># row:number, screen:address <- render-screen screen:address, sandbox-screen:address, left:number, right:number, row:number</span> -<span class="Comment"># print the fake sandbox screen to 'screen' with appropriate delimiters</span> -<span class="Comment"># leave cursor at start of next line</span> -<span class="muRecipe">recipe</span> render-screen [ - <span class="Constant">local-scope</span> - screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - s:address:screen<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> - row<span class="Special"> <- </span>add row, <span class="Constant">1</span> - <span class="muControl">reply-unless</span> s, row/same-as-ingredient:<span class="Constant">4</span>, screen/same-as-ingredient:<span class="Constant">0</span> - <span class="Comment"># print 'screen:'</span> - header:address:array:character<span class="Special"> <- </span>new <span class="Constant">[screen:]</span> - row<span class="Special"> <- </span>subtract row, <span class="Constant">1</span> <span class="Comment"># compensate for render-string below</span> - row<span class="Special"> <- </span>render-string screen, header, left, right, <span class="Constant">245/grey</span>, row - <span class="Comment"># newline</span> - row<span class="Special"> <- </span>add row, <span class="Constant">1</span> - move-cursor screen, row, left - <span class="Comment"># start printing s</span> - column:number<span class="Special"> <- </span>copy left - s-width:number<span class="Special"> <- </span>screen-width s - s-height:number<span class="Special"> <- </span>screen-height s - buf:address:array:screen-cell<span class="Special"> <- </span>get *s, data:offset - stop-printing:number<span class="Special"> <- </span>add left, s-width, <span class="Constant">3</span> - max-column:number<span class="Special"> <- </span>min stop-printing, right - i:number<span class="Special"> <- </span>copy <span class="Constant">0</span> - len:number<span class="Special"> <- </span>length *buf - screen-height:number<span class="Special"> <- </span>screen-height screen - <span class="Delimiter">{</span> - done?:boolean<span class="Special"> <- </span>greater-or-equal i, len - <span class="muControl">break-if</span> done? - done?<span class="Special"> <- </span>greater-or-equal row, screen-height - <span class="muControl">break-if</span> done? - column<span class="Special"> <- </span>copy left - move-cursor screen, row, column - <span class="Comment"># initial leader for each row: two spaces and a '.'</span> - print-character screen, <span class="Constant">32/space</span>, <span class="Constant">245/grey</span> - print-character screen, <span class="Constant">32/space</span>, <span class="Constant">245/grey</span> - print-character screen, <span class="Constant">46/full-stop</span>, <span class="Constant">245/grey</span> - column<span class="Special"> <- </span>add left, <span class="Constant">3</span> - <span class="Delimiter">{</span> - <span class="Comment"># print row</span> - row-done?:boolean<span class="Special"> <- </span>greater-or-equal column, max-column - <span class="muControl">break-if</span> row-done? - curr:screen-cell<span class="Special"> <- </span>index *buf, i - c:character<span class="Special"> <- </span>get curr, contents:offset - print-character screen, c, <span class="Constant">245/grey</span> - column<span class="Special"> <- </span>add column, <span class="Constant">1</span> - i<span class="Special"> <- </span>add i, <span class="Constant">1</span> - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - <span class="Comment"># print final '.'</span> - print-character screen, <span class="Constant">46/full-stop</span>, <span class="Constant">245/grey</span> - column<span class="Special"> <- </span>add column, <span class="Constant">1</span> - <span class="Delimiter">{</span> - <span class="Comment"># clear rest of current line</span> - line-done?:boolean<span class="Special"> <- </span>greater-than column, right - <span class="muControl">break-if</span> line-done? - print-character screen, <span class="Constant">32/space</span> - column<span class="Special"> <- </span>add column, <span class="Constant">1</span> - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - row<span class="Special"> <- </span>add row, <span class="Constant">1</span> - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - <span class="muControl">reply</span> row/same-as-ingredient:<span class="Constant">4</span>, screen/same-as-ingredient:<span class="Constant">0</span> -] - <span class="muRecipe">recipe</span> clear-line-delimited [ <span class="Constant">local-scope</span> screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> @@ -544,8 +445,8 @@ container editor-data [ run [ <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[]</span> <span class="Constant">2</span>:address:editor-data<span class="Special"> <- </span>new-editor <span class="Constant">1</span>:address:array:character, screen:address, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] screen-should-contain [ <span class="Constant"> . .</span> @@ -558,7 +459,7 @@ container editor-data [ ] ] -<span class="SalientComment">## highlighting mu code</span> +<span class="Comment"># just a little color for mu code</span> <span class="muScenario">scenario</span> render-colors-comments [ assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span> @@ -591,11 +492,15 @@ container editor-data [ ] ] -<span class="Comment"># color:number, highlighting-state:number <- get-color color:number, highlighting-state:number, c:character</span> +<span class="muRecipe">after</span> +character-c-recived [ + color<span class="Special"> <- </span>get-color color, c +] + +<span class="Comment"># color:number <- get-color color:number, c:character</span> +<span class="Comment"># so far the previous color is all the information we need; that may change</span> <span class="muRecipe">recipe</span> get-color [ <span class="Constant">local-scope</span> color:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - highlighting-state:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> c:character<span class="Special"> <- </span><span class="Constant">next-ingredient</span> color-is-white?:boolean<span class="Special"> <- </span>equal color, <span class="Constant">7/white</span> <span class="CommentedCode">#? $print [character: ], c, 10/newline #? 1</span> @@ -637,7 +542,7 @@ container editor-data [ <span class="Delimiter">}</span> <span class="Comment"># otherwise no change</span> <span class="Constant"> +exit</span> - <span class="muControl">reply</span> color, highlighting-state + <span class="muControl">reply</span> color ] <span class="muScenario">scenario</span> render-colors-assignment [ @@ -666,100 +571,6 @@ container editor-data [ <span class="SalientComment">## handling events from the keyboard, mouse, touch screen, ...</span> -<span class="muRecipe">recipe</span> event-loop [ - <span class="Constant">local-scope</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> - 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, recipes:offset - current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, current-sandbox:offset - sandbox-in-focus?:address:boolean<span class="Special"> <- </span>get-address *env, sandbox-in-focus?:offset - <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, found?:boolean, quit?:boolean<span class="Special"> <- </span>read-event console - <span class="muControl">loop-unless</span> found? - <span class="muControl">break-if</span> quit? <span class="Comment"># only in tests</span> - trace <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span> - <span class="Comment"># check for global events that will trigger regardless of which editor has focus</span> - <span class="Delimiter">{</span> - k:address:number<span class="Special"> <- </span>maybe-convert e:event, keycode:variant - <span class="muControl">break-unless</span> k - <span class="Comment"># F4? load all code and run all sandboxes.</span> - <span class="Delimiter">{</span> - do-run?:boolean<span class="Special"> <- </span>equal *k, <span class="Constant">65532/F4</span> - <span class="muControl">break-unless</span> do-run? - run-sandboxes env - <span class="Comment"># F4 might update warnings and results on both sides</span> - screen<span class="Special"> <- </span>render-all screen, env - update-cursor screen, recipes, current-sandbox, *sandbox-in-focus? - show-screen screen - <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> - <span class="Delimiter">}</span> - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - c:address:character<span class="Special"> <- </span>maybe-convert e:event, text:variant - <span class="muControl">break-unless</span> c - <span class="Comment"># ctrl-n? - switch focus</span> - <span class="Delimiter">{</span> - ctrl-n?:boolean<span class="Special"> <- </span>equal *c, <span class="Constant">14/ctrl-n</span> - <span class="muControl">break-unless</span> ctrl-n? - *sandbox-in-focus?<span class="Special"> <- </span>not *sandbox-in-focus? - update-cursor screen, recipes, current-sandbox, *sandbox-in-focus? - show-screen screen - <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> - <span class="Delimiter">}</span> - <span class="Delimiter">}</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 - <span class="Comment"># ignore all but 'left-click' events for now</span> - <span class="Comment"># todo: test this</span> - touch-type:number<span class="Special"> <- </span>get *t, type:offset - is-left-click?:boolean<span class="Special"> <- </span>equal touch-type, <span class="Constant">65513/mouse-left</span> - <span class="muControl">loop-unless</span> is-left-click?, <span class="Constant">+next-event:label</span> - <span class="Comment"># on a sandbox delete icon? process delete</span> - <span class="Delimiter">{</span> - was-delete?:boolean<span class="Special"> <- </span>delete-sandbox *t, env - <span class="muControl">break-unless</span> was-delete? -<span class="CommentedCode">#? trace [app], [delete clicked] #? 1</span> - screen<span class="Special"> <- </span>render-sandbox-side screen, env, <span class="Constant">1/clear</span> - update-cursor screen, recipes, current-sandbox, *sandbox-in-focus? - show-screen screen - <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># if not, send to both editors</span> - _<span class="Special"> <- </span>move-cursor-in-editor screen, recipes, *t - *sandbox-in-focus?<span class="Special"> <- </span>move-cursor-in-editor screen, current-sandbox, *t - <span class="muControl">jump</span> <span class="Constant">+continue:label</span> - <span class="Delimiter">}</span> - <span class="Comment"># if it's not global, send to appropriate editor</span> - <span class="Delimiter">{</span> - <span class="Delimiter">{</span> - <span class="muControl">break-if</span> *sandbox-in-focus? - handle-event screen, console, recipes, e:event - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> *sandbox-in-focus? - handle-event screen, console, current-sandbox, 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"># we rely on 'render' to update 'before-cursor' on pointer events, but</span> - <span class="Comment"># they won't usually come fast enough to trigger this.</span> - <span class="Comment"># todo: test this</span> - <span class="Delimiter">{</span> - more-events?:boolean<span class="Special"> <- </span>has-more-events? console - <span class="muControl">break-if</span> more-events? - render-minimal screen, env - <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">local-scope</span> screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> @@ -774,18 +585,18 @@ container editor-data [ 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 + t:address:touch-event<span class="Special"> <- </span>maybe-convert e, <span class="Constant">touch:variant</span> <span class="muControl">break-unless</span> t move-cursor-in-editor screen, editor, *t <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, console, editor, e:event + handle-event screen, console, editor, e <span class="Constant"> +continue</span> row:number, screen<span class="Special"> <- </span>render screen, editor <span class="Comment"># clear next line, in case we just processed a backspace</span> - left:number<span class="Special"> <- </span>get *editor, left:offset - right:number<span class="Special"> <- </span>get *editor, right:offset + left:number<span class="Special"> <- </span>get *editor, <span class="Constant">left:offset</span> + right:number<span class="Special"> <- </span>get *editor, <span class="Constant">right:offset</span> row<span class="Special"> <- </span>add row, <span class="Constant">1</span> move-cursor screen, row, left clear-line-delimited screen, left, right @@ -802,7 +613,7 @@ container editor-data [ <span class="muControl">reply-unless</span> editor <span class="Comment"># character</span> <span class="Delimiter">{</span> - c:address:character<span class="Special"> <- </span>maybe-convert e:event, text:variant + c:address:character<span class="Special"> <- </span>maybe-convert e, <span class="Constant">text:variant</span> <span class="muControl">break-unless</span> c <span class="SalientComment">## check for special characters</span> <span class="Comment"># backspace - delete character before cursor</span> @@ -843,7 +654,7 @@ container editor-data [ <span class="Comment"># tab - insert two spaces</span> <span class="Delimiter">{</span> tab?:boolean<span class="Special"> <- </span>equal *c, <span class="Constant">9/tab</span> - <span class="muControl">break-unless</span> tab?:boolean + <span class="muControl">break-unless</span> tab? insert-at-cursor editor, <span class="Constant">32/space</span>, screen insert-at-cursor editor, <span class="Constant">32/space</span>, screen <span class="muControl">reply</span> @@ -853,15 +664,15 @@ container editor-data [ <span class="muControl">reply</span> <span class="Delimiter">}</span> <span class="Comment"># otherwise it's a special key</span> - k:address:number<span class="Special"> <- </span>maybe-convert e:event, keycode:variant + k:address:number<span class="Special"> <- </span>maybe-convert e:event, <span class="Constant">keycode:variant</span> assert k, <span class="Constant">[event was of unknown type; neither keyboard nor mouse]</span> - d:address:duplex-list<span class="Special"> <- </span>get *editor, data:offset - before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, before-cursor:offset - cursor-row:address:number<span class="Special"> <- </span>get-address *editor, cursor-row:offset - cursor-column:address:number<span class="Special"> <- </span>get-address *editor, cursor-column:offset + d:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">data:offset</span> + before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, <span class="Constant">before-cursor:offset</span> + cursor-row:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-row:offset</span> + cursor-column:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-column:offset</span> screen-height:number<span class="Special"> <- </span>screen-height screen - left:number<span class="Special"> <- </span>get *editor, left:offset - right:number<span class="Special"> <- </span>get *editor, right:offset + left:number<span class="Special"> <- </span>get *editor, <span class="Constant">left:offset</span> + right:number<span class="Special"> <- </span>get *editor, <span class="Constant">right:offset</span> <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> @@ -874,7 +685,7 @@ container editor-data [ *before-cursor<span class="Special"> <- </span>copy old-cursor <span class="Comment"># if crossed a newline, move cursor to start of next row</span> <span class="Delimiter">{</span> - old-cursor-character:character<span class="Special"> <- </span>get **before-cursor, value:offset + old-cursor-character:character<span class="Special"> <- </span>get **before-cursor, <span class="Constant">value:offset</span> was-at-newline?:boolean<span class="Special"> <- </span>equal old-cursor-character, <span class="Constant">10/newline</span> <span class="muControl">break-unless</span> was-at-newline? *cursor-row<span class="Special"> <- </span>add *cursor-row, <span class="Constant">1</span> @@ -894,7 +705,7 @@ container editor-data [ <span class="Comment"># and if next character isn't newline</span> new-cursor:address:duplex-list<span class="Special"> <- </span>next-duplex old-cursor <span class="muControl">break-unless</span> new-cursor - next-character:character<span class="Special"> <- </span>get *new-cursor, value:offset + next-character:character<span class="Special"> <- </span>get *new-cursor, <span class="Constant">value:offset</span> newline?:boolean<span class="Special"> <- </span>equal next-character, <span class="Constant">10/newline</span> <span class="muControl">break-if</span> newline? *cursor-row<span class="Special"> <- </span>add *cursor-row, <span class="Constant">1</span> @@ -915,32 +726,7 @@ container editor-data [ <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 <span class="muControl">break-unless</span> prev - <span class="Comment"># if cursor not at left margin, move one character left</span> - <span class="Delimiter">{</span> - at-left-margin?:boolean<span class="Special"> <- </span>equal *cursor-column, <span class="Constant">0</span> - <span class="muControl">break-if</span> at-left-margin? -<span class="CommentedCode">#? trace [app], [decrementing] #? 1</span> - *cursor-column<span class="Special"> <- </span>subtract *cursor-column, <span class="Constant">1</span> - <span class="muControl">reply</span> - <span class="Delimiter">}</span> - <span class="Comment"># if at left margin, there's guaranteed to be a previous line, since we're</span> - <span class="Comment"># not at start of text</span> - <span class="Delimiter">{</span> - <span class="Comment"># if before-cursor is at newline, figure out how long the previous line is</span> - prevc:character<span class="Special"> <- </span>get **before-cursor, value:offset - previous-character-is-newline?:boolean<span class="Special"> <- </span>equal prevc, <span class="Constant">10/newline</span> - <span class="muControl">break-unless</span> previous-character-is-newline? -<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, d - *cursor-row<span class="Special"> <- </span>subtract *cursor-row, <span class="Constant">1</span> - *cursor-column<span class="Special"> <- </span>copy end-of-line - <span class="muControl">reply</span> - <span class="Delimiter">}</span> - <span class="Comment"># if before-cursor is not at newline, we're just at a wrapped line</span> - assert *cursor-row, <span class="Constant">[unimplemented: moving cursor above top of screen]</span> - *cursor-row<span class="Special"> <- </span>subtract *cursor-row, <span class="Constant">1</span> - *cursor-column<span class="Special"> <- </span>subtract right, <span class="Constant">1</span> <span class="Comment"># leave room for wrap icon</span> + editor<span class="Special"> <- </span>move-cursor-coordinates-left editor <span class="Delimiter">}</span> <span class="Comment"># down arrow</span> <span class="Delimiter">{</span> @@ -980,6 +766,14 @@ container editor-data [ move-to-end-of-line editor <span class="muControl">reply</span> <span class="Delimiter">}</span> + <span class="Comment"># delete</span> + <span class="Delimiter">{</span> + delete?:boolean<span class="Special"> <- </span>equal *k, <span class="Constant">65522/delete</span> + <span class="muControl">break-unless</span> delete? + curr:address:duplex-list<span class="Special"> <- </span>get **before-cursor, <span class="Constant">next:offset</span> + _<span class="Special"> <- </span>remove-duplex curr + <span class="muControl">reply</span> + <span class="Delimiter">}</span> ] <span class="Comment"># process click, return if it was on current editor</span> @@ -990,18 +784,18 @@ container editor-data [ 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="muControl">reply-unless</span> editor, <span class="Constant">0/false</span> - click-column:number<span class="Special"> <- </span>get t, column:offset - left:number<span class="Special"> <- </span>get *editor, left:offset + click-column:number<span class="Special"> <- </span>get t, <span class="Constant">column:offset</span> + left:number<span class="Special"> <- </span>get *editor, <span class="Constant">left:offset</span> too-far-left?:boolean<span class="Special"> <- </span>lesser-than click-column, left <span class="muControl">reply-if</span> too-far-left?, <span class="Constant">0/false</span> - right:number<span class="Special"> <- </span>get *editor, right:offset + right:number<span class="Special"> <- </span>get *editor, <span class="Constant">right:offset</span> too-far-right?:boolean<span class="Special"> <- </span>greater-than click-column, right <span class="muControl">reply-if</span> too-far-right?, <span class="Constant">0/false</span> <span class="Comment"># update cursor</span> - cursor-row:address:number<span class="Special"> <- </span>get-address *editor, cursor-row:offset - *cursor-row<span class="Special"> <- </span>get t, row:offset - cursor-column:address:number<span class="Special"> <- </span>get-address *editor, cursor-column:offset - *cursor-column<span class="Special"> <- </span>get t, column:offset + cursor-row:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-row:offset</span> + *cursor-row<span class="Special"> <- </span>get t, <span class="Constant">row:offset</span> + cursor-column:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-column:offset</span> + *cursor-column<span class="Special"> <- </span>get t, <span class="Constant">column:offset</span> <span class="Comment"># gain focus</span> <span class="muControl">reply</span> <span class="Constant">1/true</span> ] @@ -1012,13 +806,13 @@ container editor-data [ 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, 10/newline #? 1</span> - before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, before-cursor:offset + before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, <span class="Constant">before-cursor:offset</span> insert-duplex c, *before-cursor *before-cursor<span class="Special"> <- </span>next-duplex *before-cursor - cursor-row:address:number<span class="Special"> <- </span>get-address *editor, cursor-row:offset - cursor-column:address:number<span class="Special"> <- </span>get-address *editor, cursor-column:offset - left:number<span class="Special"> <- </span>get *editor, left:offset - right:number<span class="Special"> <- </span>get *editor, right:offset + cursor-row:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-row:offset</span> + cursor-column:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-column:offset</span> + left:number<span class="Special"> <- </span>get *editor, <span class="Constant">left:offset</span> + right:number<span class="Special"> <- </span>get *editor, <span class="Constant">right:offset</span> <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> @@ -1028,7 +822,7 @@ container editor-data [ *cursor-column<span class="Special"> <- </span>copy left <span class="Comment"># indent if necessary</span> <span class="CommentedCode">#? $print [computing indent], 10/newline #? 1</span> - d:address:duplex-list<span class="Special"> <- </span>get *editor, data:offset + d:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">data:offset</span> end-of-previous-line:address:duplex-list<span class="Special"> <- </span>prev-duplex *before-cursor indent:number<span class="Special"> <- </span>line-indent end-of-previous-line, d <span class="CommentedCode">#? $print indent, 10/newline #? 1</span> @@ -1068,19 +862,49 @@ container editor-data [ <span class="muRecipe">recipe</span> delete-before-cursor [ <span class="Constant">local-scope</span> editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor:address:editor-data, before-cursor:offset - d:address:duplex-list<span class="Special"> <- </span>get *editor:address:editor-data, data:offset - <span class="Comment"># unless already at start</span> - at-start?:boolean<span class="Special"> <- </span>equal *before-cursor:address:address:duplex-list, d:address:duplex-list - <span class="muControl">reply-if</span> at-start?:boolean - <span class="Comment"># delete character</span> - prev:address:duplex-list<span class="Special"> <- </span>prev-duplex *before-cursor:address:address:duplex-list - remove-duplex *before-cursor:address:address:duplex-list - <span class="Comment"># update cursor</span> - *before-cursor:address:address:duplex-list<span class="Special"> <- </span>copy prev:address:duplex-list - cursor-column:address:number<span class="Special"> <- </span>get-address *editor:address:editor-data, cursor-column:offset - *cursor-column:address:number<span class="Special"> <- </span>subtract *cursor-column:address:number, <span class="Constant">1</span> -<span class="CommentedCode">#? $print [delete-before-cursor: ], *cursor-column:address:number, 10/newline</span> + before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, <span class="Constant">before-cursor:offset</span> + <span class="Comment"># if at start of text (before-cursor at § sentinel), return</span> + prev:address:duplex-list<span class="Special"> <- </span>prev-duplex *before-cursor + <span class="muControl">reply-unless</span> prev + editor<span class="Special"> <- </span>move-cursor-coordinates-left editor + remove-duplex *before-cursor + *before-cursor<span class="Special"> <- </span>copy prev +] + +<span class="muRecipe">recipe</span> move-cursor-coordinates-left [ + <span class="Constant">local-scope</span> + editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + before-cursor:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">before-cursor:offset</span> + cursor-row:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-row:offset</span> + cursor-column:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-column:offset</span> + <span class="Comment"># if not at left margin, move one character left</span> + <span class="Delimiter">{</span> + at-left-margin?:boolean<span class="Special"> <- </span>equal *cursor-column, <span class="Constant">0</span> + <span class="muControl">break-if</span> at-left-margin? +<span class="CommentedCode">#? trace [app], [decrementing cursor column] #? 1</span> + *cursor-column<span class="Special"> <- </span>subtract *cursor-column, <span class="Constant">1</span> + <span class="muControl">reply</span> editor/same-as-ingredient:<span class="Constant">0</span> + <span class="Delimiter">}</span> + <span class="Comment"># if at left margin, we must move to previous row:</span> + assert *cursor-row, <span class="Constant">[unimplemented: moving cursor above top of screen]</span> + *cursor-row<span class="Special"> <- </span>subtract *cursor-row, <span class="Constant">1</span> + <span class="Delimiter">{</span> + <span class="Comment"># case 1: if previous character was newline, figure out how long the previous line is</span> + previous-character:character<span class="Special"> <- </span>get *before-cursor, <span class="Constant">value:offset</span> + previous-character-is-newline?:boolean<span class="Special"> <- </span>equal previous-character, <span class="Constant">10/newline</span> + <span class="muControl">break-unless</span> previous-character-is-newline? + <span class="Comment"># compute length of previous line</span> +<span class="CommentedCode">#? trace [app], [switching to previous line] #? 1</span> + d:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">data:offset</span> + end-of-line:number<span class="Special"> <- </span>previous-line-length before-cursor, d + *cursor-column<span class="Special"> <- </span>copy end-of-line + <span class="muControl">reply</span> editor/same-as-ingredient:<span class="Constant">0</span> + <span class="Delimiter">}</span> + <span class="Comment"># case 2: if previous-character was not newline, we're just at a wrapped line</span> +<span class="CommentedCode">#? trace [app], [wrapping to previous line] #? 1</span> + right:number<span class="Special"> <- </span>get *editor, <span class="Constant">right:offset</span> + *cursor-column<span class="Special"> <- </span>subtract right, <span class="Constant">1</span> <span class="Comment"># leave room for wrap icon</span> + <span class="muControl">reply</span> editor/same-as-ingredient:<span class="Constant">0</span> ] <span class="Comment"># takes a pointer 'curr' into the doubly-linked list and its sentinel, counts</span> @@ -1098,7 +922,7 @@ container editor-data [ <span class="muControl">break-unless</span> curr at-start?:boolean<span class="Special"> <- </span>equal curr, start <span class="muControl">break-if</span> at-start? - c:character<span class="Special"> <- </span>get *curr, value:offset + c:character<span class="Special"> <- </span>get *curr, <span class="Constant">value:offset</span> at-newline?:boolean<span class="Special"> <- </span>equal c, <span class="Constant">10/newline</span> <span class="muControl">break-if</span> at-newline? result<span class="Special"> <- </span>add result, <span class="Constant">1</span> @@ -1122,7 +946,7 @@ container editor-data [ <span class="muControl">break-unless</span> curr at-start?:boolean<span class="Special"> <- </span>equal curr, start <span class="muControl">break-if</span> at-start? - c:character<span class="Special"> <- </span>get *curr, value:offset + c:character<span class="Special"> <- </span>get *curr, <span class="Constant">value:offset</span> at-newline?:boolean<span class="Special"> <- </span>equal c, <span class="Constant">10/newline</span> <span class="muControl">break-if</span> at-newline? <span class="Comment"># if c is a space, increment result</span> @@ -1145,17 +969,17 @@ container editor-data [ <span class="Constant">local-scope</span> editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># update cursor column</span> - left:number<span class="Special"> <- </span>get *editor, left:offset - cursor-column:address:number<span class="Special"> <- </span>get-address *editor, cursor-column:offset + left:number<span class="Special"> <- </span>get *editor, <span class="Constant">left:offset</span> + cursor-column:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-column:offset</span> *cursor-column<span class="Special"> <- </span>copy left <span class="Comment"># update before-cursor</span> - before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, before-cursor:offset - init:address:duplex-list<span class="Special"> <- </span>get *editor, data:offset + before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, <span class="Constant">before-cursor:offset</span> + init:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">data:offset</span> <span class="Comment"># while not at start of line, move </span> <span class="Delimiter">{</span> at-start-of-text?:boolean<span class="Special"> <- </span>equal *before-cursor, init <span class="muControl">break-if</span> at-start-of-text? - prev:character<span class="Special"> <- </span>get **before-cursor, value:offset + prev:character<span class="Special"> <- </span>get **before-cursor, <span class="Constant">value:offset</span> at-start-of-line?:boolean<span class="Special"> <- </span>equal prev, <span class="Constant">10/newline</span> <span class="muControl">break-if</span> at-start-of-line? *before-cursor<span class="Special"> <- </span>prev-duplex *before-cursor @@ -1167,13 +991,13 @@ container editor-data [ <span class="muRecipe">recipe</span> move-to-end-of-line [ <span class="Constant">local-scope</span> editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, before-cursor:offset - cursor-column:address:number<span class="Special"> <- </span>get-address *editor, cursor-column:offset + before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, <span class="Constant">before-cursor:offset</span> + cursor-column:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-column:offset</span> <span class="Comment"># while not at start of line, move </span> <span class="Delimiter">{</span> next:address:duplex-list<span class="Special"> <- </span>next-duplex *before-cursor <span class="muControl">break-unless</span> next <span class="Comment"># end of text</span> - nextc:character<span class="Special"> <- </span>get *next, value:offset + nextc:character<span class="Special"> <- </span>get *next, <span class="Constant">value:offset</span> at-end-of-line?:boolean<span class="Special"> <- </span>equal nextc, <span class="Constant">10/newline</span> <span class="muControl">break-if</span> at-end-of-line? *before-cursor<span class="Special"> <- </span>copy next @@ -1188,14 +1012,14 @@ container editor-data [ <span class="Constant">local-scope</span> editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># compute range to delete</span> - init:address:duplex-list<span class="Special"> <- </span>get *editor, data:offset - before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, before-cursor:offset + init:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">data:offset</span> + before-cursor:address:address:duplex-list<span class="Special"> <- </span>get-address *editor, <span class="Constant">before-cursor:offset</span> start:address:duplex-list<span class="Special"> <- </span>copy *before-cursor end:address:duplex-list<span class="Special"> <- </span>next-duplex *before-cursor <span class="Delimiter">{</span> at-start-of-text?:boolean<span class="Special"> <- </span>equal start, init <span class="muControl">break-if</span> at-start-of-text? - curr:character<span class="Special"> <- </span>get *start, value:offset + curr:character<span class="Special"> <- </span>get *start, <span class="Constant">value:offset</span> at-start-of-line?:boolean<span class="Special"> <- </span>equal curr, <span class="Constant">10/newline</span> <span class="muControl">break-if</span> at-start-of-line? start<span class="Special"> <- </span>prev-duplex start @@ -1203,14 +1027,14 @@ container editor-data [ <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># snip it out</span> - start-next:address:address:duplex-list<span class="Special"> <- </span>get-address *start, next:offset + start-next:address:address:duplex-list<span class="Special"> <- </span>get-address *start, <span class="Constant">next:offset</span> *start-next<span class="Special"> <- </span>copy end - end-prev:address:address:duplex-list<span class="Special"> <- </span>get-address *end, prev:offset + end-prev:address:address:duplex-list<span class="Special"> <- </span>get-address *end, <span class="Constant">prev:offset</span> *end-prev<span class="Special"> <- </span>copy start <span class="Comment"># adjust cursor</span> *before-cursor<span class="Special"> <- </span>prev-duplex end - left:number<span class="Special"> <- </span>get *editor, left:offset - cursor-column:address:number<span class="Special"> <- </span>get-address *editor, cursor-column:offset + left:number<span class="Special"> <- </span>get *editor, <span class="Constant">left:offset</span> + cursor-column:address:number<span class="Special"> <- </span>get-address *editor, <span class="Constant">cursor-column:offset</span> *cursor-column<span class="Special"> <- </span>copy left ] @@ -1218,129 +1042,27 @@ container editor-data [ <span class="Constant">local-scope</span> editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># compute range to delete</span> - start:address:duplex-list<span class="Special"> <- </span>get *editor, before-cursor:offset + start:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">before-cursor:offset</span> end:address:duplex-list<span class="Special"> <- </span>next-duplex start <span class="Delimiter">{</span> at-end-of-text?:boolean<span class="Special"> <- </span>equal end, <span class="Constant">0/null</span> <span class="muControl">break-if</span> at-end-of-text? - curr:character<span class="Special"> <- </span>get *end, value:offset + curr:character<span class="Special"> <- </span>get *end, <span class="Constant">value:offset</span> at-end-of-line?:boolean<span class="Special"> <- </span>equal curr, <span class="Constant">10/newline</span> <span class="muControl">break-if</span> at-end-of-line? end<span class="Special"> <- </span>next-duplex end <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="Comment"># snip it out</span> - start-next:address:address:duplex-list<span class="Special"> <- </span>get-address *start, next:offset + start-next:address:address:duplex-list<span class="Special"> <- </span>get-address *start, <span class="Constant">next:offset</span> *start-next<span class="Special"> <- </span>copy end <span class="Delimiter">{</span> <span class="muControl">break-unless</span> end - end-prev:address:address:duplex-list<span class="Special"> <- </span>get-address *end, prev:offset + end-prev:address:address:duplex-list<span class="Special"> <- </span>get-address *end, <span class="Constant">prev:offset</span> *end-prev<span class="Special"> <- </span>copy start <span class="Delimiter">}</span> ] -<span class="muRecipe">recipe</span> render-all [ - <span class="Constant">local-scope</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> - screen<span class="Special"> <- </span>render-recipes screen, env, <span class="Constant">1/clear-below</span> - screen<span class="Special"> <- </span>render-sandbox-side screen, env, <span class="Constant">1/clear-below</span> - recipes:address:editor-data<span class="Special"> <- </span>get *env, recipes:offset - current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, current-sandbox:offset - sandbox-in-focus?:boolean<span class="Special"> <- </span>get *env, sandbox-in-focus?:offset - update-cursor screen, recipes, current-sandbox, sandbox-in-focus? - show-screen screen - <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span> -] - -<span class="muRecipe">recipe</span> render-minimal [ - <span class="Constant">local-scope</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, recipes:offset - current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, current-sandbox:offset - sandbox-in-focus?:boolean<span class="Special"> <- </span>get *env, sandbox-in-focus?:offset - <span class="Delimiter">{</span> - <span class="muControl">break-if</span> sandbox-in-focus? - screen<span class="Special"> <- </span>render-recipes screen, env - cursor-row:number<span class="Special"> <- </span>get *recipes, cursor-row:offset - cursor-column:number<span class="Special"> <- </span>get *recipes, cursor-column:offset - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> sandbox-in-focus? - screen<span class="Special"> <- </span>render-sandbox-side screen, env - cursor-row:number<span class="Special"> <- </span>get *current-sandbox, cursor-row:offset - cursor-column:number<span class="Special"> <- </span>get *current-sandbox, cursor-column:offset - <span class="Delimiter">}</span> - move-cursor screen, cursor-row, cursor-column - show-screen screen - <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span> -] - -<span class="muRecipe">recipe</span> render-recipes [ - <span class="Constant">local-scope</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> - clear:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - recipes:address:editor-data<span class="Special"> <- </span>get *env, recipes:offset - <span class="Comment"># render recipes</span> - left:number<span class="Special"> <- </span>get *recipes, left:offset - right:number<span class="Special"> <- </span>get *recipes, right:offset - row:number, screen<span class="Special"> <- </span>render screen, recipes - recipe-warnings:address:array:character<span class="Special"> <- </span>get *env, recipe-warnings:offset - <span class="Delimiter">{</span> - <span class="Comment"># print any warnings</span> - <span class="muControl">break-unless</span> recipe-warnings - row, screen<span class="Special"> <- </span>render-string screen, recipe-warnings, left, right, <span class="Constant">1/red</span>, row - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - <span class="Comment"># no warnings? move to next line</span> - <span class="muControl">break-if</span> recipe-warnings - row<span class="Special"> <- </span>add row, <span class="Constant">1</span> - <span class="Delimiter">}</span> - <span class="Comment"># draw dotted line after recipes</span> - draw-horizontal screen, row, left, right, <span class="Constant">9480/horizontal-dotted</span> - <span class="Comment"># clear next line, in case we just processed a backspace</span> - row<span class="Special"> <- </span>add row, <span class="Constant">1</span> - move-cursor screen, row, left - clear-line-delimited screen, left, right - <span class="Comment"># clear rest of screen in this column, if requested</span> - <span class="muControl">reply-unless</span> clear, screen/same-as-ingredient:<span class="Constant">0</span> - screen-height:number<span class="Special"> <- </span>screen-height screen - <span class="Delimiter">{</span> - at-bottom-of-screen?:boolean<span class="Special"> <- </span>greater-or-equal row, screen-height - <span class="muControl">break-if</span> at-bottom-of-screen? - move-cursor screen, row, left - clear-line-delimited screen, left, right - row<span class="Special"> <- </span>add row, <span class="Constant">1</span> - <span class="muControl">loop</span> - <span class="Delimiter">}</span> - <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span> -] - -<span class="muRecipe">recipe</span> update-cursor [ - <span class="Constant">local-scope</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? -<span class="CommentedCode">#? $print [recipes in focus</span> -<span class="CommentedCode">#? ] #? 1</span> - cursor-row:number<span class="Special"> <- </span>get *recipes, cursor-row:offset - cursor-column:number<span class="Special"> <- </span>get *recipes, cursor-column:offset - <span class="Delimiter">}</span> - <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> sandbox-in-focus? -<span class="CommentedCode">#? $print [sandboxes in focus</span> -<span class="CommentedCode">#? ] #? 1</span> - cursor-row:number<span class="Special"> <- </span>get *current-sandbox, cursor-row:offset - cursor-column:number<span class="Special"> <- </span>get *current-sandbox, cursor-column:offset - <span class="Delimiter">}</span> - move-cursor screen, cursor-row, cursor-column -] - <span class="muScenario">scenario</span> editor-handles-empty-event-queue [ assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> @@ -1365,8 +1087,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] screen-should-contain [ <span class="Constant"> . .</span> @@ -1388,8 +1110,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> <- </span><span class="Constant">1</span> <span class="Comment"># cursor row</span> @@ -1407,8 +1129,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> <- </span><span class="Constant">1</span> <span class="Comment"># cursor row</span> @@ -1426,8 +1148,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> <- </span><span class="Constant">2</span> <span class="Comment"># cursor row</span> @@ -1446,8 +1168,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] screen-should-contain [ <span class="Constant"> . .</span> @@ -1633,8 +1355,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] screen-should-contain [ <span class="Constant"> . .</span> @@ -1658,8 +1380,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] screen-should-contain [ <span class="Constant"> . .</span> @@ -1754,8 +1476,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] <span class="Comment"># cursor should be below start of previous line</span> memory-should-contain [ @@ -1764,6 +1486,34 @@ container editor-data [ ] ] +<span class="muScenario">scenario</span> editor-handles-delete-key [ + assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> + <span class="Constant">2</span>:address:editor-data<span class="Special"> <- </span>new-editor <span class="Constant">1</span>:address:array:character, screen:address, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> + assume-console [ + press <span class="Constant">65522</span> <span class="Comment"># delete</span> + ] + run [ + editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data + ] + screen-should-contain [ + <span class="Constant"> . .</span> + <span class="Constant"> .bc .</span> + <span class="Constant"> . .</span> + ] + assume-console [ + press <span class="Constant">65522</span> <span class="Comment"># delete</span> + ] + run [ + editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data + ] + screen-should-contain [ + <span class="Constant"> . .</span> + <span class="Constant"> .c .</span> + <span class="Constant"> . .</span> + ] +] + <span class="muScenario">scenario</span> editor-handles-backspace-key [ assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> @@ -1776,8 +1526,8 @@ container editor-data [ replace-in-console <span class="Constant">171/«</span>, <span class="Constant">3</span>:event/backspace run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] screen-should-contain [ <span class="Constant"> . .</span> @@ -1795,7 +1545,7 @@ container editor-data [ <span class="Comment"># just one character in final line</span> <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ab</span> <span class="Constant">cd]</span> - <span class="Constant">2</span>:address:editor-data<span class="Special"> <- </span>new-editor <span class="Constant">1</span>:address:array:character, screen:address, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> + <span class="Constant">2</span>:address:editor-data<span class="Special"> <- </span>new-editor <span class="Constant">1</span>:address:array:character, screen:address, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> assume-console [ left-click <span class="Constant">2</span>, <span class="Constant">0</span> <span class="Comment"># cursor at only character in final line</span> type <span class="Constant">[«]</span> @@ -1804,12 +1554,18 @@ container editor-data [ replace-in-console <span class="Constant">171/«</span>, <span class="Constant">3</span>:event/backspace run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] screen-should-contain [ <span class="Constant"> . .</span> <span class="Constant"> .abcd .</span> <span class="Constant"> . .</span> ] + memory-should-contain [ + <span class="Constant">4</span><span class="Special"> <- </span><span class="Constant">1</span> + <span class="Constant">5</span><span class="Special"> <- </span><span class="Constant">2</span> + ] ] <span class="muScenario">scenario</span> editor-inserts-two-spaces-on-tab [ @@ -1907,8 +1663,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] screen-should-contain [ <span class="Constant"> . .</span> @@ -1934,8 +1690,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> <- </span><span class="Constant">2</span> @@ -1947,8 +1703,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> <- </span><span class="Constant">2</span> @@ -1966,8 +1722,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] screen-should-contain [ <span class="Constant"> . .</span> @@ -2034,8 +1790,8 @@ container editor-data [ ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> <- </span><span class="Constant">1</span> @@ -2136,8 +1892,8 @@ d] ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> <- </span><span class="Constant">1</span> <span class="Comment"># previous row</span> @@ -2156,8 +1912,8 @@ d] ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> <- </span><span class="Constant">1</span> @@ -2176,8 +1932,8 @@ d] ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] <span class="Comment"># ..and ends at (2, 0)</span> memory-should-contain [ @@ -2197,8 +1953,8 @@ d] ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> <- </span><span class="Constant">1</span> @@ -2217,8 +1973,8 @@ d] ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">3</span><span class="Special"> <- </span><span class="Constant">2</span> @@ -2240,8 +1996,8 @@ d] replace-in-console <span class="Constant">97/a</span>, <span class="Constant">3</span>:event/ctrl-a run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] <span class="Comment"># cursor moves to start of line</span> memory-should-contain [ @@ -2264,8 +2020,8 @@ d] replace-in-console <span class="Constant">97/a</span>, <span class="Constant">3</span>:event/ctrl-a run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] <span class="Comment"># cursor moves to start of line</span> memory-should-contain [ @@ -2286,8 +2042,8 @@ d] ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] <span class="Comment"># cursor moves to start of line</span> memory-should-contain [ @@ -2308,8 +2064,8 @@ d] ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] <span class="Comment"># cursor moves to start of line</span> memory-should-contain [ @@ -2332,8 +2088,8 @@ d] replace-in-console <span class="Constant">101/e</span>, <span class="Constant">3</span>:event/ctrl-e run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] <span class="Comment"># cursor moves to end of line</span> memory-should-contain [ @@ -2346,8 +2102,8 @@ d] ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">4</span><span class="Special"> <- </span><span class="Constant">1</span> @@ -2375,8 +2131,8 @@ d] replace-in-console <span class="Constant">101/e</span>, <span class="Constant">3</span>:event/ctrl-e run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] <span class="Comment"># cursor moves to end of line</span> memory-should-contain [ @@ -2397,8 +2153,8 @@ d] ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] <span class="Comment"># cursor moves to end of line</span> memory-should-contain [ @@ -2419,8 +2175,8 @@ d] ] run [ editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-row:offset - <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, cursor-column:offset + <span class="Constant">3</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-row:offset</span> + <span class="Constant">4</span>:number<span class="Special"> <- </span>get *<span class="Constant">2</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] <span class="Comment"># cursor moves to end of line</span> memory-should-contain [ @@ -2645,6 +2401,119 @@ d] ] ] +<span class="SalientComment">## putting the environment together out of editors</span> + +container programming-environment-data [ + recipes:address:editor-data + recipe-warnings:address:array:character + current-sandbox:address:editor-data + sandbox:address:sandbox-data <span class="Comment"># list of sandboxes, from top to bottom</span> + sandbox-in-focus?:boolean <span class="Comment"># false => cursor in recipes; true => cursor in current-sandbox</span> +] + +<span class="muRecipe">recipe</span> new-programming-environment [ + <span class="Constant">local-scope</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 + height:number<span class="Special"> <- </span>screen-height screen + <span class="Comment"># top menu</span> + result:address:programming-environment-data<span class="Special"> <- </span>new <span class="Constant">programming-environment-data:type</span> + draw-horizontal screen, <span class="Constant">0</span>, <span class="Constant">0/left</span>, width, <span class="Constant">32/space</span>, <span class="Constant">0/black</span>, <span class="Constant">238/grey</span> + button-start:number<span class="Special"> <- </span>subtract width, <span class="Constant">20</span> + button-on-screen?:boolean<span class="Special"> <- </span>greater-or-equal button-start, <span class="Constant">0</span> + assert button-on-screen?, <span class="Constant">[screen too narrow for menu]</span> + move-cursor screen, <span class="Constant">0/row</span>, button-start + run-button:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ run (F4) ]</span> + print-string screen, run-button, <span class="Constant">255/white</span>, <span class="Constant">161/reddish</span> + <span class="Comment"># dotted line down the middle</span> + divider:number, _<span class="Special"> <- </span>divide-with-remainder width, <span class="Constant">2</span> + draw-vertical screen, divider, <span class="Constant">1/top</span>, height, <span class="Constant">9482/vertical-dotted</span> + <span class="Comment"># recipe editor on the left</span> + recipes:address:address:editor-data<span class="Special"> <- </span>get-address *result, <span class="Constant">recipes:offset</span> + *recipes<span class="Special"> <- </span>new-editor initial-recipe-contents, screen, <span class="Constant">0/left</span>, divider/right + <span class="Comment"># sandbox editor on the right</span> + new-left:number<span class="Special"> <- </span>add divider, <span class="Constant">1</span> + new-right:number<span class="Special"> <- </span>add new-left, <span class="Constant">5</span> + current-sandbox:address:address:editor-data<span class="Special"> <- </span>get-address *result, <span class="Constant">current-sandbox:offset</span> + *current-sandbox<span class="Special"> <- </span>new-editor initial-sandbox-contents, screen, new-left, width/right + screen<span class="Special"> <- </span>render-all screen, result + <span class="muControl">reply</span> result +] + +<span class="muRecipe">recipe</span> event-loop [ + <span class="Constant">local-scope</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> + 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, <span class="Constant">recipes:offset</span> + current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">current-sandbox:offset</span> + sandbox-in-focus?:address:boolean<span class="Special"> <- </span>get-address *env, <span class="Constant">sandbox-in-focus?:offset</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, found?:boolean, quit?:boolean<span class="Special"> <- </span>read-event console + <span class="muControl">loop-unless</span> found? + <span class="muControl">break-if</span> quit? <span class="Comment"># only in tests</span> + trace <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span> + <span class="Comment"># check for global events that will trigger regardless of which editor has focus</span> + <span class="Delimiter">{</span> + k:address:number<span class="Special"> <- </span>maybe-convert e:event, <span class="Constant">keycode:variant</span> + <span class="muControl">break-unless</span> k +<span class="Constant"> +global-keypress</span> + <span class="Delimiter">}</span> + <span class="Delimiter">{</span> + c:address:character<span class="Special"> <- </span>maybe-convert e:event, <span class="Constant">text:variant</span> + <span class="muControl">break-unless</span> c +<span class="Constant"> +global-type</span> + <span class="Comment"># ctrl-n? - switch focus</span> + <span class="Delimiter">{</span> + ctrl-n?:boolean<span class="Special"> <- </span>equal *c, <span class="Constant">14/ctrl-n</span> + <span class="muControl">break-unless</span> ctrl-n? + *sandbox-in-focus?<span class="Special"> <- </span>not *sandbox-in-focus? + update-cursor screen, recipes, current-sandbox, *sandbox-in-focus? + show-screen screen + <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> + <span class="Delimiter">}</span> + <span class="Delimiter">}</span> + <span class="Comment"># 'touch' event - send to both sides, see what picks it up</span> + <span class="Delimiter">{</span> + t:address:touch-event<span class="Special"> <- </span>maybe-convert e:event, <span class="Constant">touch:variant</span> + <span class="muControl">break-unless</span> t + <span class="Comment"># ignore all but 'left-click' events for now</span> + <span class="Comment"># todo: test this</span> + touch-type:number<span class="Special"> <- </span>get *t, <span class="Constant">type:offset</span> + is-left-click?:boolean<span class="Special"> <- </span>equal touch-type, <span class="Constant">65513/mouse-left</span> + <span class="muControl">loop-unless</span> is-left-click?, <span class="Constant">+next-event:label</span> + <span class="Comment"># later exceptions for non-editor touches will go here</span> +<span class="Constant"> +global-touch</span> + <span class="Comment"># send to both editors</span> + _<span class="Special"> <- </span>move-cursor-in-editor screen, recipes, *t + *sandbox-in-focus?<span class="Special"> <- </span>move-cursor-in-editor screen, current-sandbox, *t + render-minimal screen, env + <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> + <span class="Delimiter">}</span> + <span class="Comment"># if it's not global and not a touch event, send to appropriate editor</span> + <span class="Delimiter">{</span> + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> *sandbox-in-focus? + handle-event screen, console, recipes, e:event + <span class="Delimiter">}</span> + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> *sandbox-in-focus? + handle-event screen, console, current-sandbox, e:event + <span class="Delimiter">}</span> + <span class="Comment"># optimization: refresh screen only if no more events</span> + <span class="Comment"># todo: test this</span> + more-events?:boolean<span class="Special"> <- </span>has-more-events? console + <span class="muControl">break-if</span> more-events? + render-minimal screen, env + <span class="Delimiter">}</span> + <span class="muControl">loop</span> + <span class="Delimiter">}</span> +] + <span class="muScenario">scenario</span> point-at-multiple-editors [ <span class="Constant"> $close-trace</span> assume-screen <span class="Constant">30/width</span>, <span class="Constant">5/height</span> @@ -2660,10 +2529,10 @@ d] <span class="Comment"># check cursor column in each</span> run [ event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data - <span class="Constant">4</span>:address:editor-data<span class="Special"> <- </span>get *<span class="Constant">3</span>:address:programming-environment-data, recipes:offset - <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">4</span>:address:editor-data, cursor-column:offset - <span class="Constant">6</span>:address:editor-data<span class="Special"> <- </span>get *<span class="Constant">3</span>:address:programming-environment-data, current-sandbox:offset - <span class="Constant">7</span>:number<span class="Special"> <- </span>get *<span class="Constant">6</span>:address:editor-data, cursor-column:offset + <span class="Constant">4</span>:address:editor-data<span class="Special"> <- </span>get *<span class="Constant">3</span>:address:programming-environment-data, <span class="Constant">recipes:offset</span> + <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">4</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> + <span class="Constant">6</span>:address:editor-data<span class="Special"> <- </span>get *<span class="Constant">3</span>:address:programming-environment-data, <span class="Constant">current-sandbox:offset</span> + <span class="Constant">7</span>:number<span class="Special"> <- </span>get *<span class="Constant">6</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] memory-should-contain [ <span class="Constant">5</span><span class="Special"> <- </span><span class="Constant">1</span> @@ -2687,10 +2556,10 @@ d] ] run [ event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data - <span class="Constant">4</span>:address:editor-data<span class="Special"> <- </span>get *<span class="Constant">3</span>:address:programming-environment-data, recipes:offset - <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">4</span>:address:editor-data, cursor-column:offset - <span class="Constant">6</span>:address:editor-data<span class="Special"> <- </span>get *<span class="Constant">3</span>:address:programming-environment-data, current-sandbox:offset - <span class="Constant">7</span>:number<span class="Special"> <- </span>get *<span class="Constant">6</span>:address:editor-data, cursor-column:offset + <span class="Constant">4</span>:address:editor-data<span class="Special"> <- </span>get *<span class="Constant">3</span>:address:programming-environment-data, <span class="Constant">recipes:offset</span> + <span class="Constant">5</span>:number<span class="Special"> <- </span>get *<span class="Constant">4</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> + <span class="Constant">6</span>:address:editor-data<span class="Special"> <- </span>get *<span class="Constant">3</span>:address:programming-environment-data, <span class="Constant">current-sandbox:offset</span> + <span class="Constant">7</span>:number<span class="Special"> <- </span>get *<span class="Constant">6</span>:address:editor-data, <span class="Constant">cursor-column:offset</span> ] screen-should-contain [ <span class="Constant"> . run (F4) . # this line has a different background, but we don't test that yet</span> @@ -2769,13 +2638,118 @@ d] ] ] -<span class="SalientComment">## Running code from the editors</span> +<span class="muRecipe">recipe</span> render-all [ + <span class="Constant">local-scope</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> + screen<span class="Special"> <- </span>render-recipes screen, env + screen<span class="Special"> <- </span>render-sandbox-side screen, env + recipes:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">recipes:offset</span> + current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">current-sandbox:offset</span> + sandbox-in-focus?:boolean<span class="Special"> <- </span>get *env, <span class="Constant">sandbox-in-focus?:offset</span> + update-cursor screen, recipes, current-sandbox, sandbox-in-focus? + show-screen screen + <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span> +] + +<span class="muRecipe">recipe</span> render-minimal [ + <span class="Constant">local-scope</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, <span class="Constant">recipes:offset</span> + current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">current-sandbox:offset</span> + sandbox-in-focus?:boolean<span class="Special"> <- </span>get *env, <span class="Constant">sandbox-in-focus?:offset</span> + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> sandbox-in-focus? + screen<span class="Special"> <- </span>render-recipes screen, env + cursor-row:number<span class="Special"> <- </span>get *recipes, <span class="Constant">cursor-row:offset</span> + cursor-column:number<span class="Special"> <- </span>get *recipes, <span class="Constant">cursor-column:offset</span> + <span class="Delimiter">}</span> + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> sandbox-in-focus? + screen<span class="Special"> <- </span>render-sandbox-side screen, env + cursor-row:number<span class="Special"> <- </span>get *current-sandbox, <span class="Constant">cursor-row:offset</span> + cursor-column:number<span class="Special"> <- </span>get *current-sandbox, <span class="Constant">cursor-column:offset</span> + <span class="Delimiter">}</span> + move-cursor screen, cursor-row, cursor-column + show-screen screen + <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span> +] + +<span class="muRecipe">recipe</span> render-recipes [ + <span class="Constant">local-scope</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, <span class="Constant">recipes:offset</span> + <span class="Comment"># render recipes</span> + left:number<span class="Special"> <- </span>get *recipes, <span class="Constant">left:offset</span> + right:number<span class="Special"> <- </span>get *recipes, <span class="Constant">right:offset</span> + row:number, screen<span class="Special"> <- </span>render screen, recipes + recipe-warnings:address:array:character<span class="Special"> <- </span>get *env, <span class="Constant">recipe-warnings:offset</span> + <span class="Delimiter">{</span> + <span class="Comment"># print any warnings</span> + <span class="muControl">break-unless</span> recipe-warnings + row, screen<span class="Special"> <- </span>render-string screen, recipe-warnings, left, right, <span class="Constant">1/red</span>, row + <span class="Delimiter">}</span> + <span class="Delimiter">{</span> + <span class="Comment"># no warnings? move to next line</span> + <span class="muControl">break-if</span> recipe-warnings + row<span class="Special"> <- </span>add row, <span class="Constant">1</span> + <span class="Delimiter">}</span> + <span class="Comment"># draw dotted line after recipes</span> + draw-horizontal screen, row, left, right, <span class="Constant">9480/horizontal-dotted</span> + <span class="Comment"># clear rest of screen</span> + row<span class="Special"> <- </span>add row, <span class="Constant">1</span> + move-cursor screen, row, left + screen-height:number<span class="Special"> <- </span>screen-height screen + <span class="Delimiter">{</span> + at-bottom-of-screen?:boolean<span class="Special"> <- </span>greater-or-equal row, screen-height + <span class="muControl">break-if</span> at-bottom-of-screen? + move-cursor screen, row, left + clear-line-delimited screen, left, right + row<span class="Special"> <- </span>add row, <span class="Constant">1</span> + <span class="muControl">loop</span> + <span class="Delimiter">}</span> + <span class="muControl">reply</span> screen/same-as-ingredient:<span class="Constant">0</span> +] + +<span class="Comment"># helper for testing a single editor</span> + +<span class="muRecipe">recipe</span> update-cursor [ + <span class="Constant">local-scope</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? +<span class="CommentedCode">#? $print [recipes in focus</span> +<span class="CommentedCode">#? ] #? 1</span> + cursor-row:number<span class="Special"> <- </span>get *recipes, <span class="Constant">cursor-row:offset</span> + cursor-column:number<span class="Special"> <- </span>get *recipes, <span class="Constant">cursor-column:offset</span> + <span class="Delimiter">}</span> + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> sandbox-in-focus? +<span class="CommentedCode">#? $print [sandboxes in focus</span> +<span class="CommentedCode">#? ] #? 1</span> + cursor-row:number<span class="Special"> <- </span>get *current-sandbox, <span class="Constant">cursor-row:offset</span> + cursor-column:number<span class="Special"> <- </span>get *current-sandbox, <span class="Constant">cursor-column:offset</span> + <span class="Delimiter">}</span> + move-cursor screen, cursor-row, cursor-column +] + +<span class="SalientComment">## running code from the editor and creating sandboxes</span> container sandbox-data [ data:address:array:character response:address:array:character warnings:address:array:character - starting-row-on-screen:number <span class="Comment"># to track clicks on delete</span> + trace:address:array:character + expected-response:address:array:character + <span class="Comment"># coordinates to track clicks</span> + starting-row-on-screen:number + response-starting-row-on-screen:number + display-trace?:boolean screen:address:screen <span class="Comment"># prints in the sandbox go here</span> next-sandbox:address:sandbox-data ] @@ -2856,60 +2830,91 @@ container sandbox-data [ ] ] +<span class="Comment"># hook into event-loop recipe: read non-unicode keypress from k, process it if</span> +<span class="Comment"># necessary, then go to next level</span> +<span class="muRecipe">after</span> +global-keypress [ + <span class="Comment"># F4? load all code and run all sandboxes.</span> + <span class="Delimiter">{</span> + do-run?:boolean<span class="Special"> <- </span>equal *k, <span class="Constant">65532/F4</span> + <span class="muControl">break-unless</span> do-run? + run-sandboxes env + <span class="Comment"># F4 might update warnings and results on both sides</span> + screen<span class="Special"> <- </span>render-all screen, env + update-cursor screen, recipes, current-sandbox, *sandbox-in-focus? + show-screen screen + <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> + <span class="Delimiter">}</span> +] + <span class="muRecipe">recipe</span> run-sandboxes [ <span class="Constant">local-scope</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, recipes:offset - current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, current-sandbox:offset + recipes:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">recipes:offset</span> <span class="Comment"># copy code from recipe editor, persist, load into mu, save any warnings</span> in:address:array:character<span class="Special"> <- </span>editor-contents recipes save <span class="Constant">[recipes.mu]</span>, in - recipe-warnings:address:address:array:character<span class="Special"> <- </span>get-address *env, recipe-warnings:offset + recipe-warnings:address:address:array:character<span class="Special"> <- </span>get-address *env, <span class="Constant">recipe-warnings:offset</span> *recipe-warnings<span class="Special"> <- </span>reload in <span class="Comment"># if recipe editor has errors, stop</span> <span class="muControl">reply-if</span> *recipe-warnings <span class="Comment"># check contents of right editor (sandbox)</span> + current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">current-sandbox:offset</span> <span class="Delimiter">{</span> sandbox-contents:address:array:character<span class="Special"> <- </span>editor-contents current-sandbox <span class="muControl">break-unless</span> sandbox-contents <span class="Comment"># if contents exist, first save them</span> <span class="Comment"># 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, data:offset + new-sandbox:address:sandbox-data<span class="Special"> <- </span>new <span class="Constant">sandbox-data:type</span> + data:address:address:array:character<span class="Special"> <- </span>get-address *new-sandbox, <span class="Constant">data:offset</span> *data<span class="Special"> <- </span>copy sandbox-contents <span class="Comment"># push to head of sandbox list</span> - dest:address:address:sandbox-data<span class="Special"> <- </span>get-address *env, sandbox:offset - next:address:address:sandbox-data<span class="Special"> <- </span>get-address *new-sandbox, next-sandbox:offset + dest:address:address:sandbox-data<span class="Special"> <- </span>get-address *env, <span class="Constant">sandbox:offset</span> + next:address:address:sandbox-data<span class="Special"> <- </span>get-address *new-sandbox, <span class="Constant">next-sandbox:offset</span> *next<span class="Special"> <- </span>copy *dest *dest<span class="Special"> <- </span>copy new-sandbox <span class="Comment"># clear sandbox editor</span> - init:address:address:duplex-list<span class="Special"> <- </span>get-address *current-sandbox, data:offset + init:address:address:duplex-list<span class="Special"> <- </span>get-address *current-sandbox, <span class="Constant">data:offset</span> *init<span class="Special"> <- </span>push-duplex <span class="Constant">167/§</span>, <span class="Constant">0/tail</span> <span class="Delimiter">}</span> <span class="Comment"># save all sandboxes before running, just in case we die when running</span> - <span class="Comment"># first clear previous versions, in case we deleted some sandbox</span> - $system <span class="Constant">[rm lesson/[0-9]</span>*] - curr:address:sandbox-data<span class="Special"> <- </span>get *env, sandbox:offset - filename:number<span class="Special"> <- </span>copy <span class="Constant">0</span> + save-sandboxes env + <span class="Comment"># run all sandboxes</span> + curr:address:sandbox-data<span class="Special"> <- </span>get *env, <span class="Constant">sandbox:offset</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> curr - data:address:address:array:character<span class="Special"> <- </span>get-address *curr, data:offset - save filename, *data - filename<span class="Special"> <- </span>add filename, <span class="Constant">1</span> - curr<span class="Special"> <- </span>get *curr, next-sandbox:offset + data<span class="Special"> <- </span>get-address *curr, <span class="Constant">data:offset</span> + response:address:address:array:character<span class="Special"> <- </span>get-address *curr, <span class="Constant">response:offset</span> + warnings:address:address:array:character<span class="Special"> <- </span>get-address *curr, <span class="Constant">warnings:offset</span> + trace:address:address:array:character<span class="Special"> <- </span>get-address *curr, <span class="Constant">trace:offset</span> + fake-screen:address:address:screen<span class="Special"> <- </span>get-address *curr, <span class="Constant">screen:offset</span> + *response, *warnings, *fake-screen, *trace<span class="Special"> <- </span>run-interactive *data + curr<span class="Special"> <- </span>get *curr, <span class="Constant">next-sandbox:offset</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="Comment"># run all sandboxes</span> - curr<span class="Special"> <- </span>get *env, sandbox:offset +] + +<span class="muRecipe">recipe</span> save-sandboxes [ + <span class="Constant">local-scope</span> + env:address:programming-environment-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">current-sandbox:offset</span> + <span class="Comment"># first clear previous versions, in case we deleted some sandbox</span> + $system <span class="Constant">[rm lesson/[0-9]</span>* >/dev/null <span class="Constant">2</span>>/dev/null] <span class="Comment"># some shells can't handle '>&'</span> + curr:address:sandbox-data<span class="Special"> <- </span>get *env, <span class="Constant">sandbox:offset</span> + suffix:address:array:character<span class="Special"> <- </span>new <span class="Constant">[.out]</span> + idx:number<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> curr - data<span class="Special"> <- </span>get-address *curr, data:offset - response:address:address:array:character<span class="Special"> <- </span>get-address *curr, response:offset - warnings:address:address:array:character<span class="Special"> <- </span>get-address *curr, warnings:offset - fake-screen:address:address:screen<span class="Special"> <- </span>get-address *curr, screen:offset - *response, *warnings, *fake-screen<span class="Special"> <- </span>run-interactive *data -<span class="CommentedCode">#? $print *warnings, [ ], **warnings, 10/newline</span> - curr<span class="Special"> <- </span>get *curr, next-sandbox:offset + data:address:array:character<span class="Special"> <- </span>get *curr, <span class="Constant">data:offset</span> + filename:address:array:character<span class="Special"> <- </span>integer-to-decimal-string idx + save filename, data + <span class="Delimiter">{</span> + expected-response:address:array:character<span class="Special"> <- </span>get *curr, <span class="Constant">expected-response:offset</span> + <span class="muControl">break-unless</span> expected-response + filename<span class="Special"> <- </span>string-append filename, suffix + save filename, expected-response + <span class="Delimiter">}</span> + idx<span class="Special"> <- </span>add idx, <span class="Constant">1</span> + curr<span class="Special"> <- </span>get *curr, <span class="Constant">next-sandbox:offset</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> ] @@ -2918,21 +2923,18 @@ container sandbox-data [ <span class="Constant">local-scope</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> - clear:boolean<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="CommentedCode">#? trace [app], [render sandbox side] #? 1</span> - current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, current-sandbox:offset - left:number<span class="Special"> <- </span>get *current-sandbox, left:offset - right:number<span class="Special"> <- </span>get *current-sandbox, right:offset + current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">current-sandbox:offset</span> + left:number<span class="Special"> <- </span>get *current-sandbox, <span class="Constant">left:offset</span> + right:number<span class="Special"> <- </span>get *current-sandbox, <span class="Constant">right:offset</span> row:number, screen<span class="Special"> <- </span>render screen, current-sandbox row<span class="Special"> <- </span>add row, <span class="Constant">1</span> draw-horizontal screen, row, left, right, <span class="Constant">9473/horizontal-double</span> - sandbox:address:sandbox-data<span class="Special"> <- </span>get *env, sandbox:offset + sandbox:address:sandbox-data<span class="Special"> <- </span>get *env, <span class="Constant">sandbox:offset</span> row, screen<span class="Special"> <- </span>render-sandboxes screen, sandbox, left, right, row - <span class="Comment"># clear next line, in case we just processed a backspace</span> + <span class="Comment"># clear rest of screen</span> row<span class="Special"> <- </span>add row, <span class="Constant">1</span> move-cursor screen, row, left - clear-line-delimited screen, left, right - <span class="muControl">reply-unless</span> clear, screen/same-as-ingredient:<span class="Constant">0</span> screen-height:number<span class="Special"> <- </span>screen-height screen <span class="Delimiter">{</span> at-bottom-of-screen?:boolean<span class="Special"> <- </span>greater-or-equal row, screen-height @@ -2962,17 +2964,20 @@ container sandbox-data [ clear-line-delimited screen, left, right print-character screen, <span class="Constant">120/x</span>, <span class="Constant">245/grey</span> <span class="Comment"># save menu row so we can detect clicks to it later</span> - starting-row:address:number<span class="Special"> <- </span>get-address *sandbox, starting-row-on-screen:offset + starting-row:address:number<span class="Special"> <- </span>get-address *sandbox, <span class="Constant">starting-row-on-screen:offset</span> *starting-row<span class="Special"> <- </span>copy row <span class="Comment"># render sandbox contents</span> - sandbox-data:address:array:character<span class="Special"> <- </span>get *sandbox, data:offset + sandbox-data:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">data:offset</span> row, screen<span class="Special"> <- </span>render-string screen, sandbox-data, left, right, <span class="Constant">7/white</span>, row <span class="Comment"># render sandbox warnings, screen or response, in that order</span> - sandbox-response:address:array:character<span class="Special"> <- </span>get *sandbox, response:offset - sandbox-warnings:address:array:character<span class="Special"> <- </span>get *sandbox, warnings:offset - sandbox-screen:address<span class="Special"> <- </span>get *sandbox, screen:offset + response-starting-row:address:number<span class="Special"> <- </span>get-address *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span> + sandbox-response:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">response:offset</span> + sandbox-warnings:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">warnings:offset</span> + sandbox-screen:address<span class="Special"> <- </span>get *sandbox, <span class="Constant">screen:offset</span> +<span class="Constant"> +render-sandbox-results</span> <span class="Delimiter">{</span> <span class="muControl">break-unless</span> sandbox-warnings + *response-starting-row<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># no response</span> row, screen<span class="Special"> <- </span>render-string screen, sandbox-warnings, left, right, <span class="Constant">1/red</span>, row <span class="Delimiter">}</span> <span class="Delimiter">{</span> @@ -2984,14 +2989,18 @@ container sandbox-data [ <span class="Delimiter">{</span> <span class="muControl">break-if</span> sandbox-warnings <span class="muControl">break-unless</span> empty-screen? +<span class="CommentedCode">#? $print [display response from ], row, 10/newline #? 1</span> + *response-starting-row<span class="Special"> <- </span>add row, <span class="Constant">1</span> +<span class="Constant"> +render-sandbox-response</span> row, screen<span class="Special"> <- </span>render-string screen, sandbox-response, left, right, <span class="Constant">245/grey</span>, row <span class="Delimiter">}</span> +<span class="Constant"> +render-sandbox-end</span> at-bottom?:boolean<span class="Special"> <- </span>greater-or-equal row, screen-height <span class="muControl">reply-if</span> at-bottom?, row/same-as-ingredient:<span class="Constant">4</span>, screen/same-as-ingredient:<span class="Constant">0</span> <span class="Comment"># draw solid line after sandbox</span> draw-horizontal screen, row, left, right, <span class="Constant">9473/horizontal-double</span> <span class="Comment"># draw next sandbox</span> - next-sandbox:address:sandbox-data<span class="Special"> <- </span>get *sandbox, next-sandbox:offset + next-sandbox:address:sandbox-data<span class="Special"> <- </span>get *sandbox, <span class="Constant">next-sandbox:offset</span> row, screen<span class="Special"> <- </span>render-sandboxes screen, next-sandbox, left, right, row <span class="muControl">reply</span> row/same-as-ingredient:<span class="Constant">4</span>, screen/same-as-ingredient:<span class="Constant">0</span> ] @@ -3001,52 +3010,100 @@ container sandbox-data [ <span class="Constant">local-scope</span> env:address:programming-environment-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> <span class="Comment"># read all scenarios, pushing them to end of a list of scenarios</span> - filename:number<span class="Special"> <- </span>copy <span class="Constant">0</span> - curr:address:address:sandbox-data<span class="Special"> <- </span>get-address *env, sandbox:offset + suffix:address:array:character<span class="Special"> <- </span>new <span class="Constant">[.out]</span> + idx:number<span class="Special"> <- </span>copy <span class="Constant">0</span> + curr:address:address:sandbox-data<span class="Special"> <- </span>get-address *env, <span class="Constant">sandbox:offset</span> <span class="Delimiter">{</span> + filename:address:array:character<span class="Special"> <- </span>integer-to-decimal-string idx contents:address:array:character<span class="Special"> <- </span>restore filename <span class="muControl">break-unless</span> contents <span class="Comment"># stop at first error; assuming file didn't exist</span> <span class="Comment"># create new sandbox for file</span> - *curr<span class="Special"> <- </span>new sandbox-data:type - data:address:address:array:character<span class="Special"> <- </span>get-address **curr, data:offset + *curr<span class="Special"> <- </span>new <span class="Constant">sandbox-data:type</span> + data:address:address:array:character<span class="Special"> <- </span>get-address **curr, <span class="Constant">data:offset</span> *data<span class="Special"> <- </span>copy contents + <span class="Comment"># restore expected output for sandbox if it exists</span> + <span class="Delimiter">{</span> + filename<span class="Special"> <- </span>string-append filename, suffix + contents<span class="Special"> <- </span>restore filename + <span class="muControl">break-unless</span> contents + expected-response:address:address:array:character<span class="Special"> <- </span>get-address **curr, <span class="Constant">expected-response:offset</span> + *expected-response<span class="Special"> <- </span>copy contents + <span class="Delimiter">}</span> <span class="Comment"># increment loop variables</span> - filename<span class="Special"> <- </span>add filename, <span class="Constant">1</span> - curr<span class="Special"> <- </span>get-address **curr, next-sandbox:offset + idx<span class="Special"> <- </span>add idx, <span class="Constant">1</span> + curr<span class="Special"> <- </span>get-address **curr, <span class="Constant">next-sandbox:offset</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> <span class="muControl">reply</span> env/same-as-ingredient:<span class="Constant">0</span> ] -<span class="Comment"># was-deleted?:boolean <- delete-sandbox t:touch-event, env:address:programming-environment-data</span> -<span class="muRecipe">recipe</span> delete-sandbox [ +<span class="Comment"># row:number, screen:address <- render-screen screen:address, sandbox-screen:address, left:number, right:number, row:number</span> +<span class="Comment"># print the fake sandbox screen to 'screen' with appropriate delimiters</span> +<span class="Comment"># leave cursor at start of next line</span> +<span class="muRecipe">recipe</span> render-screen [ <span class="Constant">local-scope</span> - t:touch-event<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> - click-column:number<span class="Special"> <- </span>get t, column:offset - current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, current-sandbox:offset - right:number<span class="Special"> <- </span>get *current-sandbox, right:offset - at-right?:boolean<span class="Special"> <- </span>equal click-column, right - <span class="muControl">reply-unless</span> at-right?, <span class="Constant">0/false</span> - click-row:number<span class="Special"> <- </span>get t, row:offset - prev:address:address:sandbox-data<span class="Special"> <- </span>get-address *env, sandbox:offset - curr:address:sandbox-data<span class="Special"> <- </span>get *env, sandbox:offset + screen:address<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + s:address:screen<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> + row<span class="Special"> <- </span>add row, <span class="Constant">1</span> + <span class="muControl">reply-unless</span> s, row/same-as-ingredient:<span class="Constant">4</span>, screen/same-as-ingredient:<span class="Constant">0</span> + <span class="Comment"># print 'screen:'</span> + header:address:array:character<span class="Special"> <- </span>new <span class="Constant">[screen:]</span> + row<span class="Special"> <- </span>subtract row, <span class="Constant">1</span> <span class="Comment"># compensate for render-string below</span> + row<span class="Special"> <- </span>render-string screen, header, left, right, <span class="Constant">245/grey</span>, row + <span class="Comment"># newline</span> + row<span class="Special"> <- </span>add row, <span class="Constant">1</span> + move-cursor screen, row, left + <span class="Comment"># start printing s</span> + column:number<span class="Special"> <- </span>copy left + s-width:number<span class="Special"> <- </span>screen-width s + s-height:number<span class="Special"> <- </span>screen-height s + buf:address:array:screen-cell<span class="Special"> <- </span>get *s, <span class="Constant">data:offset</span> + stop-printing:number<span class="Special"> <- </span>add left, s-width, <span class="Constant">3</span> + max-column:number<span class="Special"> <- </span>min stop-printing, right + i:number<span class="Special"> <- </span>copy <span class="Constant">0</span> + len:number<span class="Special"> <- </span>length *buf + screen-height:number<span class="Special"> <- </span>screen-height screen <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> curr - <span class="Comment"># more sandboxes to check</span> + done?:boolean<span class="Special"> <- </span>greater-or-equal i, len + <span class="muControl">break-if</span> done? + done?<span class="Special"> <- </span>greater-or-equal row, screen-height + <span class="muControl">break-if</span> done? + column<span class="Special"> <- </span>copy left + move-cursor screen, row, column + <span class="Comment"># initial leader for each row: two spaces and a '.'</span> + print-character screen, <span class="Constant">32/space</span>, <span class="Constant">245/grey</span> + print-character screen, <span class="Constant">32/space</span>, <span class="Constant">245/grey</span> + print-character screen, <span class="Constant">46/full-stop</span>, <span class="Constant">245/grey</span> + column<span class="Special"> <- </span>add left, <span class="Constant">3</span> <span class="Delimiter">{</span> - target-row:number<span class="Special"> <- </span>get *curr, starting-row-on-screen:offset - delete-curr?:boolean<span class="Special"> <- </span>equal target-row, click-row - <span class="muControl">break-unless</span> delete-curr? - <span class="Comment"># delete this sandbox, rerender and stop</span> - *prev<span class="Special"> <- </span>get *curr, next-sandbox:offset - <span class="muControl">reply</span> <span class="Constant">1/true</span> + <span class="Comment"># print row</span> + row-done?:boolean<span class="Special"> <- </span>greater-or-equal column, max-column + <span class="muControl">break-if</span> row-done? + curr:screen-cell<span class="Special"> <- </span>index *buf, i + c:character<span class="Special"> <- </span>get curr, <span class="Constant">contents:offset</span> + print-character screen, c, <span class="Constant">245/grey</span> + column<span class="Special"> <- </span>add column, <span class="Constant">1</span> + i<span class="Special"> <- </span>add i, <span class="Constant">1</span> + <span class="muControl">loop</span> <span class="Delimiter">}</span> - prev<span class="Special"> <- </span>get-address *curr, next-sandbox:offset - curr<span class="Special"> <- </span>get *curr, next-sandbox:offset + <span class="Comment"># print final '.'</span> + print-character screen, <span class="Constant">46/full-stop</span>, <span class="Constant">245/grey</span> + column<span class="Special"> <- </span>add column, <span class="Constant">1</span> + <span class="Delimiter">{</span> + <span class="Comment"># clear rest of current line</span> + line-done?:boolean<span class="Special"> <- </span>greater-than column, right + <span class="muControl">break-if</span> line-done? + print-character screen, <span class="Constant">32/space</span> + column<span class="Special"> <- </span>add column, <span class="Constant">1</span> + <span class="muControl">loop</span> + <span class="Delimiter">}</span> + row<span class="Special"> <- </span>add row, <span class="Constant">1</span> <span class="muControl">loop</span> <span class="Delimiter">}</span> - <span class="muControl">reply</span> <span class="Constant">0/false</span> + <span class="muControl">reply</span> row/same-as-ingredient:<span class="Constant">4</span>, screen/same-as-ingredient:<span class="Constant">0</span> ] <span class="muScenario">scenario</span> run-updates-results [ @@ -3188,6 +3245,154 @@ container sandbox-data [ ] ] +<span class="muRecipe">recipe</span> editor-contents [ + <span class="Constant">local-scope</span> + editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + buf:address:buffer<span class="Special"> <- </span>new-buffer <span class="Constant">80</span> + curr:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">data:offset</span> + <span class="Comment"># skip § sentinel</span> + assert curr, <span class="Constant">[editor without data is illegal; must have at least a sentinel]</span> + curr<span class="Special"> <- </span>next-duplex curr + <span class="muControl">reply-unless</span> curr, <span class="Constant">0</span> + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> curr + c:character<span class="Special"> <- </span>get *curr, <span class="Constant">value:offset</span> + buffer-append buf, c + curr<span class="Special"> <- </span>next-duplex curr + <span class="muControl">loop</span> + <span class="Delimiter">}</span> + result:address:array:character<span class="Special"> <- </span>buffer-to-array buf + <span class="muControl">reply</span> result +] + +<span class="muScenario">scenario</span> editor-provides-edited-contents [ + assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> + <span class="Constant">2</span>:address:editor-data<span class="Special"> <- </span>new-editor <span class="Constant">1</span>:address:array:character, screen:address, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> + assume-console [ + left-click <span class="Constant">1</span>, <span class="Constant">2</span> + type <span class="Constant">[def]</span> + ] + run [ + editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data + <span class="Constant">3</span>:address:array:character<span class="Special"> <- </span>editor-contents <span class="Constant">2</span>:address:editor-data + <span class="Constant">4</span>:array:character<span class="Special"> <- </span>copy *<span class="Constant">3</span>:address:array:character + ] + memory-should-contain [ + <span class="Constant">4</span>:string<span class="Special"> <- </span><span class="Constant">[abdefc]</span> + ] +] + +<span class="SalientComment">## editing sandboxes after they've been created</span> + +<span class="muScenario">scenario</span> clicking-on-a-sandbox-moves-it-to-editor [ +<span class="Constant"> $close-trace</span> + assume-screen <span class="Constant">40/width</span>, <span class="Constant">10/height</span> + <span class="Comment"># basic recipe</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ </span> +<span class="Constant">recipe foo [</span> +<span class="Constant"> add 2, 2</span> +<span class="Constant">]</span>] + <span class="Comment"># run it</span> + <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[foo]</span> + assume-console [ + press <span class="Constant">65532</span> <span class="Comment"># F4</span> + ] + <span class="Constant">3</span>:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, <span class="Constant">1</span>:address:array:character, <span class="Constant">2</span>:address:array:character + event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . add 2, 2 ┊ x.</span> + <span class="Constant"> .] ┊foo .</span> + <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊4 .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + <span class="Comment"># click somewhere on the sandbox</span> + assume-console [ + left-click <span class="Constant">3</span>, <span class="Constant">30</span> + ] + run [ + event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data + ] + <span class="Comment"># it pops back into editor</span> + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> . ┊foo .</span> + <span class="Constant"> .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . add 2, 2 ┊ .</span> + <span class="Constant"> .] ┊ .</span> + <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊ .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> . ┊ .</span> + ] +] + +<span class="muRecipe">after</span> +global-touch [ + <span class="Comment"># right side of screen and below sandbox editor? pop appropriate sandbox</span> + <span class="Comment"># contents back into sandbox editor provided it's empty</span> + <span class="Delimiter">{</span> + sandbox-left-margin:number<span class="Special"> <- </span>get *current-sandbox, <span class="Constant">left:offset</span> + click-column:number<span class="Special"> <- </span>get *t, <span class="Constant">column:offset</span> + on-sandbox-side?:boolean<span class="Special"> <- </span>greater-or-equal click-column, sandbox-left-margin + <span class="muControl">break-unless</span> on-sandbox-side? + first-sandbox:address:sandbox-data<span class="Special"> <- </span>get *env, <span class="Constant">sandbox:offset</span> + <span class="muControl">break-unless</span> first-sandbox + first-sandbox-begins:number<span class="Special"> <- </span>get *first-sandbox, <span class="Constant">starting-row-on-screen:offset</span> + click-row:number<span class="Special"> <- </span>get *t, <span class="Constant">row:offset</span> + below-sandbox-editor?:boolean<span class="Special"> <- </span>greater-or-equal click-row, first-sandbox-begins + <span class="muControl">break-unless</span> below-sandbox-editor? + empty-sandbox-editor?:boolean<span class="Special"> <- </span>empty-editor? current-sandbox + <span class="muControl">break-unless</span> empty-sandbox-editor? <span class="Comment"># make the user hit F4 before editing a new sandbox</span> + <span class="Comment"># identify the sandbox to edit and remove it from the sandbox list</span> + sandbox:address:sandbox-data<span class="Special"> <- </span>extract-sandbox env, click-row + text:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">data:offset</span> + current-sandbox<span class="Special"> <- </span>insert-text current-sandbox, text + screen<span class="Special"> <- </span>render-sandbox-side screen, env + update-cursor screen, recipes, current-sandbox, *sandbox-in-focus? + show-screen screen + <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> + <span class="Delimiter">}</span> +] + +<span class="muRecipe">recipe</span> empty-editor? [ + <span class="Constant">local-scope</span> + editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + head:address:duplex-list<span class="Special"> <- </span>get *editor, <span class="Constant">data:offset</span> + first:address:duplex-list<span class="Special"> <- </span>next-duplex head + result:boolean<span class="Special"> <- </span>not first + <span class="muControl">reply</span> result +] + +<span class="muRecipe">recipe</span> extract-sandbox [ + <span class="Constant">local-scope</span> + env:address:programming-environment-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + click-row:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Comment"># assert click-row >= sandbox.starting-row-on-screen</span> + sandbox:address:address:sandbox-data<span class="Special"> <- </span>get-address *env, <span class="Constant">sandbox:offset</span> + start:number<span class="Special"> <- </span>get **sandbox, <span class="Constant">starting-row-on-screen:offset</span> + clicked-on-sandboxes?:boolean<span class="Special"> <- </span>greater-or-equal click-row, start + assert clicked-on-sandboxes?, <span class="Constant">[extract-sandbox called on click to sandbox editor]</span> + <span class="Delimiter">{</span> + next-sandbox:address:sandbox-data<span class="Special"> <- </span>get **sandbox, <span class="Constant">next-sandbox:offset</span> + <span class="muControl">break-unless</span> next-sandbox + <span class="Comment"># if click-row < sandbox.next-sandbox.starting-row-on-screen, break</span> + next-start:number<span class="Special"> <- </span>get *next-sandbox, <span class="Constant">starting-row-on-screen:offset</span> + found?:boolean<span class="Special"> <- </span>lesser-than click-row, next-start + <span class="muControl">break-if</span> found? + sandbox<span class="Special"> <- </span>get-address **sandbox, <span class="Constant">next-sandbox:offset</span> + <span class="muControl">loop</span> + <span class="Delimiter">}</span> + <span class="Comment"># snip sandbox out of its list</span> + result:address:sandbox-data<span class="Special"> <- </span>copy *sandbox + *sandbox<span class="Special"> <- </span>copy next-sandbox + <span class="muControl">reply</span> result +] + +<span class="SalientComment">## deleting sandboxes</span> + <span class="muScenario">scenario</span> deleting-sandboxes [ $close-trace <span class="Comment"># trace too long for github</span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span> @@ -3254,6 +3459,50 @@ container sandbox-data [ ] ] +<span class="muRecipe">after</span> +global-touch [ + <span class="Comment"># on a sandbox delete icon? process delete</span> + <span class="Delimiter">{</span> + was-delete?:boolean<span class="Special"> <- </span>delete-sandbox *t, env + <span class="muControl">break-unless</span> was-delete? +<span class="CommentedCode">#? trace [app], [delete clicked] #? 1</span> + screen<span class="Special"> <- </span>render-sandbox-side screen, env + update-cursor screen, recipes, current-sandbox, *sandbox-in-focus? + show-screen screen + <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> + <span class="Delimiter">}</span> +] + +<span class="Comment"># was-deleted?:boolean <- delete-sandbox t:touch-event, env:address:programming-environment-data</span> +<span class="muRecipe">recipe</span> delete-sandbox [ + <span class="Constant">local-scope</span> + t:touch-event<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> + click-column:number<span class="Special"> <- </span>get t, <span class="Constant">column:offset</span> + current-sandbox:address:editor-data<span class="Special"> <- </span>get *env, <span class="Constant">current-sandbox:offset</span> + right:number<span class="Special"> <- </span>get *current-sandbox, <span class="Constant">right:offset</span> + at-right?:boolean<span class="Special"> <- </span>equal click-column, right + <span class="muControl">reply-unless</span> at-right?, <span class="Constant">0/false</span> + click-row:number<span class="Special"> <- </span>get t, <span class="Constant">row:offset</span> + prev:address:address:sandbox-data<span class="Special"> <- </span>get-address *env, <span class="Constant">sandbox:offset</span> + curr:address:sandbox-data<span class="Special"> <- </span>get *env, <span class="Constant">sandbox:offset</span> + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> curr + <span class="Comment"># more sandboxes to check</span> + <span class="Delimiter">{</span> + target-row:number<span class="Special"> <- </span>get *curr, <span class="Constant">starting-row-on-screen:offset</span> + delete-curr?:boolean<span class="Special"> <- </span>equal target-row, click-row + <span class="muControl">break-unless</span> delete-curr? + <span class="Comment"># delete this sandbox, rerender and stop</span> + *prev<span class="Special"> <- </span>get *curr, <span class="Constant">next-sandbox:offset</span> + <span class="muControl">reply</span> <span class="Constant">1/true</span> + <span class="Delimiter">}</span> + prev<span class="Special"> <- </span>get-address *curr, <span class="Constant">next-sandbox:offset</span> + curr<span class="Special"> <- </span>get *curr, <span class="Constant">next-sandbox:offset</span> + <span class="muControl">loop</span> + <span class="Delimiter">}</span> + <span class="muControl">reply</span> <span class="Constant">0/false</span> +] + <span class="muScenario">scenario</span> run-instruction-manages-screen-per-sandbox [ $close-trace <span class="Comment"># trace too long for github #? 1</span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">20/height</span> @@ -3288,42 +3537,357 @@ container sandbox-data [ ] ] -<span class="muRecipe">recipe</span> editor-contents [ +<span class="SalientComment">## clicking on sandbox results to 'fix' them and turn sandboxes into tests</span> + +<span class="muScenario">scenario</span> sandbox-click-on-result-toggles-color-to-green [ +<span class="Constant"> $close-trace</span> + assume-screen <span class="Constant">40/width</span>, <span class="Constant">10/height</span> + <span class="Comment"># basic recipe</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ </span> +<span class="Constant">recipe foo [</span> +<span class="Constant"> add 2, 2</span> +<span class="Constant">]</span>] + <span class="Comment"># run it</span> + <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[foo]</span> + assume-console [ + press <span class="Constant">65532</span> <span class="Comment"># F4</span> + ] + <span class="Constant">3</span>:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, <span class="Constant">1</span>:address:array:character, <span class="Constant">2</span>:address:array:character + event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . add 2, 2 ┊ x.</span> + <span class="Constant"> .] ┊foo .</span> + <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊4 .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + <span class="Comment"># click on the '4' in the result</span> + assume-console [ + left-click <span class="Constant">5</span>, <span class="Constant">21</span> + ] + run [ + event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data + ] + <span class="Comment"># color toggles to green</span> + screen-should-contain-in-color <span class="Constant">2/green</span>, [ + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . 4 .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + ] + <span class="Comment"># now change the second arg of the 'add'</span> + <span class="Comment"># then rerun</span> + assume-console [ + left-click <span class="Constant">3</span>, <span class="Constant">11</span> <span class="Comment"># cursor to end of line</span> + type <span class="Constant">[«3]</span> <span class="Comment"># turn '2' into '3'</span> + press <span class="Constant">65532</span> <span class="Comment"># F4</span> + ] + <span class="Constant">4</span>:event/backspace<span class="Special"> <- </span>merge <span class="Constant">0/text</span>, <span class="Constant">8/backspace</span>, <span class="Constant">0/dummy</span>, <span class="Constant">0/dummy</span> + replace-in-console <span class="Constant">171/«</span>, <span class="Constant">4</span>:event/backspace + run [ + event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data + ] + <span class="Comment"># result turns red</span> + screen-should-contain-in-color <span class="Constant">1/red</span>, [ + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . 5 .</span> + <span class="Constant"> . .</span> + <span class="Constant"> . .</span> + ] +] + +<span class="Comment"># clicks on sandbox responses save it as 'expected'</span> +<span class="muRecipe">after</span> +global-touch [ + <span class="Comment"># right side of screen? check if it's inside the output of any sandbox</span> + <span class="Delimiter">{</span> + sandbox-left-margin:number<span class="Special"> <- </span>get *current-sandbox, <span class="Constant">left:offset</span> + click-column:number<span class="Special"> <- </span>get *t, <span class="Constant">column:offset</span> + on-sandbox-side?:boolean<span class="Special"> <- </span>greater-or-equal click-column, sandbox-left-margin + <span class="muControl">break-unless</span> on-sandbox-side? + first-sandbox:address:sandbox-data<span class="Special"> <- </span>get *env, <span class="Constant">sandbox:offset</span> + <span class="muControl">break-unless</span> first-sandbox + first-sandbox-begins:number<span class="Special"> <- </span>get *first-sandbox, <span class="Constant">starting-row-on-screen:offset</span> + click-row:number<span class="Special"> <- </span>get *t, <span class="Constant">row:offset</span> + below-sandbox-editor?:boolean<span class="Special"> <- </span>greater-or-equal click-row, first-sandbox-begins + <span class="muControl">break-unless</span> below-sandbox-editor? + <span class="Comment"># identify the sandbox whose output is being clicked on</span> + sandbox:address:sandbox-data<span class="Special"> <- </span>find-click-in-sandbox-output env, click-row + <span class="muControl">break-unless</span> sandbox + <span class="Comment"># toggle its expected-response, and save session</span> + sandbox<span class="Special"> <- </span>toggle-expected-response sandbox + save-sandboxes env + screen<span class="Special"> <- </span>render-sandbox-side screen, env, <span class="Constant">1/clear</span> + <span class="Comment"># no change in cursor</span> + show-screen screen + <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> + <span class="Delimiter">}</span> +] + +<span class="muRecipe">recipe</span> find-click-in-sandbox-output [ <span class="Constant">local-scope</span> - editor:address:editor-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> - buf:address:buffer<span class="Special"> <- </span>new-buffer <span class="Constant">80</span> - curr:address:duplex-list<span class="Special"> <- </span>get *editor, data:offset - <span class="Comment"># skip § sentinel</span> - assert curr, <span class="Constant">[editor without data is illegal; must have at least a sentinel]</span> - curr<span class="Special"> <- </span>next-duplex curr - <span class="muControl">reply-unless</span> curr, <span class="Constant">0</span> + env:address:programming-environment-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + click-row:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Comment"># assert click-row >= sandbox.starting-row-on-screen</span> + sandbox:address:sandbox-data<span class="Special"> <- </span>get *env, <span class="Constant">sandbox:offset</span> + start:number<span class="Special"> <- </span>get *sandbox, <span class="Constant">starting-row-on-screen:offset</span> + clicked-on-sandboxes?:boolean<span class="Special"> <- </span>greater-or-equal click-row, start + assert clicked-on-sandboxes?, <span class="Constant">[extract-sandbox called on click to sandbox editor]</span> + <span class="Comment"># while click-row < sandbox.next-sandbox.starting-row-on-screen</span> <span class="Delimiter">{</span> - <span class="muControl">break-unless</span> curr - c:character<span class="Special"> <- </span>get *curr, value:offset - buffer-append buf, c - curr<span class="Special"> <- </span>next-duplex curr + next-sandbox:address:sandbox-data<span class="Special"> <- </span>get *sandbox, <span class="Constant">next-sandbox:offset</span> + <span class="muControl">break-unless</span> next-sandbox + next-start:number<span class="Special"> <- </span>get *next-sandbox, <span class="Constant">starting-row-on-screen:offset</span> + found?:boolean<span class="Special"> <- </span>lesser-than click-row, next-start + <span class="muControl">break-if</span> found? + sandbox<span class="Special"> <- </span>copy next-sandbox <span class="muControl">loop</span> <span class="Delimiter">}</span> - result:address:array:character<span class="Special"> <- </span>buffer-to-array buf - <span class="muControl">reply</span> result + <span class="Comment"># return sandbox if click is in its output region</span> + response-starting-row:number<span class="Special"> <- </span>get *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span> + click-in-response?:boolean<span class="Special"> <- </span>greater-or-equal click-row, response-starting-row + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> click-in-response? + <span class="muControl">reply</span> <span class="Constant">0/no-click-in-sandbox-output</span> + <span class="Delimiter">}</span> + <span class="muControl">reply</span> sandbox ] -<span class="muScenario">scenario</span> editor-provides-edited-contents [ - assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> - <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[abc]</span> - <span class="Constant">2</span>:address:editor-data<span class="Special"> <- </span>new-editor <span class="Constant">1</span>:address:array:character, screen:address, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> +<span class="muRecipe">recipe</span> toggle-expected-response [ + <span class="Constant">local-scope</span> + sandbox:address:sandbox-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + expected-response:address:address:array:character<span class="Special"> <- </span>get-address *sandbox, <span class="Constant">expected-response:offset</span> + <span class="Delimiter">{</span> + <span class="Comment"># if expected-response is set, reset</span> + <span class="muControl">break-unless</span> *expected-response + *expected-response<span class="Special"> <- </span>copy <span class="Constant">0</span> + <span class="muControl">reply</span> sandbox/same-as-ingredient:<span class="Constant">0</span> + <span class="Delimiter">}</span> + <span class="Comment"># if not, current response is the expected response</span> + response:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">response:offset</span> + *expected-response<span class="Special"> <- </span>copy response + <span class="muControl">reply</span> sandbox/same-as-ingredient:<span class="Constant">0</span> +] + +<span class="Comment"># when rendering a sandbox, color it in red/green if expected response exists</span> +<span class="muRecipe">after</span> +render-sandbox-response [ + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> sandbox-response + expected-response:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">expected-response:offset</span> + <span class="muControl">break-unless</span> expected-response <span class="Comment"># fall-through to print in grey</span> + response-is-expected?:boolean<span class="Special"> <- </span>string-equal expected-response, sandbox-response + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> response-is-expected?:boolean + row, screen<span class="Special"> <- </span>render-string screen, sandbox-response, left, right, <span class="Constant">1/red</span>, row + <span class="Delimiter">}</span> + <span class="Delimiter">{</span> + <span class="muControl">break-unless</span> response-is-expected?:boolean + row, screen<span class="Special"> <- </span>render-string screen, sandbox-response, left, right, <span class="Constant">2/green</span>, row + <span class="Delimiter">}</span> + <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end:label</span> + <span class="Delimiter">}</span> +] + +<span class="SalientComment">## click on the code typed into a sandbox to toggle its trace</span> + +<span class="muScenario">scenario</span> sandbox-click-on-code-toggles-app-trace [ +<span class="Constant"> $close-trace</span> + assume-screen <span class="Constant">40/width</span>, <span class="Constant">10/height</span> + <span class="Comment"># basic recipe</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ </span> +<span class="Constant">recipe foo [</span> +<span class="Constant"> trace [abc]</span> +]] + <span class="Comment"># run it</span> + <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[foo]</span> assume-console [ - left-click <span class="Constant">1</span>, <span class="Constant">2</span> - type <span class="Constant">[def]</span> + press <span class="Constant">65532</span> <span class="Comment"># F4</span> + ] + <span class="Constant">3</span>:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, <span class="Constant">1</span>:address:array:character, <span class="Constant">2</span>:address:array:character + event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . trace [abc] ┊ x.</span> + <span class="Constant"> .] ┊foo .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + <span class="Comment"># click on the 'foo' line in the sandbox</span> + assume-console [ + left-click <span class="Constant">4</span>, <span class="Constant">21</span> ] run [ - editor-event-loop screen:address, console:address, <span class="Constant">2</span>:address:editor-data - <span class="Constant">3</span>:address:array:character<span class="Special"> <- </span>editor-contents <span class="Constant">2</span>:address:editor-data - <span class="Constant">4</span>:array:character<span class="Special"> <- </span>copy *<span class="Constant">3</span>:address:array:character + event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data ] - memory-should-contain [ - <span class="Constant">4</span>:string<span class="Special"> <- </span><span class="Constant">[abdefc]</span> + <span class="Comment"># trace now printed</span> + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . trace [abc] ┊ x.</span> + <span class="Constant"> .] ┊foo .</span> + <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊abc .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + screen-should-contain-in-color <span class="Constant">245/grey</span>, [ + <span class="Constant"> . .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ x.</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊abc .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + <span class="Comment"># click again on the same region</span> + assume-console [ + left-click <span class="Constant">4</span>, <span class="Constant">25</span> + ] + run [ + event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data + ] + <span class="Comment"># trace hidden again</span> + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . trace [abc] ┊ x.</span> + <span class="Constant"> .] ┊foo .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] +] + +<span class="muScenario">scenario</span> sandbox-shows-app-trace-and-result [ +<span class="Constant"> $close-trace</span> + assume-screen <span class="Constant">40/width</span>, <span class="Constant">10/height</span> + <span class="Comment"># basic recipe</span> + <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[ </span> +<span class="Constant">recipe foo [</span> +<span class="Constant"> trace [abc]</span> + add <span class="Constant">2</span>, <span class="Constant">2</span> +]] + <span class="Comment"># run it</span> + <span class="Constant">2</span>:address:array:character<span class="Special"> <- </span>new <span class="Constant">[foo]</span> + assume-console [ + press <span class="Constant">65532</span> <span class="Comment"># F4</span> + ] + <span class="Constant">3</span>:address:programming-environment-data<span class="Special"> <- </span>new-programming-environment screen:address, <span class="Constant">1</span>:address:array:character, <span class="Constant">2</span>:address:array:character + event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . trace [abc] ┊ x.</span> + <span class="Constant"> . add 2, 2 ┊foo .</span> + <span class="Constant"> .] ┊4 .</span> +<span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] + <span class="Comment"># click on the 'foo' line in the sandbox</span> + assume-console [ + left-click <span class="Constant">4</span>, <span class="Constant">21</span> ] + run [ + event-loop screen:address, console:address, <span class="Constant">3</span>:address:programming-environment-data + ] + <span class="Comment"># trace now printed</span> + screen-should-contain [ + <span class="Constant"> . run (F4) .</span> + <span class="Constant"> . ┊ .</span> + <span class="Constant"> .recipe foo [ ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . trace [abc] ┊ x.</span> + <span class="Constant"> . add 2, 2 ┊foo .</span> + <span class="Constant"> .] ┊abc .</span> + <span class="Constant"> .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊4 .</span> + <span class="Constant"> . ┊━━━━━━━━━━━━━━━━━━━.</span> + <span class="Constant"> . ┊ .</span> + ] +] + +<span class="Comment"># clicks on sandbox code toggle its display-trace? flag</span> +<span class="muRecipe">after</span> +global-touch [ + <span class="Comment"># right side of screen? check if it's inside the code of any sandbox</span> + <span class="Delimiter">{</span> + sandbox-left-margin:number<span class="Special"> <- </span>get *current-sandbox, <span class="Constant">left:offset</span> + click-column:number<span class="Special"> <- </span>get *t, <span class="Constant">column:offset</span> + on-sandbox-side?:boolean<span class="Special"> <- </span>greater-or-equal click-column, sandbox-left-margin + <span class="muControl">break-unless</span> on-sandbox-side? + first-sandbox:address:sandbox-data<span class="Special"> <- </span>get *env, <span class="Constant">sandbox:offset</span> + <span class="muControl">break-unless</span> first-sandbox + first-sandbox-begins:number<span class="Special"> <- </span>get *first-sandbox, <span class="Constant">starting-row-on-screen:offset</span> + click-row:number<span class="Special"> <- </span>get *t, <span class="Constant">row:offset</span> + below-sandbox-editor?:boolean<span class="Special"> <- </span>greater-or-equal click-row, first-sandbox-begins + <span class="muControl">break-unless</span> below-sandbox-editor? + <span class="Comment"># identify the sandbox whose code is being clicked on</span> + sandbox:address:sandbox-data<span class="Special"> <- </span>find-click-in-sandbox-code env, click-row + <span class="muControl">break-unless</span> sandbox + <span class="Comment"># toggle its display-trace? property</span> + x:address:boolean<span class="Special"> <- </span>get-address *sandbox, <span class="Constant">display-trace?:offset</span> + *x<span class="Special"> <- </span>not *x + screen<span class="Special"> <- </span>render-sandbox-side screen, env, <span class="Constant">1/clear</span> + <span class="Comment"># no change in cursor</span> + show-screen screen + <span class="muControl">loop</span> <span class="Constant">+next-event:label</span> + <span class="Delimiter">}</span> +] + +<span class="muRecipe">recipe</span> find-click-in-sandbox-code [ + <span class="Constant">local-scope</span> + env:address:programming-environment-data<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + click-row:number<span class="Special"> <- </span><span class="Constant">next-ingredient</span> + <span class="Comment"># assert click-row >= sandbox.starting-row-on-screen</span> + sandbox:address:sandbox-data<span class="Special"> <- </span>get *env, <span class="Constant">sandbox:offset</span> + start:number<span class="Special"> <- </span>get *sandbox, <span class="Constant">starting-row-on-screen:offset</span> + clicked-on-sandboxes?:boolean<span class="Special"> <- </span>greater-or-equal click-row, start + assert clicked-on-sandboxes?, <span class="Constant">[extract-sandbox called on click to sandbox editor]</span> + <span class="Comment"># while click-row < sandbox.next-sandbox.starting-row-on-screen</span> + <span class="Delimiter">{</span> + next-sandbox:address:sandbox-data<span class="Special"> <- </span>get *sandbox, <span class="Constant">next-sandbox:offset</span> + <span class="muControl">break-unless</span> next-sandbox + next-start:number<span class="Special"> <- </span>get *next-sandbox, <span class="Constant">starting-row-on-screen:offset</span> + found?:boolean<span class="Special"> <- </span>lesser-than click-row, next-start + <span class="muControl">break-if</span> found? + sandbox<span class="Special"> <- </span>copy next-sandbox + <span class="muControl">loop</span> + <span class="Delimiter">}</span> + <span class="Comment"># return sandbox if click is in its code region</span> + response-starting-row:number<span class="Special"> <- </span>get *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span> + click-above-response?:boolean<span class="Special"> <- </span>lesser-than click-row, response-starting-row + start:number<span class="Special"> <- </span>get *sandbox, <span class="Constant">starting-row-on-screen:offset</span> + click-below-menu?:boolean<span class="Special"> <- </span>greater-than click-row, start + click-on-sandbox-code?:boolean<span class="Special"> <- </span>and click-above-response?, click-below-menu? + <span class="Delimiter">{</span> + <span class="muControl">break-if</span> click-on-sandbox-code? + <span class="muControl">reply</span> <span class="Constant">0/no-click-in-sandbox-output</span> + <span class="Delimiter">}</span> + <span class="muControl">reply</span> sandbox +] + +<span class="Comment"># when rendering a sandbox, dump its trace before response/warning if display-trace? property is set</span> +<span class="muRecipe">after</span> +render-sandbox-results [ + <span class="Delimiter">{</span> + display-trace?:boolean<span class="Special"> <- </span>get *sandbox, <span class="Constant">display-trace?:offset</span> + <span class="muControl">break-unless</span> display-trace? + sandbox-trace:address:array:character<span class="Special"> <- </span>get *sandbox, <span class="Constant">trace:offset</span> + <span class="muControl">break-unless</span> sandbox-trace <span class="Comment"># nothing to print; move on</span> +<span class="CommentedCode">#? $print [display trace from ], row, 10/newline #? 1</span> + row, screen<span class="Special"> <- </span>render-string, screen, sandbox-trace, left, right, <span class="Constant">245/grey</span>, row + row<span class="Special"> <- </span>subtract row, <span class="Constant">1</span> <span class="Comment"># trim the trailing newline that's always present</span> + <span class="Delimiter">}</span> ] <span class="SalientComment">## handling malformed programs</span> @@ -3501,7 +4065,7 @@ container sandbox-data [ <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 + <span class="muControl">break-if</span> bg-color-found? bg-color<span class="Special"> <- </span>copy <span class="Constant">0/black</span> <span class="Delimiter">}</span> move-cursor screen, row, x diff --git a/html/factorial.mu.html b/html/factorial.mu.html index 8cdc3ef6..31ac9c26 100644 --- a/html/factorial.mu.html +++ b/html/factorial.mu.html @@ -13,13 +13,13 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } -.Delimiter { color: #a04060; } .muScenario { color: #00af00; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> diff --git a/html/fork.mu.html b/html/fork.mu.html index 3f47e9a2..69dc4e30 100644 --- a/html/fork.mu.html +++ b/html/fork.mu.html @@ -13,11 +13,11 @@ 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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } -.Constant { color: #00a0a0; } .Comment { color: #9090ff; } +.Constant { color: #00a0a0; } .Delimiter { color: #a04060; } -.muControl { color: #c0a020; } --> </style> @@ -32,7 +32,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="Comment"># example program: running multiple routines</span> <span class="muRecipe">recipe</span> main [ - start-running thread2:<span class="muRecipe">recipe</span> + start-running <span class="Constant">thread2:recipe</span> <span class="Delimiter">{</span> $print <span class="Constant">34</span> <span class="muControl">loop</span> diff --git a/html/global.mu.html b/html/global.mu.html index 812e3a35..6e2c0491 100644 --- a/html/global.mu.html +++ b/html/global.mu.html @@ -32,7 +32,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } <span class="muRecipe">recipe</span> main [ <span class="Comment"># allocate 5 locations for globals</span> - <span class="Constant">global-space</span>:address:array:location<span class="Special"> <- </span>new location:type, <span class="Constant">5</span> + <span class="Constant">global-space</span>:address:array:location<span class="Special"> <- </span>new <span class="Constant">location:type</span>, <span class="Constant">5</span> <span class="Comment"># read to globals by using /space:global</span> <span class="Special">1:number/space:global</span><span class="Special"> <- </span>copy <span class="Constant">3</span> foo diff --git a/html/tangle.mu.html b/html/tangle.mu.html index f4e8be60..e6df50f0 100644 --- a/html/tangle.mu.html +++ b/html/tangle.mu.html @@ -13,12 +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; } +.muControl { color: #c0a020; } .muRecipe { color: #ff8700; } -.Delimiter { color: #a04060; } .Comment { color: #9090ff; } .Constant { color: #00a0a0; } .Special { color: #ff6060; } -.muControl { color: #c0a020; } +.Delimiter { color: #a04060; } --> </style> |