From e81da299fb49bd79cd460d477ec0bb673035620a Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Wed, 20 Jul 2016 18:05:56 -0700 Subject: 3117 --- html/020run.cc.html | 2 +- html/025compare.cc.html | 54 +++++++++++++++++++++++++++++ html/026call.cc.html | 2 +- html/030container.cc.html | 2 -- html/031merge.cc.html | 1 - html/032array.cc.html | 21 +++++++++++- html/033exclusive_container.cc.html | 1 - html/045closure_name.cc.html | 3 -- html/047check_type_by_name.cc.html | 5 +++ html/050scenario.cc.html | 34 ++++++++++++------- html/052tangle.cc.html | 1 - html/054static_dispatch.cc.html | 1 - html/055shape_shifting_container.cc.html | 21 ++++++++++-- html/056shape_shifting_recipe.cc.html | 2 +- html/060rewrite_literal_string.cc.html | 1 + html/071scheduler.cc.html | 58 ++++++++++++++++++++++++++++++++ html/082scenario_screen.cc.html | 3 ++ html/091run_interactive.cc.html | 10 +++--- html/edit/010-sandbox-trace.mu.html | 7 +++- html/edit/011-errors.mu.html | 7 ++-- 20 files changed, 199 insertions(+), 37 deletions(-) diff --git a/html/020run.cc.html b/html/020run.cc.html index 1a8359bd..6674be65 100644 --- a/html/020run.cc.html +++ b/html/020run.cc.html @@ -317,7 +317,7 @@ vector<double> read_memory// End Preprocess write_memory(x, data) if (x.value == 0) return; if (size_mismatch(x, data)) { - raise << maybe(current_recipe_name()) << "size mismatch in storing to '" << x.original_string << "' (" << size_of(x.type) << " vs " << SIZE(data) << ") at '" << to_original_string(current_instruction()) << "'\n" << end(); + raise << maybe(current_recipe_name()) << "size mismatch in storing to '" << x.original_string << "' (" << size_of(x) << " vs " << SIZE(data) << ") at '" << to_original_string(current_instruction()) << "'\n" << end(); return; } // End write_memory(x) Special-cases diff --git a/html/025compare.cc.html b/html/025compare.cc.html index 56e90d10..37c7c8c5 100644 --- a/html/025compare.cc.html +++ b/html/025compare.cc.html @@ -108,6 +108,60 @@ def main [ ] +mem: storing 0 in location 1 +:(before "End Primitive Recipe Declarations") +NOT_EQUAL, +:(before "End Primitive Recipe Numbers") +put(Recipe_ordinal, "not-equal", NOT_EQUAL); +:(before "End Primitive Recipe Checks") +case NOT_EQUAL: { + if (SIZE(inst.ingredients) != 2) { + raise << maybe(get(Recipe, r).name) << "'equal' needs two ingredients to compare in '" << to_original_string(inst) << "'\n" << end(); + break; + } + const reagent& exemplar = inst.ingredients.at(0); + if (!types_match(inst.ingredients.at(1), exemplar) && !types_match(exemplar, inst.ingredients.at(1))) { + raise << maybe(get(Recipe, r).name) << "'equal' expects ingredients to be all of the same type, but got '" << to_original_string(inst) << "'\n" << end(); + goto finish_checking_instruction; + } + if (SIZE(inst.products) > 1) { + raise << maybe(get(Recipe, r).name) << "'equal' yields exactly one product in '" << to_original_string(inst) << "'\n" << end(); + break; + } + if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_boolean(inst.products.at(0))) { + raise << maybe(get(Recipe, r).name) << "'equal' should yield a boolean, but got '" << inst.products.at(0).original_string << "'\n" << end(); + break; + } + break; +} +:(before "End Primitive Recipe Implementations") +case NOT_EQUAL: { + vector<double>& exemplar = ingredients.at(0); + products.resize(1); + bool equal_ingredients = equal(ingredients.at(1).begin(), ingredients.at(1).end(), exemplar.begin()); + products.at(0).push_back(!equal_ingredients); + break; +} + +:(scenario not_equal) +def main [ + 1:number <- copy 34 + 2:number <- copy 33 + 3:boolean <- not-equal 1:number, 2:number +] ++mem: location 1 is 34 ++mem: location 2 is 33 ++mem: storing 1 in location 3 + +:(scenario not_equal_2) +def main [ + 1:number <- copy 34 + 2:number <- copy 34 + 3:boolean <- not-equal 1:number, 2:number +] ++mem: location 1 is 34 ++mem: location 2 is 34 ++mem: storing 0 in location 3 + :(before "End Primitive Recipe Declarations") GREATER_THAN, :(before "End Primitive Recipe Numbers") diff --git a/html/026call.cc.html b/html/026call.cc.html index 229f0fc8..83224e28 100644 --- a/html/026call.cc.html +++ b/html/026call.cc.html @@ -196,7 +196,7 @@ def main [ assert(Trace_stream->callstack_depth >= 0); } Current_routine->calls.pop_front(); - if (Current_routine->calls.empty()) return; + if (Current_routine->calls.empty()) goto stop_running_current_routine; // Complete Call Fallthrough // todo: fail if no products returned ++current_step_index(); diff --git a/html/030container.cc.html b/html/030container.cc.html index a7f5d552..49fcef97 100644 --- a/html/030container.cc.html +++ b/html/030container.cc.html @@ -527,7 +527,6 @@ container foo [ x:number y:bar ] - container bar [ x:number y:number @@ -690,7 +689,6 @@ def main [ def main [ 1:bar <- copy 0/unsafe ] - container bar [ x:number ] diff --git a/html/031merge.cc.html b/html/031merge.cc.html index 34dc65a9..4d590cd2 100644 --- a/html/031merge.cc.html +++ b/html/031merge.cc.html @@ -40,7 +40,6 @@ container foo [ x:number y:number ] - def main [ 1:foo <- merge 3, 4 ] diff --git a/html/032array.cc.html b/html/032array.cc.html index fb9bb0d5..c432da93 100644 --- a/html/032array.cc.html +++ b/html/032array.cc.html @@ -147,7 +147,7 @@ def main [ //: arrays are disallowed inside containers unless their length is fixed in //: advance -:(scenario container_contains_array) +:(scenario container_permits_static_array_element) container foo [ x:array:number:3 ] @@ -160,6 +160,25 @@ container foo [ ] +error: container 'foo' cannot determine size of element 'x' +//: disable the size mismatch check for 'merge' instructions since containers +//: can contain arrays, and since we already do plenty of checking for them +:(before "End size_mismatch(x) Cases") +if (current_call().running_step_index < SIZE(get(Recipe, current_call().running_recipe).steps) + && current_instruction().operation == MERGE) { + return false; +} + +:(scenario merge_static_array_into_container) +container foo [ + x:number + y:array:number:3 +] +def main [ + 1:array:number:3 <- create-array + 10:foo <- merge 34, 1:array:number:3 +] +# no errors + :(before "End Load Container Element Definition") { const type_tree* type = info.elements.back().type; diff --git a/html/033exclusive_container.cc.html b/html/033exclusive_container.cc.html index 70af4cac..5dfe9521 100644 --- a/html/033exclusive_container.cc.html +++ b/html/033exclusive_container.cc.html @@ -266,7 +266,6 @@ exclusive-container foo [ x:number y:number ] - def main [ 1:number <- copy 34 2:foo <- merge 0/x, 1:number # tag must be a literal when merging exclusive containers diff --git a/html/045closure_name.cc.html b/html/045closure_name.cc.html index 66b899f0..210327f6 100644 --- a/html/045closure_name.cc.html +++ b/html/045closure_name.cc.html @@ -45,14 +45,12 @@ def main [ 2:number/raw <- increment-counter 1:address:array:location/names:new-counter 3:number/raw <- increment-counter 1:address:array:location/names:new-counter ] - def new-counter [ default-space:address:array:location <- new location:type, 30 x:number <- copy 23 y:number <- copy 3 # variable that will be incremented return default-space:address:array:location ] - def increment-counter [ default-space:address:array:location <- new location:type, 30 0:address:array:location/names:new-counter <- next-ingredient # outer space must be created by 'new-counter' above @@ -60,7 +58,6 @@ def increment-counter [ y:number <- copy 234 # dummy return y:number/space:1 ] - +name: lexically surrounding space for recipe increment-counter comes from new-counter +mem: storing 5 in location 3 diff --git a/html/047check_type_by_name.cc.html b/html/047check_type_by_name.cc.html index d1c5bae4..b67e8b36 100644 --- a/html/047check_type_by_name.cc.html +++ b/html/047check_type_by_name.cc.html @@ -105,18 +105,23 @@ def main [ x:number <- copy 1 y:number <- add x, 1 ] +# x is in location 1, y in location 2 ++mem: storing 2 in location 2 :(scenario transform_fills_in_missing_types_in_product) def main [ x:number <- copy 1 x <- copy 2 ] +# x is in location 1 ++mem: storing 2 in location 1 :(scenario transform_fills_in_missing_types_in_product_and_ingredient) def main [ x:number <- copy 1 x <- add x, 1 ] +# x is in location 1 +mem: storing 2 in location 1 :(scenario transform_fails_on_missing_types_in_first_mention) diff --git a/html/050scenario.cc.html b/html/050scenario.cc.html index e8a8d028..213874ff 100644 --- a/html/050scenario.cc.html +++ b/html/050scenario.cc.html @@ -69,6 +69,7 @@ scenario foo [ 2 <- 13 ] ] +# checks are inside scenario :(scenario scenario_check_memory_and_trace) scenario foo [ @@ -86,6 +87,7 @@ scenario foo [ a: x y z ] ] +# checks are inside scenario //:: Core data structure @@ -257,7 +259,6 @@ Name[r]["__maybe_make_raw_test__"] = Res def scenario-foo [ 1:number <- copy 34 ] - def scenario-foo [ 1:number <- copy 35 ] @@ -540,7 +541,7 @@ def main [ a: d ] ] -+error: missing [b] in trace with label a ++error: missing [b] in trace with label 'a' :(before "End Primitive Recipe Declarations") TRACE_SHOULD_CONTAIN, @@ -573,8 +574,14 @@ put(Recipe_ordinal,if (curr_expected_line == SIZE(expected_lines)) return; } - raise << "missing [" << expected_lines.at(curr_expected_line).contents << "] " - << "in trace with label " << expected_lines.at(curr_expected_line).label << '\n' << end(); + if (Current_scenario && !Scenario_testing_scenario) + raise << "\nF - " << Current_scenario->name << ": missing [" << expected_lines.at(curr_expected_line).contents << "] " + << "in trace with label '" << expected_lines.at(curr_expected_line).label << "'\n" << end(); + else + raise << "missing [" << expected_lines.at(curr_expected_line).contents << "] " + << "in trace with label '" << expected_lines.at(curr_expected_line).label << "'\n" << end(); + if (!Hide_errors) + DUMP(expected_lines.at(curr_expected_line).label); Passed = false; } @@ -602,7 +609,7 @@ def main [ a: d ] ] -+error: missing [d] in trace with label a ++error: missing [d] in trace with label 'a' :(scenario trace_check_passes_silently) % Scenario_testing_scenario = true; @@ -614,7 +621,7 @@ def main [ a: b ] ] --error: missing [b] in trace with label a +-error: missing [b] in trace with label 'a' $error: 0 //: 'trace-should-not-contain' is like the '-' lines in our scenarios so far @@ -632,7 +639,7 @@ def main [ a: b ] ] -+error: unexpected [b] in trace with label a ++error: unexpected [b] in trace with label 'a' :(before "End Primitive Recipe Declarations") TRACE_SHOULD_NOT_CONTAIN, @@ -657,7 +664,7 @@ put(Recipe_ordinal,(in); for (int i = 0; i < SIZE(lines); ++i) { if (trace_count(lines.at(i).label, lines.at(i).contents) != 0) { - raise << "unexpected [" << lines.at(i).contents << "] in trace with label " << lines.at(i).label << '\n' << end(); + raise << "unexpected [" << lines.at(i).contents << "] in trace with label '" << lines.at(i).label << "'\n" << end(); Passed = false; return false; } @@ -672,7 +679,7 @@ def main [ a: b ] ] --error: unexpected [b] in trace with label a +-error: unexpected [b] in trace with label 'a' $error: 0 :(scenario trace_negative_check_fails_on_any_unexpected_line) @@ -687,7 +694,7 @@ def main [ a: d ] ] -+error: unexpected [d] in trace with label a ++error: unexpected [d] in trace with label 'a' :(scenario trace_count_check) def main [ @@ -696,6 +703,7 @@ def main [ ] check-trace-count-for-label 1, [a] ] +# checks are inside scenario :(before "End Primitive Recipe Declarations") CHECK_TRACE_COUNT_FOR_LABEL, @@ -726,12 +734,12 @@ put(Recipe_ordinal,if (count != expected_count) { if (Current_scenario && !Scenario_testing_scenario) { // genuine test in a mu file - raise << "\nF - " << Current_scenario->name << ": " << maybe(current_recipe_name()) << "expected " << expected_count << " lines in trace with label " << label << " in trace: " << end(); + raise << "\nF - " << Current_scenario->name << ": " << maybe(current_recipe_name()) << "expected " << expected_count << " lines in trace with label '" << label << "' in trace: " << end(); DUMP(label); } else { // just testing scenario support - raise << maybe(current_recipe_name()) << "expected " << expected_count << " lines in trace with label " << label << " in trace\n" << end(); + raise << maybe(current_recipe_name()) << "expected " << expected_count << " lines in trace with label '" << label << "' in trace\n" << end(); } if (!Scenario_testing_scenario) { Passed = false; @@ -750,7 +758,7 @@ def main [ ] check-trace-count-for-label 2, [a] ] -+error: main: expected 2 lines in trace with label a in trace ++error: main: expected 2 lines in trace with label 'a' in trace //: Minor detail: ignore 'system' calls in scenarios, since anything we do //: with them is by definition impossible to test through mu. diff --git a/html/052tangle.cc.html b/html/052tangle.cc.html index 3deeb260..03a0fd92 100644 --- a/html/052tangle.cc.html +++ b/html/052tangle.cc.html @@ -47,7 +47,6 @@ def main [ <label1> 3:number <- copy 0 ] - before <label1> [ 2:number <- copy 0 ] diff --git a/html/054static_dispatch.cc.html b/html/054static_dispatch.cc.html index 7e922bef..e90b81f7 100644 --- a/html/054static_dispatch.cc.html +++ b/html/054static_dispatch.cc.html @@ -457,7 +457,6 @@ def main [ 5:boolean <- copy 0/false 6:boolean <- equal 4:boolean, 5:boolean ] - # temporarily hardcode number equality to always fail def equal x:number, y:number -> z:boolean [ local-scope diff --git a/html/055shape_shifting_container.cc.html b/html/055shape_shifting_container.cc.html index abce7ede..fd9e9029 100644 --- a/html/055shape_shifting_container.cc.html +++ b/html/055shape_shifting_container.cc.html @@ -107,6 +107,13 @@ container foo:_b [ ] +error: headers of container 'foo' must use identical type ingredients +:(scenario type_ingredient_must_start_with_underscore) +% Hide_errors = true; +container foo:t [ + x:number +] ++error: foo: type ingredient 't' must begin with an underscore + :(before "End Globals") // We'll use large type ordinals to mean "the following type of the variable". // For example, if we have a generic type called foo:_elem, the type @@ -141,7 +148,7 @@ map<string, type_ordinal> type_ingredient_n istringstream in(save_name); name = slurp_until(in, ':'); map<string, type_ordinal> type_ingredient_names; - if (!slurp_type_ingredients(in, type_ingredient_names)) { + if (!slurp_type_ingredients(in, type_ingredient_names, name)) { return false; } if (contains_key(Type_ordinal, name) @@ -162,12 +169,20 @@ map<string, type_ordinal> type_ingredient_n return true; } -bool slurp_type_ingredients(istream& in, map<string, type_ordinal>& out) { +bool slurp_type_ingredients(istream& in, map<string, type_ordinal>& out, const string& container_name) { int next_type_ordinal = START_TYPE_INGREDIENTS; while (has_data(in)) { string curr = slurp_until(in, ':'); + if (curr.empty()) { + raise << container_name << ": empty type ingredients not permitted\n" << end(); + return false; + } + if (curr.at(0) != '_') { + raise << container_name << ": type ingredient '" << curr << "' must begin with an underscore\n" << end(); + return false; + } if (out.find(curr) != out.end()) { - raise << "can't repeat type ingredient names in a single container definition: '" << curr << "'\n" << end(); + raise << container_name << ": can't repeat type ingredient name'" << curr << "' in a single container definition\n" << end(); return false; } put(out, curr, next_type_ordinal++); diff --git a/html/056shape_shifting_recipe.cc.html b/html/056shape_shifting_recipe.cc.html index be795d37..240ffa5b 100644 --- a/html/056shape_shifting_recipe.cc.html +++ b/html/056shape_shifting_recipe.cc.html @@ -641,6 +641,7 @@ def foo x:c:_bar:_baz [ local-scope load-ingredients ] +# no errors :(scenario shape_shifting_recipe_type_deduction_ignores_offsets) def main [ @@ -1139,7 +1140,6 @@ $error: 0 def add a:address:foo:_elem [ assert 0, [should not get here] ] - def main [ # call primitive add with literal 0 add 0, 0 diff --git a/html/060rewrite_literal_string.cc.html b/html/060rewrite_literal_string.cc.html index 6596dd01..275a8fc3 100644 --- a/html/060rewrite_literal_string.cc.html +++ b/html/060rewrite_literal_string.cc.html @@ -53,6 +53,7 @@ set<string> recipes_taking_literal_strings; :(code) void initialize_transform_rewrite_literal_string_to_text() { recipes_taking_literal_strings.insert("$print"); + recipes_taking_literal_strings.insert("$dump-trace"); recipes_taking_literal_strings.insert("$system"); recipes_taking_literal_strings.insert("trace"); recipes_taking_literal_strings.insert("stash"); diff --git a/html/071scheduler.cc.html b/html/071scheduler.cc.html index 4f556a1e..18fc91b8 100644 --- a/html/071scheduler.cc.html +++ b/html/071scheduler.cc.html @@ -568,6 +568,43 @@ put(Recipe_ordinal,break; } +:(before "End routine Fields") +int ninstrs; +:(before "End routine Constructor") +ninstrs = 0; +:(after "stop_running_current_routine:") +Current_routine->ninstrs = Current_routine->ninstrs + ninstrs; +:(before "End Primitive Recipe Declarations") +NUMBER_OF_INSTRUCTIONS, +:(before "End Primitive Recipe Numbers") +put(Recipe_ordinal, "number-of-instructions", NUMBER_OF_INSTRUCTIONS); +:(before "End Primitive Recipe Checks") +case NUMBER_OF_INSTRUCTIONS: { + if (SIZE(inst.ingredients) != 1) { + raise << maybe(get(Recipe, r).name) << "'number-of-instructions' requires exactly one ingredient, but got '" << to_original_string(inst) << "'\n" << end(); + break; + } + if (!is_mu_number(inst.ingredients.at(0))) { + raise << maybe(get(Recipe, r).name) << "first ingredient of 'number-of-instructions' should be a routine id generated by 'start-running', but got '" << inst.ingredients.at(0).original_string << "'\n" << end(); + break; + } + break; +} +:(before "End Primitive Recipe Implementations") +case NUMBER_OF_INSTRUCTIONS: { + int id = ingredients.at(0).at(0); + int result = -1; + for (int i = 0; i < SIZE(Routines); ++i) { + if (Routines.at(i)->id == id) { + result = Routines.at(i)->ninstrs; + break; + } + } + products.resize(1); + products.at(0).push_back(result); + break; +} + //:: make sure that each routine gets a different alloc to start :(scenario new_concurrent) @@ -587,6 +624,27 @@ def f2 [ 4:number/raw <- copy 1 ] +mem: storing 0 in location 3 + +:(scenario number_of_instructions) +% Scheduling_interval = 1; +def f1 [ + 10:number/child-id <- start-running f2 + { + loop-unless 20:number + } + 11:number <- number-of-instructions 10:number +] +def f2 [ + # 4 instructions worth of work + # Should take 2 scheduling intervals + 1:number <- copy 34 + 2:number <- copy 1 + 2:number <- copy 3 + 20:number <- copy 1 +] +# f2 runs an extra instruction for the implicit return added by the +# fill_in_reply_ingredients transform ++mem: storing 5 in location 11 diff --git a/html/082scenario_screen.cc.html b/html/082scenario_screen.cc.html index 090a0daa..54980d17 100644 --- a/html/082scenario_screen.cc.html +++ b/html/082scenario_screen.cc.html @@ -54,6 +54,7 @@ scenario screen-in-scenario [ . . ] ] +# checks are inside scenario :(scenario screen_in_scenario_unicode) scenario screen-in-scenario-unicode-color [ @@ -71,6 +72,7 @@ scenario screen-in-scenario-unicode-color [ . . ] ] +# checks are inside scenario :(scenario screen_in_scenario_color) # screen-should-contain can check unicode characters in the fake screen @@ -105,6 +107,7 @@ scenario screen-in-scenario-color [ . . ] ] +# checks are inside scenario :(scenario screen_in_scenario_error) % Scenario_testing_scenario = true; diff --git a/html/091run_interactive.cc.html b/html/091run_interactive.cc.html index 6bd254b0..6633d65e 100644 --- a/html/091run_interactive.cc.html +++ b/html/091run_interactive.cc.html @@ -200,10 +200,12 @@ load(string( "recipe sandbox [\n" + "local-scope\n" + "screen:address:screen <- new-fake-screen 30, 5\n" + - "r:number/routine_id <- start-running interactive, screen\n" + - "limit-time r, 100000/instructions\n" + - "wait-for-routine r\n" + - "sandbox-state:number <- routine-state r/routine_id\n" + + "routine-id:number <- start-running interactive, screen\n" + + "limit-time routine-id, 100000/instructions\n" + + "wait-for-routine routine-id\n" + + "instructions-run:number <- number-of-instructions routine-id\n" + + "stash instructions-run [instructions run]\n" + + "sandbox-state:number <- routine-state routine-id\n" + "completed?:boolean <- equal sandbox-state, 1/completed\n" + "output:address:array:character <- $most-recent-products\n" + "errors:address:array:character <- save-errors\n" + diff --git a/html/edit/010-sandbox-trace.mu.html b/html/edit/010-sandbox-trace.mu.html index b791d18b..608bd63c 100644 --- a/html/edit/010-sandbox-trace.mu.html +++ b/html/edit/010-sandbox-trace.mu.html @@ -76,6 +76,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color . stash [abc] ┊0 edit copy delete . .] ┊foo . .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊abc . + . ┊8 instructions run . . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊ . ] @@ -86,6 +87,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color . ┊ . . ┊ . .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊abc . + . ┊8 instructions run . . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊ . ] @@ -150,7 +152,8 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color . stash [abc] ┊0 edit copy delete . . reply 4 ┊foo . .] ┊abc . - .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊4 . + .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊8 instructions run . + . ┊4 . . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊ . ] @@ -175,6 +178,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color . ┊0 edit copy delete . . ┊stash 123456789 . . ┊123456789 . + . ┊6 instructions run . . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊ . ] @@ -193,6 +197,7 @@ body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color . ┊0 edit copy delete . . ┊stash 123456789 . . ┊123456789 . + . ┊6 instructions run . . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊ . ] diff --git a/html/edit/011-errors.mu.html b/html/edit/011-errors.mu.html index 6bf5c452..521006e4 100644 --- a/html/edit/011-errors.mu.html +++ b/html/edit/011-errors.mu.html @@ -719,9 +719,10 @@ _, c:number <- divide-with-remainder a, b .a:number <- next-ingredient ┊0 edit copy delete . .b:number <- next-ingredient ┊foo 4, 0 . .stash [dividing by], b ┊dividing by 0 . - ._, c:number <- divide-with-remainder a, b ┊foo: divide by zero in '_, c:number <- divide-wi↩. - .reply b ┊th-remainder a, b' . - .] ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. + ._, c:number <- divide-with-remainder a, b ┊14 instructions run . + .reply b ┊foo: divide by zero in '_, c:number <- divide-wi↩. + .] ┊th-remainder a, b' . + .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. ] ] -- cgit 1.4.1-2-gfad0