about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-05-20 22:09:06 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-05-20 22:11:34 -0700
commit9dcbec398c5aedf27757365cc1f4c7c36e138539 (patch)
tree24afbc29a00db1db5b65eb3c390e8d13df7be3ba
parent5203ba0c5e806ac8e118362d5e2db952a5433e34 (diff)
downloadmu-9dcbec398c5aedf27757365cc1f4c7c36e138539.tar.gz
2990
Standardize quotes around reagents in error messages.

I'm still sure there's issues. For example, the messages when
type-checking 'copy'. I'm not putting quotes around them because in
layer 60 I end up creating dilated reagents, and then it's a bit much to
have quotes and (two kinds of) brackets. But I'm sure I'm doing that
somewhere..
-rw-r--r--011load.cc2
-rw-r--r--013update_operation.cc2
-rw-r--r--016dilated_reagent.cc4
-rw-r--r--020run.cc6
-rw-r--r--022arithmetic.cc34
-rw-r--r--023boolean.cc12
-rw-r--r--024jump.cc16
-rw-r--r--025compare.cc26
-rw-r--r--027call_ingredient.cc10
-rw-r--r--028call_reply.cc14
-rw-r--r--029tools.cc12
-rw-r--r--030container.cc24
-rw-r--r--031merge.cc4
-rw-r--r--032array.cc30
-rw-r--r--033exclusive_container.cc18
-rw-r--r--034address.cc8
-rw-r--r--035lookup.cc8
-rw-r--r--039location_array.cc2
-rw-r--r--040brace.cc10
-rw-r--r--041jump_target.cc8
-rw-r--r--042name.cc12
-rw-r--r--043space.cc6
-rw-r--r--044space_surround.cc2
-rw-r--r--045closure_name.cc22
-rw-r--r--046global.cc2
-rw-r--r--047check_type_by_name.cc12
-rw-r--r--050scenario.cc32
-rw-r--r--052tangle.cc8
-rw-r--r--053recipe_header.cc12
-rw-r--r--054static_dispatch.cc2
-rw-r--r--055shape_shifting_container.cc4
-rw-r--r--056shape_shifting_recipe.cc18
-rw-r--r--057immutable.cc32
-rw-r--r--060recipe.cc2
-rw-r--r--061scheduler.cc20
-rw-r--r--062wait.cc24
-rw-r--r--075random.cc4
-rw-r--r--078hash.cc2
-rw-r--r--080display.cc14
-rw-r--r--085scenario_console.cc2
-rw-r--r--091run_interactive.cc8
-rw-r--r--092persist.cc10
-rw-r--r--edit/011-errors.mu34
-rw-r--r--sandbox/011-errors.mu38
44 files changed, 281 insertions, 291 deletions
diff --git a/011load.cc b/011load.cc
index 5ebb87e0..3f273d74 100644
--- a/011load.cc
+++ b/011load.cc
@@ -67,7 +67,7 @@ void slurp_body(istream& in, recipe& result) {
   in >> std::noskipws;
   skip_whitespace_but_not_newline(in);
   if (in.get() != '[')
-    raise << "recipe body must begin with '['\n" << end();
+    raise << result.name << ": recipe body must begin with '['\n" << end();
   skip_whitespace_and_comments(in);  // permit trailing comment after '['
   instruction curr;
   while (next_instruction(in, &curr)) {
diff --git a/013update_operation.cc b/013update_operation.cc
index e5039fcd..7ee7ff13 100644
--- a/013update_operation.cc
+++ b/013update_operation.cc
@@ -13,7 +13,7 @@ void update_instruction_operations(recipe_ordinal r) {
     instruction& inst = caller.steps.at(index);
     if (inst.is_label) continue;
     if (!contains_key(Recipe_ordinal, inst.name)) {
-      raise << maybe(caller.name) << "instruction " << inst.name << " has no recipe\n" << end();
+      raise << maybe(caller.name) << "instruction '" << inst.name << "' has no recipe\n" << end();
       continue;
     }
     inst.operation = get(Recipe_ordinal, inst.name);
diff --git a/016dilated_reagent.cc b/016dilated_reagent.cc
index fa5c3ba2..42bcfa70 100644
--- a/016dilated_reagent.cc
+++ b/016dilated_reagent.cc
@@ -96,11 +96,11 @@ if (s.at(0) == '{') {
   in.get();  // skip '{'
   name = slurp_key(in);
   if (name.empty()) {
-    raise << "invalid reagent " << s << " without a name\n" << end();
+    raise << "invalid reagent '" << s << "' without a name\n" << end();
     return;
   }
   if (name == "}") {
-    raise << "invalid empty reagent " << s << '\n' << end();
+    raise << "invalid empty reagent '" << s << "'\n" << end();
     return;
   }
   {
diff --git a/020run.cc b/020run.cc
index 35eba974..b33606ac 100644
--- a/020run.cc
+++ b/020run.cc
@@ -216,7 +216,7 @@ void load_file_or_directory(string filename) {
   }
   ifstream fin(filename.c_str());
   if (!fin) {
-    raise << "no such file " << filename << '\n' << end();
+    raise << "no such file '" << filename << "'\n" << end();
     return;
   }
   trace(9990, "load") << "=== " << filename << end();
@@ -269,7 +269,7 @@ vector<double> read_memory(reagent/*copy*/ x) {
 void write_memory(reagent/*copy*/ x, const vector<double>& data, const int /*only when called in the run loop above to save results; -1 otherwise*/ product_index) {
   // Begin Preprocess write_memory(x, data)
   if (!x.type) {
-    raise << "can't write to " << to_string(x) << "; no type\n" << end();
+    raise << "can't write to '" << to_string(x) << "'; no type\n" << end();
     return;
   }
   if (is_dummy(x)) return;
@@ -277,7 +277,7 @@ void write_memory(reagent/*copy*/ x, const vector<double>& data, const int /*onl
   // 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.type) << " vs " << SIZE(data) << ") at '" << to_original_string(current_instruction()) << "'\n" << end();
     return;
   }
   // End write_memory(x) Special-cases
diff --git a/022arithmetic.cc b/022arithmetic.cc
index 21adb0b0..bf6ae3b6 100644
--- a/022arithmetic.cc
+++ b/022arithmetic.cc
@@ -9,7 +9,7 @@ case ADD: {
   // primary goal of these checks is to forbid address arithmetic
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_number(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'add' requires number ingredients, but got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'add' requires number ingredients, but got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -18,7 +18,7 @@ case ADD: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'add' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'add' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -59,14 +59,14 @@ def main [
 def main [
   1:number <- add 2:boolean, 1
 ]
-+error: main: 'add' requires number ingredients, but got 2:boolean
++error: main: 'add' requires number ingredients, but got '2:boolean'
 
 :(scenario add_checks_return_type)
 % Hide_errors = true;
 def main [
   1:address:number <- add 2, 2
 ]
-+error: main: 'add' should yield a number, but got 1:address:number
++error: main: 'add' should yield a number, but got '1:address:number'
 
 :(before "End Primitive Recipe Declarations")
 SUBTRACT,
@@ -81,7 +81,7 @@ case SUBTRACT: {
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (is_raw(inst.ingredients.at(i))) continue;  // permit address offset computations in tests
     if (!is_mu_number(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'subtract' requires number ingredients, but got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'subtract' requires number ingredients, but got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -90,7 +90,7 @@ case SUBTRACT: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'subtract' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'subtract' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -137,7 +137,7 @@ put(Recipe_ordinal, "multiply", MULTIPLY);
 case MULTIPLY: {
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_number(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'multiply' requires number ingredients, but got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'multiply' requires number ingredients, but got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -146,7 +146,7 @@ case MULTIPLY: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'multiply' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'multiply' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -194,7 +194,7 @@ case DIVIDE: {
   }
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_number(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'divide' requires number ingredients, but got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'divide' requires number ingredients, but got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -203,7 +203,7 @@ case DIVIDE: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'divide' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'divide' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -260,7 +260,7 @@ case DIVIDE_WITH_REMAINDER: {
   }
   for (int i = 0; i < SIZE(inst.products); ++i) {
     if (!is_dummy(inst.products.at(i)) && !is_mu_number(inst.products.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'divide-with-remainder' should yield a number, but got " << inst.products.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'divide-with-remainder' should yield a number, but got '" << inst.products.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -343,7 +343,7 @@ case SHIFT_LEFT: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'shift-left' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'shift-left' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     goto finish_checking_instruction;
   }
   break;
@@ -414,7 +414,7 @@ case SHIFT_RIGHT: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'shift-right' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'shift-right' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     goto finish_checking_instruction;
   }
   break;
@@ -485,7 +485,7 @@ case AND_BITS: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'and-bits' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'and-bits' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     goto finish_checking_instruction;
   }
   break;
@@ -543,7 +543,7 @@ case OR_BITS: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'or-bits' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'or-bits' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     goto finish_checking_instruction;
   }
   break;
@@ -595,7 +595,7 @@ case XOR_BITS: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'xor-bits' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'xor-bits' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     goto finish_checking_instruction;
   }
   break;
@@ -647,7 +647,7 @@ case FLIP_BITS: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'flip-bits' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'flip-bits' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     goto finish_checking_instruction;
   }
   break;
diff --git a/023boolean.cc b/023boolean.cc
index d43c889b..4959796a 100644
--- a/023boolean.cc
+++ b/023boolean.cc
@@ -8,7 +8,7 @@ put(Recipe_ordinal, "and", AND);
 case AND: {
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_scalar(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'and' requires boolean ingredients, but got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'and' requires boolean ingredients, but got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -17,7 +17,7 @@ case AND: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_boolean(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'and' should yield a boolean, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'and' should yield a boolean, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -66,7 +66,7 @@ put(Recipe_ordinal, "or", OR);
 case OR: {
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_scalar(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'and' requires boolean ingredients, but got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'and' requires boolean ingredients, but got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -75,7 +75,7 @@ case OR: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_boolean(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'or' should yield a boolean, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'or' should yield a boolean, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -128,14 +128,14 @@ case NOT: {
   }
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_scalar(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'not' requires boolean ingredients, but got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'not' requires boolean ingredients, but got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
   for (int i = 0; i < SIZE(inst.products); ++i) {
     if (is_dummy(inst.products.at(i))) continue;
     if (!is_mu_boolean(inst.products.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'not' should yield a boolean, but got " << inst.products.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'not' should yield a boolean, but got '" << inst.products.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
diff --git a/024jump.cc b/024jump.cc
index 4503ade3..6278ffc2 100644
--- a/024jump.cc
+++ b/024jump.cc
@@ -16,11 +16,11 @@ put(Recipe_ordinal, "jump", JUMP);
 :(before "End Primitive Recipe Checks")
 case JUMP: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'jump' requires exactly one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'jump' requires exactly one ingredient, but got '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   if (!is_literal(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'jump' should be a label or offset, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'jump' should be a label or offset, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -55,15 +55,15 @@ put(Recipe_ordinal, "jump-if", JUMP_IF);
 :(before "End Primitive Recipe Checks")
 case JUMP_IF: {
   if (SIZE(inst.ingredients) != 2) {
-    raise << maybe(get(Recipe, r).name) << "'jump-if' requires exactly two ingredients, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'jump-if' requires exactly two ingredients, but got '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   if (!is_mu_scalar(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'jump-if' requires a boolean for its first ingredient, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'jump-if' requires a boolean for its first ingredient, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   if (!is_literal(inst.ingredients.at(1))) {
-    raise << maybe(get(Recipe, r).name) << "'jump-if' requires a label or offset for its second ingredient, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'jump-if' requires a label or offset for its second ingredient, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   // End JUMP_IF Checks
@@ -108,15 +108,15 @@ put(Recipe_ordinal, "jump-unless", JUMP_UNLESS);
 :(before "End Primitive Recipe Checks")
 case JUMP_UNLESS: {
   if (SIZE(inst.ingredients) != 2) {
-    raise << maybe(get(Recipe, r).name) << "'jump-unless' requires exactly two ingredients, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'jump-unless' requires exactly two ingredients, but got '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   if (!is_mu_scalar(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'jump-unless' requires a boolean for its first ingredient, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'jump-unless' requires a boolean for its first ingredient, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   if (!is_literal(inst.ingredients.at(1))) {
-    raise << maybe(get(Recipe, r).name) << "'jump-unless' requires a label or offset for its second ingredient, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'jump-unless' requires a label or offset for its second ingredient, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   // End JUMP_UNLESS Checks
diff --git a/025compare.cc b/025compare.cc
index 57f2b10c..45276dd5 100644
--- a/025compare.cc
+++ b/025compare.cc
@@ -22,7 +22,7 @@ case EQUAL: {
     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();
+    raise << maybe(get(Recipe, r).name) << "'equal' should yield a boolean, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -86,7 +86,7 @@ case GREATER_THAN: {
   }
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_number(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'greater-than' can only compare numbers; got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'greater-than' can only compare numbers; got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -95,7 +95,7 @@ case GREATER_THAN: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_boolean(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'greater-than' should yield a boolean, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'greater-than' should yield a boolean, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -153,7 +153,7 @@ case LESSER_THAN: {
   }
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_number(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'lesser-than' can only compare numbers; got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'lesser-than' can only compare numbers; got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -162,7 +162,7 @@ case LESSER_THAN: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_boolean(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'lesser-than' should yield a boolean, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'lesser-than' should yield a boolean, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -220,7 +220,7 @@ case GREATER_OR_EQUAL: {
   }
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_number(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'greater-or-equal' can only compare numbers; got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'greater-or-equal' can only compare numbers; got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -229,7 +229,7 @@ case GREATER_OR_EQUAL: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_boolean(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'greater-or-equal' should yield a boolean, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'greater-or-equal' should yield a boolean, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -295,7 +295,7 @@ case LESSER_OR_EQUAL: {
   }
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_number(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'lesser-or-equal' can only compare numbers; got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'lesser-or-equal' can only compare numbers; got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -304,7 +304,7 @@ case LESSER_OR_EQUAL: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_boolean(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'greater-or-equal' should yield a boolean, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'greater-or-equal' should yield a boolean, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -370,7 +370,7 @@ case MAX: {
   }
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_number(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'max' can only compare numbers; got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'max' can only compare numbers; got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -379,7 +379,7 @@ case MAX: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'max' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'max' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -409,7 +409,7 @@ case MIN: {
   }
   for (int i = 0; i < SIZE(inst.ingredients); ++i) {
     if (!is_mu_number(inst.ingredients.at(i))) {
-      raise << maybe(get(Recipe, r).name) << "'min' can only compare numbers; got " << inst.ingredients.at(i).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "'min' can only compare numbers; got '" << inst.ingredients.at(i).original_string << "'\n" << end();
       goto finish_checking_instruction;
     }
   }
@@ -418,7 +418,7 @@ case MIN: {
     break;
   }
   if (!inst.products.empty() && !is_dummy(inst.products.at(0)) && !is_mu_number(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'min' should yield a number, but got " << inst.products.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'min' should yield a number, but got '" << inst.products.at(0).original_string << "'\n" << end();
     break;
   }
   break;
diff --git a/027call_ingredient.cc b/027call_ingredient.cc
index 739815ed..fe9db13c 100644
--- a/027call_ingredient.cc
+++ b/027call_ingredient.cc
@@ -57,11 +57,11 @@ case NEXT_INGREDIENT: {
       // no ingredient types since the call might be implicit; assume ingredients are always strings
       // todo: how to test this?
       if (!is_mu_string(product))
-        raise << "main: wrong type for ingredient " << product.original_string << '\n' << end();
+        raise << "main: wrong type for ingredient '" << product.original_string << "'\n" << end();
     }
     else if (!types_coercible(product,
                               current_call().ingredients.at(current_call().next_ingredient_to_process))) {
-      raise << maybe(current_recipe_name()) << "wrong type for ingredient " << product.original_string << '\n' << end();
+      raise << maybe(current_recipe_name()) << "wrong type for ingredient '" << product.original_string << "'\n" << end();
       // End next-ingredient Type Mismatch Error
     }
     products.push_back(
@@ -72,7 +72,7 @@ case NEXT_INGREDIENT: {
   }
   else {
     if (SIZE(current_instruction().products) < 2)
-      raise << maybe(current_recipe_name()) << "no ingredient to save in " << current_instruction().products.at(0).original_string << '\n' << end();
+      raise << maybe(current_recipe_name()) << "no ingredient to save in '" << current_instruction().products.at(0).original_string << "'\n" << end();
     if (current_instruction().products.empty()) break;
     products.resize(2);
     // pad the first product with sufficient zeros to match its type
@@ -92,7 +92,7 @@ def main [
 def f [
   11:number <- next-ingredient
 ]
-+error: f: no ingredient to save in 11:number
++error: f: no ingredient to save in '11:number'
 
 :(scenario rewind_ingredients)
 def main [
@@ -145,7 +145,7 @@ case INGREDIENT: {
     break;
   }
   if (!is_literal(inst.ingredients.at(0)) && !is_mu_number(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'ingredient' expects a literal ingredient, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'ingredient' expects a literal ingredient, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   break;
diff --git a/028call_reply.cc b/028call_reply.cc
index 5632668f..831f229b 100644
--- a/028call_reply.cc
+++ b/028call_reply.cc
@@ -64,7 +64,7 @@ void check_types_of_reply_instructions(recipe_ordinal r) {
       if (reply_inst.operation != RETURN) continue;
       // check types with the caller
       if (SIZE(caller_instruction.products) > SIZE(reply_inst.ingredients)) {
-        raise << maybe(caller.name) << "too few values replied from " << callee.name << '\n' << end();
+        raise << maybe(caller.name) << "too few values returned from " << callee.name << '\n' << end();
         break;
       }
       for (int i = 0; i < SIZE(caller_instruction.products); ++i) {
@@ -72,8 +72,8 @@ void check_types_of_reply_instructions(recipe_ordinal r) {
         reagent/*copy*/ rhs = caller_instruction.products.at(i);
         // End Check RETURN Copy(lhs, rhs)
         if (!types_coercible(rhs, lhs)) {
-          raise << maybe(callee.name) << reply_inst.name << " ingredient " << lhs.original_string << " can't be saved in " << rhs.original_string << '\n' << end();
-          raise << to_string(lhs.type) << " vs " << to_string(rhs.type) << '\n' << end();
+          raise << maybe(callee.name) << reply_inst.name << " ingredient '" << lhs.original_string << "' can't be saved in '" << rhs.original_string << "'\n" << end();
+          raise << "  (" << to_string(lhs.type) << " vs " << to_string(rhs.type) << ")\n" << end();
           goto finish_reply_check;
         }
       }
@@ -83,7 +83,7 @@ void check_types_of_reply_instructions(recipe_ordinal r) {
         if (has_property(reply_inst.ingredients.at(i), "same-as-ingredient")) {
           string_tree* tmp = property(reply_inst.ingredients.at(i), "same-as-ingredient");
           if (!tmp || tmp->right) {
-            raise << maybe(caller.name) << "'same-as-ingredient' metadata should take exactly one value in " << to_original_string(reply_inst) << '\n' << end();
+            raise << maybe(caller.name) << "'same-as-ingredient' metadata should take exactly one value in '" << to_original_string(reply_inst) << "'\n" << end();
             goto finish_reply_check;
           }
           int ingredient_index = to_integer(tmp->value);
@@ -92,7 +92,7 @@ void check_types_of_reply_instructions(recipe_ordinal r) {
             goto finish_reply_check;
           }
           if (!is_dummy(caller_instruction.products.at(i)) && !is_literal(caller_instruction.ingredients.at(ingredient_index)) && caller_instruction.products.at(i).name != caller_instruction.ingredients.at(ingredient_index).name) {
-            raise << maybe(caller.name) << "'" << to_original_string(caller_instruction) << "' should write to " << caller_instruction.ingredients.at(ingredient_index).original_string << " rather than " << caller_instruction.products.at(i).original_string << '\n' << end();
+            raise << maybe(caller.name) << "'" << to_original_string(caller_instruction) << "' should write to '" << caller_instruction.ingredients.at(ingredient_index).original_string << "' rather than '" << caller_instruction.products.at(i).original_string << "'\n" << end();
           }
         }
       }
@@ -112,7 +112,7 @@ def f [
   14:point <- copy 12:point/raw
   return 14:point
 ]
-+error: f: return ingredient 14:point can't be saved in 3:number
++error: f: return ingredient '14:point' can't be saved in '3:number'
 
 //: In mu we'd like to assume that any instruction doesn't modify its
 //: ingredients unless they're also products. The /same-as-ingredient inside
@@ -129,7 +129,7 @@ def test1 [
   10:number <- next-ingredient
   return 10:number/same-as-ingredient:0
 ]
-+error: main: '2:number <- test1 1:number' should write to 1:number rather than 2:number
++error: main: '2:number <- test1 1:number' should write to '1:number' rather than '2:number'
 
 :(scenario return_same_as_ingredient_dummy)
 def main [
diff --git a/029tools.cc b/029tools.cc
index 364c6260..a7657140 100644
--- a/029tools.cc
+++ b/029tools.cc
@@ -17,11 +17,11 @@ case TRACE: {
     break;
   }
   if (!is_mu_number(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'trace' should be a number (depth), but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'trace' should be a number (depth), but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   if (!is_literal_string(inst.ingredients.at(1))) {
-    raise << maybe(get(Recipe, r).name) << "second ingredient of 'trace' should be a literal string (label), but got " << inst.ingredients.at(1).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second ingredient of 'trace' should be a literal string (label), but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
     break;
   }
   break;
@@ -203,11 +203,11 @@ case ASSERT: {
     break;
   }
   if (!is_mu_scalar(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'assert' requires a boolean for its first ingredient, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'assert' requires a boolean for its first ingredient, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   if (!is_literal_string(inst.ingredients.at(1))) {
-    raise << maybe(get(Recipe, r).name) << "'assert' requires a literal string for its second ingredient, but got " << inst.ingredients.at(1).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'assert' requires a literal string for its second ingredient, but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
     break;
   }
   break;
@@ -273,11 +273,11 @@ put(Recipe_ordinal, "$system", _SYSTEM);
 :(before "End Primitive Recipe Checks")
 case _SYSTEM: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'$system' requires exactly one ingredient, but got " << to_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'$system' requires exactly one ingredient, but got '" << to_string(inst) << "'\n" << end();
     break;
   }
   if (!is_literal_string(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "ingredient to '$system' must be a literal text, but got " << to_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "ingredient to '$system' must be a literal text, but got '" << to_string(inst) << "'\n" << end();
   }
   break;
 }
diff --git a/030container.cc b/030container.cc
index 387693ef..6187e815 100644
--- a/030container.cc
+++ b/030container.cc
@@ -271,13 +271,13 @@ case GET: {
   reagent/*copy*/ base = inst.ingredients.at(0);  // new copy for every invocation
   // Update GET base in Check
   if (!base.type || !base.type->value || !contains_key(Type, base.type->value) || get(Type, base.type->value).kind != CONTAINER) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'get' should be a container, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'get' should be a container, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   type_ordinal base_type = base.type->value;
   const reagent& offset = inst.ingredients.at(1);
   if (!is_literal(offset) || !is_mu_scalar(offset)) {
-    raise << maybe(get(Recipe, r).name) << "second ingredient of 'get' should have type 'offset', but got " << inst.ingredients.at(1).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second ingredient of 'get' should have type 'offset', but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
     break;
   }
   int offset_value = 0;
@@ -286,7 +286,7 @@ case GET: {
   else
     offset_value = offset.value;
   if (offset_value < 0 || offset_value >= SIZE(get(Type, base_type).elements)) {
-    raise << maybe(get(Recipe, r).name) << "invalid offset " << offset_value << " for " << get(Type, base_type).name << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "invalid offset '" << offset_value << "' for '" << get(Type, base_type).name << "'\n" << end();
     break;
   }
   if (inst.products.empty()) break;
@@ -294,7 +294,7 @@ case GET: {
   // Update GET product in Check
   const reagent/*copy*/ element = element_type(base.type, offset_value);
   if (!types_coercible(product, element)) {
-    raise << maybe(get(Recipe, r).name) << "'get " << base.original_string << ", " << offset.original_string << "' should write to " << names_to_string_without_quotes(element.type) << " but " << product.name << " has type " << names_to_string_without_quotes(product.type) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'get " << base.original_string << ", " << offset.original_string << "' should write to " << names_to_string_without_quotes(element.type) << " but '" << product.name << "' has type " << names_to_string_without_quotes(product.type) << '\n' << end();
     break;
   }
   break;
@@ -351,7 +351,7 @@ def main [
   14:number <- copy 36
   get 12:point-number/raw, 2:offset  # point-number occupies 3 locations but has only 2 fields; out of bounds
 ]
-+error: main: invalid offset 2 for point-number
++error: main: invalid offset '2' for 'point-number'
 
 :(scenario get_out_of_bounds_2)
 % Hide_errors = true;
@@ -361,7 +361,7 @@ def main [
   14:number <- copy 36
   get 12:point-number/raw, -1:offset
 ]
-+error: main: invalid offset -1 for point-number
++error: main: invalid offset '-1' for 'point-number'
 
 :(scenario get_product_type_mismatch)
 % Hide_errors = true;
@@ -371,7 +371,7 @@ def main [
   14:number <- copy 36
   15:address:number <- get 12:point-number/raw, 1:offset
 ]
-+error: main: 'get 12:point-number/raw, 1:offset' should write to number but 15 has type (address number)
++error: main: 'get 12:point-number/raw, 1:offset' should write to number but '15' has type (address number)
 
 //: we might want to call 'get' without saving the results, say in a sandbox
 
@@ -408,21 +408,21 @@ case PUT: {
   reagent/*copy*/ base = inst.ingredients.at(0);
   // Update PUT base in Check
   if (!base.type || !base.type->value || !contains_key(Type, base.type->value) || get(Type, base.type->value).kind != CONTAINER) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'put' should be a container, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'put' should be a container, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   type_ordinal base_type = base.type->value;
   reagent/*copy*/ offset = inst.ingredients.at(1);
   // Update PUT offset in Check
   if (!is_literal(offset) || !is_mu_scalar(offset)) {
-    raise << maybe(get(Recipe, r).name) << "second ingredient of 'put' should have type 'offset', but got " << inst.ingredients.at(1).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second ingredient of 'put' should have type 'offset', but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
     break;
   }
   int offset_value = 0;
   if (is_integer(offset.name)) {  // later layers permit non-integer offsets
     offset_value = to_integer(offset.name);
     if (offset_value < 0 || offset_value >= SIZE(get(Type, base_type).elements)) {
-      raise << maybe(get(Recipe, r).name) << "invalid offset " << offset_value << " for " << get(Type, base_type).name << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "invalid offset '" << offset_value << "' for '" << get(Type, base_type).name << "'\n" << end();
       break;
     }
   }
@@ -432,7 +432,7 @@ case PUT: {
   const reagent& value = inst.ingredients.at(2);
   const reagent& element = element_type(base.type, offset_value);
   if (!types_coercible(element, value)) {
-    raise << maybe(get(Recipe, r).name) << "'put " << base.original_string << ", " << offset.original_string << "' should store " << names_to_string_without_quotes(element.type) << " but " << value.name << " has type " << names_to_string_without_quotes(value.type) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'put " << base.original_string << ", " << offset.original_string << "' should write to " << names_to_string_without_quotes(element.type) << " but '" << value.name << "' has type " << names_to_string_without_quotes(value.type) << '\n' << end();
     break;
   }
   break;
@@ -546,7 +546,7 @@ void insert_container(const string& command, kind_of_type kind, istream& in) {
   }
   else if (info.Num_calls_to_transform_all_at_first_definition != Num_calls_to_transform_all) {
     // extension after transform_all
-    raise << "there was a call to transform_all() between the definition of container " << name << " and a subsequent extension. This is not supported, since any recipes that used " << name << " values have already been transformed and 'frozen'.\n" << end();
+    raise << "there was a call to transform_all() between the definition of container '" << name << "' and a subsequent extension. This is not supported, since any recipes that used '" << name << "' values have already been transformed and \"frozen\".\n" << end();
     return;
   }
   info.name = name;
diff --git a/031merge.cc b/031merge.cc
index dea86982..4acc6ec8 100644
--- a/031merge.cc
+++ b/031merge.cc
@@ -184,8 +184,8 @@ void check_merge_call(const vector<reagent>& ingredients, const reagent& product
       default: {
         if (!types_coercible(container, ingredients.at(ingredient_index))) {
           raise << maybe(caller.name) << "incorrect type of ingredient " << ingredient_index << " in '" << to_original_string(inst) << "'\n" << end();
-          raise << "  (expected " << debug_string(container) << ")\n" << end();
-          raise << "  (got " << debug_string(ingredients.at(ingredient_index)) << ")\n" << end();
+          raise << "  (expected '" << debug_string(container) << "')\n" << end();
+          raise << "  (got '" << debug_string(ingredients.at(ingredient_index)) << "')\n" << end();
           return;
         }
         ++ingredient_index;
diff --git a/032array.cc b/032array.cc
index a13f62a7..016e9d19 100644
--- a/032array.cc
+++ b/032array.cc
@@ -26,20 +26,20 @@ case CREATE_ARRAY: {
   reagent/*copy*/ product = inst.products.at(0);
   // Update CREATE_ARRAY product in Check
   if (!is_mu_array(product)) {
-    raise << maybe(get(Recipe, r).name) << "'create-array' cannot create non-array " << product.original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'create-array' cannot create non-array '" << product.original_string << "'\n" << end();
     break;
   }
   if (!product.type->right) {
-    raise << maybe(get(Recipe, r).name) << "create array of what? " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "create array of what? '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   // 'create-array' will need to check properties rather than types
   if (!product.type->right->right) {
-    raise << maybe(get(Recipe, r).name) << "create array of what size? " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "create array of what size? '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   if (!is_integer(product.type->right->right->name)) {
-    raise << maybe(get(Recipe, r).name) << "'create-array' product should specify size of array after its element type, but got " << product.type->right->right->name << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'create-array' product should specify size of array after its element type, but got '" << product.type->right->right->name << "'\n" << end();
     break;
   }
   break;
@@ -123,18 +123,18 @@ $error: 0
 container foo [
   x:array:number
 ]
-+error: container 'foo' cannot determine size of element x
++error: container 'foo' cannot determine size of element 'x'
 
 :(before "End Load Container Element Definition")
 {
   const type_tree* type = info.elements.back().type;
   if (type->name == "array") {
     if (!type->right) {
-      raise << "container '" << name << "' doesn't specify type of array elements for " << info.elements.back().name << '\n' << end();
+      raise << "container '" << name << "' doesn't specify type of array elements for '" << info.elements.back().name << "'\n" << end();
       continue;
     }
     if (!type->right->right) {  // array has no length
-      raise << "container '" << name << "' cannot determine size of element " << info.elements.back().name << '\n' << end();
+      raise << "container '" << name << "' cannot determine size of element '" << info.elements.back().name << "'\n" << end();
       continue;
     }
   }
@@ -176,13 +176,13 @@ case INDEX: {
   reagent/*copy*/ base = inst.ingredients.at(0);
   // Update INDEX base in Check
   if (!is_mu_array(base)) {
-    raise << maybe(get(Recipe, r).name) << "'index' on a non-array " << base.original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'index' on a non-array '" << base.original_string << "'\n" << end();
     break;
   }
   reagent/*copy*/ index = inst.ingredients.at(1);
   // Update INDEX index in Check
   if (!is_mu_number(index)) {
-    raise << maybe(get(Recipe, r).name) << "second ingredient of 'index' should be a number, but got " << index.original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second ingredient of 'index' should be a number, but got '" << index.original_string << "'\n" << end();
     break;
   }
   if (inst.products.empty()) break;
@@ -191,7 +191,7 @@ case INDEX: {
   reagent element;
   element.type = copy_array_element(base.type);
   if (!types_coercible(product, element)) {
-    raise << maybe(get(Recipe, r).name) << "'index' on " << base.original_string << " can't be saved in " << product.original_string << "; type should be " << names_to_string_without_quotes(element.type) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'index' on '" << base.original_string << "' can't be saved in '" << product.original_string << "'; type should be '" << names_to_string_without_quotes(element.type) << "'\n" << end();
     break;
   }
   break;
@@ -299,7 +299,7 @@ def main [
   7:number <- copy 16
   9:number <- index 1:array:point, 0
 ]
-+error: main: 'index' on 1:array:point can't be saved in 9:number; type should be point
++error: main: 'index' on '1:array:point' can't be saved in '9:number'; type should be 'point'
 
 //: we might want to call 'index' without saving the results, say in a sandbox
 
@@ -338,13 +338,13 @@ case PUT_INDEX: {
   reagent/*copy*/ base = inst.ingredients.at(0);
   // Update PUT_INDEX base in Check
   if (!is_mu_array(base)) {
-    raise << maybe(get(Recipe, r).name) << "'put-index' on a non-array " << base.original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'put-index' on a non-array '" << base.original_string << "'\n" << end();
     break;
   }
   reagent/*copy*/ index = inst.ingredients.at(1);
   // Update PUT_INDEX index in Check
   if (!is_mu_number(index)) {
-    raise << maybe(get(Recipe, r).name) << "second ingredient of 'put-index' should have type 'number', but got " << inst.ingredients.at(1).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second ingredient of 'put-index' should have type 'number', but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
     break;
   }
   reagent/*copy*/ value = inst.ingredients.at(2);
@@ -352,7 +352,7 @@ case PUT_INDEX: {
   reagent element;
   element.type = copy_array_element(base.type);
   if (!types_coercible(element, value)) {
-    raise << maybe(get(Recipe, r).name) << "'put-index " << base.original_string << ", " << inst.ingredients.at(1).original_string << "' should store " << names_to_string_without_quotes(element.type) << " but " << value.name << " has type " << names_to_string_without_quotes(value.type) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'put-index " << base.original_string << ", " << inst.ingredients.at(1).original_string << "' should store " << names_to_string_without_quotes(element.type) << " but '" << value.name << "' has type " << names_to_string_without_quotes(value.type) << '\n' << end();
     break;
   }
   break;
@@ -444,7 +444,7 @@ case LENGTH: {
   reagent/*copy*/ array = inst.ingredients.at(0);
   // Update LENGTH array in Check
   if (!is_mu_array(array)) {
-    raise << "tried to calculate length of non-array " << array.original_string << '\n' << end();
+    raise << "tried to calculate length of non-array '" << array.original_string << "'\n" << end();
     break;
   }
   break;
diff --git a/033exclusive_container.cc b/033exclusive_container.cc
index dc84f2b7..93aea482 100644
--- a/033exclusive_container.cc
+++ b/033exclusive_container.cc
@@ -101,11 +101,11 @@ case MAYBE_CONVERT: {
   reagent/*copy*/ base = inst.ingredients.at(0);
   // Update MAYBE_CONVERT base in Check
   if (!base.type || !base.type->value || get(Type, base.type->value).kind != EXCLUSIVE_CONTAINER) {
-    raise << maybe(caller.name) << "first ingredient of 'maybe-convert' should be an exclusive-container, but got " << base.original_string << '\n' << end();
+    raise << maybe(caller.name) << "first ingredient of 'maybe-convert' should be an exclusive-container, but got '" << base.original_string << "'\n" << end();
     break;
   }
   if (!is_literal(inst.ingredients.at(1))) {
-    raise << maybe(caller.name) << "second ingredient of 'maybe-convert' should have type 'variant', but got " << inst.ingredients.at(1).original_string << '\n' << end();
+    raise << maybe(caller.name) << "second ingredient of 'maybe-convert' should have type 'variant', but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
     break;
   }
   if (inst.products.empty()) break;
@@ -123,13 +123,13 @@ case MAYBE_CONVERT: {
   }
   const reagent& variant = variant_type(base, offset.value);
   if (!types_coercible(product, variant)) {
-    raise << maybe(caller.name) << "'maybe-convert " << base.original_string << ", " << inst.ingredients.at(1).original_string << "' should write to " << to_string(variant.type) << " but " << product.name << " has type " << to_string(product.type) << '\n' << end();
+    raise << maybe(caller.name) << "'maybe-convert " << base.original_string << ", " << inst.ingredients.at(1).original_string << "' should write to " << to_string(variant.type) << " but '" << product.name << "' has type " << to_string(product.type) << '\n' << end();
     break;
   }
   reagent/*copy*/ status = inst.products.at(1);
   // Update MAYBE_CONVERT status in Check
   if (!is_mu_boolean(status)) {
-    raise << maybe(get(Recipe, r).name) << "second product yielded by 'maybe-convert' should be a boolean, but tried to write to " << inst.products.at(1).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second product yielded by 'maybe-convert' should be a boolean, but tried to write to '" << inst.products.at(1).original_string << "'\n" << end();
     break;
   }
   break;
@@ -191,7 +191,7 @@ def main [
   14:number <- copy 36
   20:number, 21:boolean <- maybe-convert 12:number-or-point/unsafe, 1:variant
 ]
-+error: main: 'maybe-convert 12:number-or-point/unsafe, 1:variant' should write to point but 20 has type number
++error: main: 'maybe-convert 12:number-or-point/unsafe, 1:variant' should write to point but '20' has type number
 
 //:: Allow exclusive containers to be defined in mu code.
 
@@ -223,7 +223,7 @@ $error: 0
 exclusive-container foo [
   x:array:number
 ]
-+error: container 'foo' cannot determine size of element x
++error: container 'foo' cannot determine size of element 'x'
 
 //:: To construct exclusive containers out of variant types, use 'merge'.
 :(scenario lift_to_exclusive_container)
@@ -273,20 +273,20 @@ def main [
   1:number <- copy 0
   2:foo <- merge 1:number, 34
 ]
-+error: main: ingredient 0 of 'merge' should be a literal, for the tag of exclusive-container foo
++error: main: ingredient 0 of 'merge' should be a literal, for the tag of exclusive-container 'foo'
 
 :(before "End valid_merge Cases")
 case EXCLUSIVE_CONTAINER: {
   assert(state.data.top().container_element_index == 0);
   trace(9999, "transform") << "checking exclusive container " << to_string(container) << " vs ingredient " << ingredient_index << end();
   if (!is_literal(ingredients.at(ingredient_index))) {
-    raise << maybe(caller.name) << "ingredient " << ingredient_index << " of 'merge' should be a literal, for the tag of exclusive-container " << container_info.name << '\n' << end();
+    raise << maybe(caller.name) << "ingredient " << ingredient_index << " of 'merge' should be a literal, for the tag of exclusive-container '" << container_info.name << "'\n" << end();
     return;
   }
   reagent/*copy*/ ingredient = ingredients.at(ingredient_index);  // unnecessary copy just to keep this function from modifying caller
   populate_value(ingredient);
   if (ingredient.value >= SIZE(container_info.elements)) {
-    raise << maybe(caller.name) << "invalid tag at " << ingredient_index << " for " << container_info.name << " in '" << to_original_string(inst) << '\n' << end();
+    raise << maybe(caller.name) << "invalid tag at " << ingredient_index << " for '" << container_info.name << "' in '" << to_original_string(inst) << "'\n" << end();
     return;
   }
   const reagent& variant = variant_type(container, ingredient.value);
diff --git a/034address.cc b/034address.cc
index e699a14d..d78a0bb0 100644
--- a/034address.cc
+++ b/034address.cc
@@ -154,13 +154,13 @@ put(Recipe_ordinal, "new", NEW);
 case NEW: {
   const recipe& caller = get(Recipe, r);
   if (inst.ingredients.empty() || SIZE(inst.ingredients) > 2) {
-    raise << maybe(caller.name) << "'new' requires one or two ingredients, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(caller.name) << "'new' requires one or two ingredients, but got '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   // End NEW Check Special-cases
   const reagent& type = inst.ingredients.at(0);
   if (!is_mu_type_literal(type)) {
-    raise << maybe(caller.name) << "first ingredient of 'new' should be a type, but got " << type.original_string << '\n' << end();
+    raise << maybe(caller.name) << "first ingredient of 'new' should be a type, but got '" << type.original_string << "'\n" << end();
     break;
   }
   if (inst.products.empty()) {
@@ -168,7 +168,7 @@ case NEW: {
     break;
   }
   if (!product_of_new_is_valid(inst)) {
-    raise << maybe(caller.name) << "product of 'new' has incorrect type: " << to_original_string(inst) << '\n' << end();
+    raise << maybe(caller.name) << "product of 'new' has incorrect type: '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   break;
@@ -197,7 +197,7 @@ bool product_of_new_is_valid(const instruction& inst) {
 
 void drop_from_type(reagent& r, string expected_type) {
   if (r.type->name != expected_type) {
-    raise << "can't drop2 " << expected_type << " from " << to_string(r) << '\n' << end();
+    raise << "can't drop2 " << expected_type << " from '" << to_string(r) << "'\n" << end();
     return;
   }
   type_tree* tmp = r.type;
diff --git a/035lookup.cc b/035lookup.cc
index 6aa7d2a2..382d72aa 100644
--- a/035lookup.cc
+++ b/035lookup.cc
@@ -81,7 +81,7 @@ void canonize(reagent& x) {
 
 void lookup_memory(reagent& x) {
   if (!x.type || x.type->value != get(Type_ordinal, "address")) {
-    raise << maybe(current_recipe_name()) << "tried to /lookup " << x.original_string << " but it isn't an address\n" << end();
+    raise << maybe(current_recipe_name()) << "tried to /lookup '" << x.original_string << "' but it isn't an address\n" << end();
     return;
   }
   // compute value
@@ -158,7 +158,7 @@ assert(!has_property(element, "lookup"));
 bool canonize_type(reagent& r) {
   while (has_property(r, "lookup")) {
     if (!r.type || r.type->value != get(Type_ordinal, "address")) {
-      raise << "can't lookup non-address: " << to_string(r) << ": " << to_string(r.type) << '\n' << end();
+      raise << "can't lookup non-address: '" << to_string(r) << "': '" << to_string(r.type) << "'\n" << end();
       return false;
     }
     drop_from_type(r, "address");
@@ -241,7 +241,7 @@ canonize(base);
 def main [
   1:number/raw <- new number:type
 ]
-+error: main: product of 'new' has incorrect type: 1:number/raw <- new number:type
++error: main: product of 'new' has incorrect type: '1:number/raw <- new number:type'
 
 :(after "Update NEW product in Check")
 canonize_type(product);
@@ -436,7 +436,7 @@ def main [
     properties.push_back(pair<string, string_tree*>("lookup", NULL));
   }
   if (name.empty())
-    raise << "illegal name " << original_string << '\n' << end();
+    raise << "illegal name '" << original_string << "'\n" << end();
 }
 
 //:: helpers for debugging
diff --git a/039location_array.cc b/039location_array.cc
index 56e1b419..fd95511b 100644
--- a/039location_array.cc
+++ b/039location_array.cc
@@ -6,7 +6,7 @@ put(Recipe_ordinal, "to-location-array", TO_LOCATION_ARRAY);
 case TO_LOCATION_ARRAY: {
   const recipe& caller = get(Recipe, r);
   if (!is_address_of_array_of_numbers(inst.products.at(0))) {
-    raise << maybe(caller.name) << "product of 'to-location-array' has incorrect type: " << to_original_string(inst) << '\n' << end();
+    raise << maybe(caller.name) << "product of 'to-location-array' has incorrect type: '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   break;
diff --git a/040brace.cc b/040brace.cc
index 8cd7e622..02e3e210 100644
--- a/040brace.cc
+++ b/040brace.cc
@@ -61,7 +61,7 @@ void transform_braces(const recipe_ordinal r) {
     }
     if (inst.label == "}") {
       if (open_braces.empty()) {
-        raise << "missing '{' in " << get(Recipe, r).name << '\n' << end();
+        raise << "missing '{' in '" << get(Recipe, r).name << "'\n" << end();
         return;
       }
       open_braces.pop();
@@ -80,7 +80,7 @@ void transform_braces(const recipe_ordinal r) {
     // check for errors
     if (inst.old_name.find("-if") != string::npos || inst.old_name.find("-unless") != string::npos) {
       if (inst.ingredients.empty()) {
-        raise << inst.old_name << " expects 1 or 2 ingredients, but got none\n" << end();
+        raise << "'" << inst.old_name << "' expects 1 or 2 ingredients, but got none\n" << end();
         continue;
       }
     }
@@ -117,7 +117,7 @@ void transform_braces(const recipe_ordinal r) {
     target.type = new type_tree("offset", get(Type_ordinal, "offset"));
     target.set_value(0);
     if (open_braces.empty())
-      raise << inst.old_name << " needs a '{' before\n" << end();
+      raise << "'" << inst.old_name << "' needs a '{' before\n" << end();
     else if (inst.old_name.find("loop") != string::npos)
       target.set_value(open_braces.top()-index);
     else  // break instruction
@@ -350,7 +350,7 @@ def test-factorial [
 def main [
   break
 ]
-+error: break needs a '{' before
++error: 'break' needs a '{' before
 
 :(scenario break_conditional_without_ingredient_fails)
 % Hide_errors = true;
@@ -359,7 +359,7 @@ def main [
     break-if
   }
 ]
-+error: break-if expects 1 or 2 ingredients, but got none
++error: 'break-if' expects 1 or 2 ingredients, but got none
 
 //: Using break we can now implement conditional returns.
 
diff --git a/041jump_target.cc b/041jump_target.cc
index 1976084d..8ccd5625 100644
--- a/041jump_target.cc
+++ b/041jump_target.cc
@@ -68,19 +68,19 @@ void transform_labels(const recipe_ordinal r) {
 :(code)
 void replace_offset(reagent& x, /*const*/ map<string, int>& offset, const int current_offset, const recipe_ordinal r) {
   if (!is_literal(x)) {
-    raise << maybe(get(Recipe, r).name) << "jump target must be offset or label but is " << x.original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "jump target must be offset or label but is '" << x.original_string << "'\n" << end();
     x.set_value(0);  // no jump by default
     return;
   }
   if (x.initialized) return;
   if (is_integer(x.name)) return;  // non-labels will be handled like other number operands
   if (!is_jump_target(x.name)) {
-    raise << maybe(get(Recipe, r).name) << "can't jump to label " << x.name << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "can't jump to label '" << x.name << "'\n" << end();
     x.set_value(0);  // no jump by default
     return;
   }
   if (!contains_key(offset, x.name)) {
-    raise << maybe(get(Recipe, r).name) << "can't find label " << x.name << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "can't find label '" << x.name << "'\n" << end();
     x.set_value(0);  // no jump by default
     return;
   }
@@ -177,4 +177,4 @@ def main [
   $target
   5:number <- copy 0
 ]
-+error: main: can't jump to label $target
++error: main: can't jump to label '$target'
diff --git a/042name.cc b/042name.cc
index 4857a3c5..9c40cf63 100644
--- a/042name.cc
+++ b/042name.cc
@@ -15,7 +15,7 @@ def main [
 def main [
   x:number <- copy y:number
 ]
-+error: main: use before set: y
++error: main: use before set: 'y'
 # todo: detect conditional defines
 
 :(after "Transform.push_back(compute_container_sizes)")
@@ -54,14 +54,14 @@ void transform_names(const recipe_ordinal r) {
       if (is_named_location(inst.ingredients.at(in))) names_used = true;
       if (is_integer(inst.ingredients.at(in).name)) continue;
       if (!already_transformed(inst.ingredients.at(in), names)) {
-        raise << maybe(caller.name) << "use before set: " << inst.ingredients.at(in).name << '\n' << end();
+        raise << maybe(caller.name) << "use before set: '" << inst.ingredients.at(in).name << "'\n" << end();
       }
       int v = lookup_name(inst.ingredients.at(in), r);
       if (v >= 0) {
         inst.ingredients.at(in).set_value(v);
       }
       else {
-        raise << maybe(caller.name) << "can't find a place to store " << inst.ingredients.at(in).name << '\n' << end();
+        raise << maybe(caller.name) << "can't find a place to store '" << inst.ingredients.at(in).name << "'\n" << end();
         return;
       }
     }
@@ -80,7 +80,7 @@ void transform_names(const recipe_ordinal r) {
         inst.products.at(out).set_value(v);
       }
       else {
-        raise << maybe(caller.name) << "can't find a place to store " << inst.products.at(out).name << '\n' << end();
+        raise << maybe(caller.name) << "can't find a place to store '" << inst.products.at(out).name << "'\n" << end();
         return;
       }
     }
@@ -92,7 +92,7 @@ void transform_names(const recipe_ordinal r) {
 bool is_disqualified(/*mutable*/ reagent& x, const instruction& inst, const string& recipe_name) {
   if (!x.type) {
     // End Null-type is_disqualified Exceptions
-    raise << maybe(recipe_name) << "missing type for " << x.original_string << " in '" << to_original_string(inst) << "'\n" << end();
+    raise << maybe(recipe_name) << "missing type for '" << x.original_string << "' in '" << to_original_string(inst) << "'\n" << end();
     return true;
   }
   if (is_raw(x)) return true;
@@ -123,7 +123,7 @@ int find_element_name(const type_ordinal t, const string& name, const string& re
   const type_info& container = get(Type, t);
   for (int i = 0; i < SIZE(container.elements); ++i)
     if (container.elements.at(i).name == name) return i;
-  raise << maybe(recipe_name) << "unknown element " << name << " in container " << get(Type, t).name << '\n' << end();
+  raise << maybe(recipe_name) << "unknown element '" << name << "' in container '" << get(Type, t).name << "'\n" << end();
   return -1;
 }
 
diff --git a/043space.cc b/043space.cc
index 7fda8e4e..a3db4c31 100644
--- a/043space.cc
+++ b/043space.cc
@@ -56,7 +56,7 @@ void absolutize(reagent& x) {
   if (is_raw(x) || is_dummy(x)) return;
   if (x.name == "default-space") return;
   if (!x.initialized) {
-    raise << to_original_string(current_instruction()) << ": reagent not initialized: " << x.original_string << '\n' << end();
+    raise << to_original_string(current_instruction()) << ": reagent not initialized: '" << x.original_string << "'\n" << end();
   }
   x.set_value(address(x.value, space_base(x)));
   x.properties.push_back(pair<string, string_tree*>("raw", NULL));
@@ -92,7 +92,7 @@ if (x.name == "default-space") {
       || !x.type->right->right
       || x.type->right->right->value != get(Type_ordinal, "location")
       || x.type->right->right->right) {
-    raise << maybe(current_recipe_name()) << "'default-space' should be of type address:array:location, but tried to write " << to_string(data) << '\n' << end();
+    raise << maybe(current_recipe_name()) << "'default-space' should be of type address:array:location, but is " << to_string(x.type) << '\n' << end();
   }
   current_call().default_space = data.at(0);
   return;
@@ -397,7 +397,7 @@ void check_default_space(const recipe_ordinal r) {
   if (caller.steps.empty()) return;
   if (caller.steps.at(0).products.empty()
       || caller.steps.at(0).products.at(0).name != "default-space") {
-    raise << maybe(caller.name) << " does not seem to start with default-space or local-scope\n" << end();
+    raise << caller.name << " does not seem to start with default-space or local-scope\n" << end();
   }
 }
 :(after "Load .mu Core")
diff --git a/044space_surround.cc b/044space_surround.cc
index d9830230..3c70c08f 100644
--- a/044space_surround.cc
+++ b/044space_surround.cc
@@ -49,7 +49,7 @@ int space_index(const reagent& x) {
   for (int i = 0; i < SIZE(x.properties); ++i) {
     if (x.properties.at(i).first == "space") {
       if (!x.properties.at(i).second || x.properties.at(i).second->right)
-        raise << maybe(current_recipe_name()) << "/space metadata should take exactly one value in " << x.original_string << '\n' << end();
+        raise << maybe(current_recipe_name()) << "/space metadata should take exactly one value in '" << x.original_string << "'\n" << end();
       return to_integer(x.properties.at(i).second->value);
     }
   }
diff --git a/045closure_name.cc b/045closure_name.cc
index 1c365f2e..3b62ba58 100644
--- a/045closure_name.cc
+++ b/045closure_name.cc
@@ -56,28 +56,28 @@ void collect_surrounding_spaces(const recipe_ordinal r) {
           || !type->right->right
           || type->right->right->value != get(Type_ordinal, "location")
           || type->right->right->right) {
-        raise << "slot 0 should always have type address:array:location, but is " << to_string(inst.products.at(j)) << '\n' << end();
+        raise << "slot 0 should always have type address:array:location, but is '" << to_string(inst.products.at(j)) << "'\n" << end();
         continue;
       }
       string_tree* s = property(inst.products.at(j), "names");
       if (!s) {
-        raise << "slot 0 requires a /names property in recipe " << get(Recipe, r).name << end();
+        raise << "slot 0 requires a /names property in recipe '" << get(Recipe, r).name << "'\n" << end();
         continue;
       }
-      if (s->right) raise << "slot 0 should have a single value in /names, but got " << to_string(inst.products.at(j)) << '\n' << end();
+      if (s->right) raise << "slot 0 should have a single value in /names, but got '" << to_string(inst.products.at(j)) << "'\n" << end();
       const string& surrounding_recipe_name = s->value;
       if (surrounding_recipe_name.empty()) {
-        raise << "slot 0 doesn't initialize its /names property in recipe " << get(Recipe, r).name << end();
+        raise << "slot 0 doesn't initialize its /names property in recipe '" << get(Recipe, r).name << "'\n" << end();
         continue;
       }
       if (contains_key(Surrounding_space, r)
           && get(Surrounding_space, r) != get(Recipe_ordinal, surrounding_recipe_name)) {
-        raise << "recipe " << get(Recipe, r).name << " can have only one 'surrounding' recipe but has " << get(Recipe, get(Surrounding_space, r)).name << " and " << surrounding_recipe_name << '\n' << end();
+        raise << "recipe '" << get(Recipe, r).name << "' can have only one 'surrounding' recipe but has '" << get(Recipe, get(Surrounding_space, r)).name << "' and '" << surrounding_recipe_name << "'\n" << end();
         continue;
       }
       trace(9993, "name") << "lexically surrounding space for recipe " << get(Recipe, r).name << " comes from " << surrounding_recipe_name << end();
       if (!contains_key(Recipe_ordinal, surrounding_recipe_name)) {
-        raise << "can't find recipe providing surrounding space for " << get(Recipe, r).name << ": " << surrounding_recipe_name << '\n' << end();
+        raise << "can't find recipe providing surrounding space for '" << get(Recipe, r).name << "'; looking for '" << surrounding_recipe_name << "'\n" << end();
         continue;
       }
       put(Surrounding_space, r, get(Recipe_ordinal, surrounding_recipe_name));
@@ -110,7 +110,7 @@ int lookup_name(const reagent& x, const recipe_ordinal default_recipe) {
 int lookup_name(const reagent& x, const recipe_ordinal r, set<recipe_ordinal>& done, vector<recipe_ordinal>& path) {
   if (!Name[r].empty()) return Name[r][x.name];
   if (contains_key(done, r)) {
-    raise << "can't compute address of " << to_string(x) << " because " << end();
+    raise << "can't compute address of '" << to_string(x) << "' because\n" << end();
     for (int i = 1; i < SIZE(path); ++i) {
       raise << path.at(i-1) << " requires computing names of " << path.at(i) << '\n' << end();
     }
@@ -127,7 +127,7 @@ int lookup_name(const reagent& x, const recipe_ordinal r, set<recipe_ordinal>& d
 recipe_ordinal lookup_surrounding_recipe(const recipe_ordinal r, int n) {
   if (n == 0) return r;
   if (!contains_key(Surrounding_space, r)) {
-    raise << "don't know surrounding recipe of " << get(Recipe, r).name << '\n' << end();
+    raise << "don't know surrounding recipe of '" << get(Recipe, r).name << "'\n" << end();
     return -1;
   }
   assert(contains_key(Surrounding_space, r));
@@ -140,7 +140,7 @@ bool already_transformed(const reagent& r, const map<string, int>& names) {
   if (has_property(r, "space")) {
     string_tree* p = property(r, "space");
     if (!p || p->right) {
-      raise << "/space property should have exactly one (non-negative integer) value in " << r.original_string << '\n' << end();
+      raise << "/space property should have exactly one (non-negative integer) value in '" << r.original_string << "'\n" << end();
       return false;
     }
     if (p->value != "0") return true;
@@ -154,8 +154,8 @@ def f [
   local-scope
   x:number/space:1 <- copy 34
 ]
-+error: don't know surrounding recipe of f
-+error: f: can't find a place to store x
++error: don't know surrounding recipe of 'f'
++error: f: can't find a place to store 'x'
 
 //: extra test for try_reclaim_locals() from previous layers
 :(scenario local_scope_ignores_nonlocal_spaces)
diff --git a/046global.cc b/046global.cc
index caab3d38..757c2a17 100644
--- a/046global.cc
+++ b/046global.cc
@@ -50,7 +50,7 @@ if (x.name == "global-space") {
       || !x.type->right->right
       || x.type->right->right->value != get(Type_ordinal, "location")
       || x.type->right->right->right) {
-    raise << maybe(current_recipe_name()) << "'global-space' should be of type address:array:location, but tried to write " << to_string(data) << '\n' << end();
+    raise << maybe(current_recipe_name()) << "'global-space' should be of type address:array:location, but tried to write '" << to_string(x.type) << "'\n" << end();
   }
   if (Current_routine->global_space)
     raise << "routine already has a global-space; you can't over-write your globals" << end();
diff --git a/047check_type_by_name.cc b/047check_type_by_name.cc
index 5aa196ee..3778fa79 100644
--- a/047check_type_by_name.cc
+++ b/047check_type_by_name.cc
@@ -12,7 +12,7 @@ def main [
   x:number <- copy 1
   x:boolean <- copy 1
 ]
-+error: main: x used with multiple types
++error: main: 'x' used with multiple types
 
 :(after "Begin Instruction Modifying Transforms")
 Transform.push_back(check_or_set_types_by_name);  // idempotent
@@ -51,16 +51,16 @@ void check_type(set<reagent>& known, const reagent& x, const recipe& caller) {
     known.insert(x);
   }
   if (!types_strictly_match(known.find(x)->type, x.type)) {
-    raise << maybe(caller.name) << x.name << " used with multiple types\n" << end();
+    raise << maybe(caller.name) << "'" << x.name << "' used with multiple types\n" << end();
     return;
   }
   if (x.type->name == "array") {
     if (!x.type->right) {
-      raise << maybe(caller.name) << x.name << " can't be just an array. What is it an array of?\n" << end();
+      raise << maybe(caller.name) << "'" << x.name << ": can't be just an array. What is it an array of?\n" << end();
       return;
     }
     if (!x.type->right->right) {
-      raise << caller.name << " can't determine the size of array variable " << x.name << ". Either allocate it separately and make the type of " << x.name << " address:..., or specify the length of the array in the type of " << x.name << ".\n" << end();
+      raise << caller.name << " can't determine the size of array variable '" << x.name << "'. Either allocate it separately and make the type of '" << x.name << "' an address, or specify the length of the array in the type of '" << x.name << "'.\n" << end();
       return;
     }
   }
@@ -91,7 +91,7 @@ def main [
   x <- copy 1
   x:number <- copy 2
 ]
-+error: main: missing type for x in 'x <- copy 1'
++error: main: missing type for 'x' in 'x <- copy 1'
 
 :(scenario typo_in_address_type_fails)
 % Hide_errors = true;
@@ -106,7 +106,7 @@ def main [
 def main [
   x:array:number <- merge 2, 12, 13
 ]
-+error: main can't determine the size of array variable x. Either allocate it separately and make the type of x address:..., or specify the length of the array in the type of x.
++error: main can't determine the size of array variable 'x'. Either allocate it separately and make the type of 'x' an address, or specify the length of the array in the type of 'x'.
 
 :(scenarios transform)
 :(scenario transform_checks_types_of_identical_reagents_in_multiple_spaces)
diff --git a/050scenario.cc b/050scenario.cc
index 4a455187..c7d57d96 100644
--- a/050scenario.cc
+++ b/050scenario.cc
@@ -75,11 +75,11 @@ scenario parse_scenario(istream& in) {
   scenario result;
   result.name = next_word(in);
   if (contains_key(Scenario_names, result.name))
-    raise << "duplicate scenario name: " << result.name << '\n' << end();
+    raise << "duplicate scenario name: '" << result.name << "'\n" << end();
   Scenario_names.insert(result.name);
   skip_whitespace_and_comments(in);
   if (in.peek() != '[') {
-    raise << "Expected '[' after scenario " << result.name << '\n' << end();
+    raise << "Expected '[' after scenario '" << result.name << "'\n" << end();
     exit(0);
   }
   // scenarios are take special 'code' strings so we need to ignore brackets
@@ -263,7 +263,7 @@ def main [
   ]
 ]
 +run: checking location 1
-+error: expected location 1 to contain 13 but saw 0
++error: expected location '1' to contain 13 but saw 0
 
 :(before "End Primitive Recipe Declarations")
 MEMORY_SHOULD_CONTAIN,
@@ -301,10 +301,10 @@ void check_memory(const string& s) {
     if (!is_integer(rhs) && !is_noninteger(rhs)) {
       if (Current_scenario && !Scenario_testing_scenario)
         // genuine test in a mu file
-        raise << "\nF - " << Current_scenario->name << ": location " << address << " can't contain non-number " << rhs << '\n' << end();
+        raise << "\nF - " << Current_scenario->name << ": location '" << address << "' can't contain non-number " << rhs << "\n" << end();
       else
         // just testing scenario support
-        raise << "location " << address << " can't contain non-number " << rhs << '\n' << end();
+        raise << "location '" << address << "' can't contain non-number " << rhs << '\n' << end();
       if (!Scenario_testing_scenario) {
         Passed = false;
         ++Num_failures;
@@ -313,16 +313,16 @@ void check_memory(const string& s) {
     }
     double value = to_double(rhs);
     if (contains_key(locations_checked, address))
-      raise << "duplicate expectation for location " << address << '\n' << end();
+      raise << "duplicate expectation for location '" << address << "'\n" << end();
     trace(9999, "run") << "checking location " << address << end();
     if (get_or_insert(Memory, address) != value) {
       if (Current_scenario && !Scenario_testing_scenario) {
         // genuine test in a mu file
-        raise << "\nF - " << Current_scenario->name << ": expected location " << address << " to contain " << no_scientific(value) << " but saw " << no_scientific(get_or_insert(Memory, address)) << '\n' << end();
+        raise << "\nF - " << Current_scenario->name << ": expected location '" << address << "' to contain " << no_scientific(value) << " but saw " << no_scientific(get_or_insert(Memory, address)) << '\n' << end();
       }
       else {
         // just testing scenario support
-        raise << "expected location " << address << " to contain " << no_scientific(value) << " but saw " << no_scientific(get_or_insert(Memory, address)) << '\n' << end();
+        raise << "expected location '" << address << "' to contain " << no_scientific(value) << " but saw " << no_scientific(get_or_insert(Memory, address)) << '\n' << end();
       }
       if (!Scenario_testing_scenario) {
         Passed = false;
@@ -353,16 +353,16 @@ void check_type(const string& lhs, istream& in) {
     return;
   }
   // End Scenario Type Cases
-  raise << "don't know how to check memory for " << lhs << '\n' << end();
+  raise << "don't know how to check memory for '" << lhs << "'\n" << end();
 }
 
 void check_string(int address, const string& literal) {
   trace(9999, "run") << "checking string length at " << address << end();
   if (get_or_insert(Memory, address) != SIZE(literal)) {
     if (Current_scenario && !Scenario_testing_scenario)
-      raise << "\nF - " << Current_scenario->name << ": expected location " << address << " to contain length " << SIZE(literal) << " of string [" << literal << "] but saw " << no_scientific(get_or_insert(Memory, address)) << " (" << read_mu_string(address) << ")\n" << end();
+      raise << "\nF - " << Current_scenario->name << ": expected location '" << address << "' to contain length " << SIZE(literal) << " of string [" << literal << "] but saw " << no_scientific(get_or_insert(Memory, address)) << " (" << read_mu_string(address) << ")\n" << end();
     else
-      raise << "expected location " << address << " to contain length " << SIZE(literal) << " of string [" << literal << "] but saw " << no_scientific(get_or_insert(Memory, address)) << '\n' << end();
+      raise << "expected location '" << address << "' to contain length " << SIZE(literal) << " of string [" << literal << "] but saw " << no_scientific(get_or_insert(Memory, address)) << '\n' << end();
     if (!Scenario_testing_scenario) {
       Passed = false;
       ++Num_failures;
@@ -399,7 +399,7 @@ def main [
     1 <- 0
   ]
 ]
-+error: duplicate expectation for location 1
++error: duplicate expectation for location '1'
 
 :(scenario memory_check_string_length)
 % Scenario_testing_scenario = true;
@@ -413,7 +413,7 @@ def main [
     1:array:character <- [ab]
   ]
 ]
-+error: expected location 1 to contain length 2 of string [ab] but saw 3
++error: expected location '1' to contain length 2 of string [ab] but saw 3
 
 :(scenario memory_check_string)
 def main [
@@ -438,7 +438,7 @@ def main [
     1 <- [abc]
   ]
 ]
-+error: location 1 can't contain non-number [abc]
++error: location '1' can't contain non-number [abc]
 
 :(scenario memory_check_with_comment)
 % Scenario_testing_scenario = true;
@@ -634,11 +634,11 @@ case CHECK_TRACE_COUNT_FOR_LABEL: {
     break;
   }
   if (!is_mu_number(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'check-trace-count-for-label' should be a number (count), but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'check-trace-count-for-label' should be a number (count), but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   if (!is_literal_string(inst.ingredients.at(1))) {
-    raise << maybe(get(Recipe, r).name) << "second ingredient of 'check-trace-count-for-label' should be a literal string (label), but got " << inst.ingredients.at(1).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second ingredient of 'check-trace-count-for-label' should be a literal string (label), but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
     break;
   }
   break;
diff --git a/052tangle.cc b/052tangle.cc
index ea11f58f..db1416a8 100644
--- a/052tangle.cc
+++ b/052tangle.cc
@@ -146,11 +146,11 @@ check_insert_fragments();
 void check_insert_fragments() {
   for (map<string, recipe>::iterator p = Before_fragments.begin(); p != Before_fragments.end(); ++p) {
     if (!contains_key(Fragments_used, p->first))
-      raise << "could not locate insert before " << p->first << '\n' << end();
+      raise << "could not locate insert before label " << p->first << '\n' << end();
   }
   for (map<string, recipe>::iterator p = After_fragments.begin(); p != After_fragments.end(); ++p) {
     if (!contains_key(Fragments_used, p->first))
-      raise << "could not locate insert after " << p->first << '\n' << end();
+      raise << "could not locate insert after label " << p->first << '\n' << end();
   }
 }
 
@@ -442,7 +442,7 @@ void test_new_fragment_after_tangle() {
 
 :(before "End before Command Handler")
 if (contains_key(Fragments_used, label))
-  raise << "we've already tangled some code at " << label << " in a previous call to transform_all(). Those locations won't be updated.\n" << end();
+  raise << "we've already tangled some code at label " << label << " in a previous call to transform_all(). Those locations won't be updated.\n" << end();
 :(before "End after Command Handler")
 if (contains_key(Fragments_used, label))
-  raise << "we've already tangled some code at " << label << " in a previous call to transform_all(). Those locations won't be updated.\n" << end();
+  raise << "we've already tangled some code at label " << label << " in a previous call to transform_all(). Those locations won't be updated.\n" << end();
diff --git a/053recipe_header.cc b/053recipe_header.cc
index c58962a0..aebd9193 100644
--- a/053recipe_header.cc
+++ b/053recipe_header.cc
@@ -83,7 +83,7 @@ def foo a:number <- b:number [
 % Hide_errors = true;
 def main
 ]
-+error: recipe body must begin with '['
++error: main: recipe body must begin with '['
 
 :(scenario recipe_handles_missing_bracket_2)
 % Hide_errors = true;
@@ -94,7 +94,7 @@ def main
 ]
 # doesn't overflow line when reading header
 -parse: header ingredient: local-scope
-+error: recipe body must begin with '['
++error: main: recipe body must begin with '['
 
 :(scenario recipe_handles_missing_bracket_3)
 % Hide_errors = true;
@@ -105,7 +105,7 @@ def main  # comment
 ]
 # doesn't overflow line when reading header
 -parse: header ingredient: local-scope
-+error: recipe body must begin with '['
++error: main: recipe body must begin with '['
 
 :(after "Begin debug_string(recipe x)")
 out << "ingredients:\n";
@@ -290,7 +290,7 @@ def add2 x:number, x:number -> z:number [
   load-ingredients
   return z
 ]
-+error: add2: x can't repeat in the ingredients
++error: add2: 'x' can't repeat in the ingredients
 
 :(before "End recipe Fields")
 map<string, int> ingredient_index;
@@ -306,7 +306,7 @@ void check_header_ingredients(const recipe_ordinal r) {
   trace(9991, "transform") << "--- checking reply instructions against header for " << caller_recipe.name << end();
   for (int i = 0; i < SIZE(caller_recipe.ingredients); ++i) {
     if (contains_key(caller_recipe.ingredient_index, caller_recipe.ingredients.at(i).name))
-      raise << maybe(caller_recipe.name) << caller_recipe.ingredients.at(i).name << " can't repeat in the ingredients\n" << end();
+      raise << maybe(caller_recipe.name) << "'" << caller_recipe.ingredients.at(i).name << "' can't repeat in the ingredients\n" << end();
     put(caller_recipe.ingredient_index, caller_recipe.ingredients.at(i).name, i);
   }
 }
@@ -485,7 +485,7 @@ def add2 x:number, y:number -> x:number [
   local-scope
   load-ingredients
 ]
-+error: main: '3:number <- add2 1:number, 2:number' should write to 1:number rather than 3:number
++error: main: '3:number <- add2 1:number, 2:number' should write to '1:number' rather than '3:number'
 
 :(before "End Includes")
 using std::min;
diff --git a/054static_dispatch.cc b/054static_dispatch.cc
index 5271fe13..a90770d7 100644
--- a/054static_dispatch.cc
+++ b/054static_dispatch.cc
@@ -613,7 +613,7 @@ def foo a:boolean -> b:number [
   load-ingredients
   return 35
 ]
-+error: main: missing type for x in 'y:number <- foo x'
++error: main: missing type for 'x' in 'y:number <- foo x'
 +error: main: failed to find a matching call for 'y:number <- foo x'
 
 :(before "End Includes")
diff --git a/055shape_shifting_container.cc b/055shape_shifting_container.cc
index fb847899..2f5cc81c 100644
--- a/055shape_shifting_container.cc
+++ b/055shape_shifting_container.cc
@@ -132,7 +132,7 @@ bool slurp_type_ingredients(istream& in, map<string, type_ordinal>& out) {
   while (has_data(in)) {
     string curr = slurp_until(in, ':');
     if (out.find(curr) != out.end()) {
-      raise << "can't repeat type ingredient names in a single container definition: " << curr << '\n' << end();
+      raise << "can't repeat type ingredient names in a single container definition: '" << curr << "'\n" << end();
       return false;
     }
     put(out, curr, next_type_ordinal++);
@@ -607,6 +607,6 @@ def main [
 :(before "End variant_type Special-cases")
 if (contains_type_ingredient(element)) {
   if (!type->right)
-    raise << "illegal type '" << to_string(type) << "' seems to be missing a type ingredient or three\n" << end();
+    raise << "illegal type " << to_string(type) << " seems to be missing a type ingredient or three\n" << end();
   replace_type_ingredients(element.type, type->right, info);
 }
diff --git a/056shape_shifting_recipe.cc b/056shape_shifting_recipe.cc
index c69678bf..d76b662a 100644
--- a/056shape_shifting_recipe.cc
+++ b/056shape_shifting_recipe.cc
@@ -78,7 +78,7 @@ skip_shape_shifting_variants:;
 :(before "End Instruction Operation Checks")
 if (contains_key(Recipe, inst.operation) && inst.operation >= MAX_PRIMITIVE_RECIPES
     && any_type_ingredient_in_header(inst.operation)) {
-  raise << maybe(caller.name) << "instruction " << inst.name << " has no valid specialization\n" << end();
+  raise << maybe(caller.name) << "instruction '" << inst.name << "' has no valid specialization\n" << end();
   return;
 }
 
@@ -280,13 +280,13 @@ void save_or_deduce_type_name(reagent& x, map<string, type_tree*>& type, const r
     return;
   }
   if (!x.type) {
-    raise << maybe(variant.original_name) << "unknown type for " << x.original_string << " (check the name for typos)\n" << end();
+    raise << maybe(variant.original_name) << "unknown type for '" << x.original_string << "' (check the name for typos)\n" << end();
     return;
   }
   if (contains_key(type, x.name)) return;
   if (x.type->name == "offset" || x.type->name == "variant") return;  // special-case for container-access instructions
   put(type, x.name, x.type);
-  trace(9993, "transform") << "type of " << x.name << " is " << names_to_string(x.type) << end();
+  trace(9993, "transform") << "type of '" << x.name << "' is " << names_to_string(x.type) << end();
 }
 
 void compute_type_ingredient_mappings(const recipe& exemplar, const instruction& inst, map<string, const type_tree*>& mappings, const recipe& caller_recipe, bool* error) {
@@ -390,7 +390,7 @@ void replace_type_ingredients(reagent& x, const map<string, const type_tree*>& m
   string before = to_string(x);
   trace(9993, "transform") << "replacing in ingredient " << x.original_string << end();
   if (!x.type) {
-    raise << "specializing " << caller.original_name << ": missing type for " << x.original_string << '\n' << end();
+    raise << "specializing " << caller.original_name << ": missing type for '" << x.original_string << "'\n" << end();
     return;
   }
   replace_type_ingredients(x.type, mappings);
@@ -778,7 +778,7 @@ def foo x:address:_elem -> y:address:_elem [
   load-ingredients
   y <- copy x
 ]
-+error: main: instruction foo has no valid specialization
++error: main: instruction 'foo' has no valid specialization
 
 :(scenario specialize_with_literal_5)
 def main [
@@ -864,8 +864,8 @@ def foo a:d1:_elem -> b:number [
 container d1:_elem [
   x:_elem
 ]
-+error: foo: unknown type for e (check the name for typos)
-+error: specializing foo: missing type for e
++error: foo: unknown type for 'e' (check the name for typos)
++error: specializing foo: missing type for 'e'
 # and it doesn't crash
 
 :(scenario missing_type_in_shape_shifting_recipe_2)
@@ -883,8 +883,8 @@ def foo a:d1:_elem -> b:number [
 container d1:_elem [
   x:_elem
 ]
-+error: foo: unknown type for e (check the name for typos)
-+error: specializing foo: missing type for e
++error: foo: unknown type for 'e' (check the name for typos)
++error: specializing foo: missing type for 'e'
 # and it doesn't crash
 
 :(scenarios transform)
diff --git a/057immutable.cc b/057immutable.cc
index 7c04bf36..d89843ed 100644
--- a/057immutable.cc
+++ b/057immutable.cc
@@ -77,7 +77,7 @@ def foo x:address:number [
   load-ingredients
   *x <- copy 34
 ]
-+error: foo: cannot modify x in instruction '*x <- copy 34' because it's an ingredient of recipe foo but not also a product
++error: foo: cannot modify 'x' in instruction '*x <- copy 34' because it's an ingredient of recipe foo but not also a product
 
 :(scenario can_modify_immutable_pointers)
 def main [
@@ -109,7 +109,7 @@ def foo x:address:number [
   # this could be ok, but we're not going to try to be that smart
   *x <- copy 34
 ]
-+error: foo: cannot modify x in instruction '*x <- copy 34' because it's an ingredient of recipe foo but not also a product
++error: foo: cannot modify 'x' in instruction '*x <- copy 34' because it's an ingredient of recipe foo but not also a product
 
 :(scenario cannot_call_mutating_recipes_on_immutable_ingredients)
 % Hide_errors = true;
@@ -129,7 +129,7 @@ def bar p:address:point -> p:address:point [
   # p could be modified here, but it doesn't have to be, it's already marked
   # mutable in the header
 ]
-+error: foo: cannot modify p in instruction 'bar p' because it's an ingredient of recipe foo but not also a product
++error: foo: cannot modify 'p' in instruction 'bar p' because it's an ingredient of recipe foo but not also a product
 
 :(scenario cannot_modify_copies_of_immutable_ingredients)
 % Hide_errors = true;
@@ -144,7 +144,7 @@ def foo p:address:point [
   q:address:point <- copy p
   *q <- put *q, x:offset, 34
 ]
-+error: foo: cannot modify q in instruction '*q <- put *q, x:offset, 34' because that would modify p which is an ingredient of recipe foo but not also a product
++error: foo: cannot modify 'q' in instruction '*q <- put *q, x:offset, 34' because that would modify p which is an ingredient of recipe foo but not also a product
 
 :(scenario can_modify_copies_of_mutable_ingredients)
 def main [
@@ -174,7 +174,7 @@ def foo a:address:foo [
   x:address:array:number <- get *a, x:offset  # just a regular get of the container
   *x <- put-index *x, 0, 34  # but then a put-index on the result
 ]
-+error: foo: cannot modify x in instruction '*x <- put-index *x, 0, 34' because that would modify a which is an ingredient of recipe foo but not also a product
++error: foo: cannot modify 'x' in instruction '*x <- put-index *x, 0, 34' because that would modify a which is an ingredient of recipe foo but not also a product
 
 :(scenario cannot_modify_address_inside_immutable_ingredients_2)
 container foo [
@@ -207,7 +207,7 @@ def foo a:address:array:address:number [
   x:address:number <- index *a, 0  # just a regular index of the array
   *x <- copy 34  # but then modify the result
 ]
-+error: foo: cannot modify x in instruction '*x <- copy 34' because that would modify a which is an ingredient of recipe foo but not also a product
++error: foo: cannot modify 'x' in instruction '*x <- copy 34' because that would modify a which is an ingredient of recipe foo but not also a product
 
 :(scenario cannot_modify_address_inside_immutable_ingredients_4)
 container foo [
@@ -284,7 +284,7 @@ def bar [
   load-ingredients
   p:address:point <- next-ingredient  # optional ingredient; assumed to be mutable
 ]
-+error: foo: cannot modify p in instruction 'bar p' because it's an ingredient of recipe foo but not also a product
++error: foo: cannot modify 'p' in instruction 'bar p' because it's an ingredient of recipe foo but not also a product
 
 //: when checking for immutable ingredients, remember to take space into account
 :(scenario check_space_of_reagents_in_immutability_checks)
@@ -405,7 +405,7 @@ def test-next x:address:test-list -> y:address:test-list/contained-in:x [
   load-ingredients
   y <- get *x, next:offset
 ]
-+error: foo: cannot modify p2 in instruction '*p2 <- put *p2, value:offset, 34' because that would modify p which is an ingredient of recipe foo but not also a product
++error: foo: cannot modify 'p2' in instruction '*p2 <- put *p2, value:offset, 34' because that would modify p which is an ingredient of recipe foo but not also a product
 
 :(code)
 void check_immutable_ingredient_in_instruction(const instruction& inst, const set<reagent>& current_ingredient_and_aliases, const string& original_ingredient_name, const recipe& caller) {
@@ -415,9 +415,9 @@ void check_immutable_ingredient_in_instruction(const instruction& inst, const se
         && current_ingredient_and_aliases.find(inst.products.at(i)) != current_ingredient_and_aliases.end()) {
       string current_product_name = inst.products.at(i).name;
       if (current_product_name == original_ingredient_name)
-        raise << maybe(caller.name) << "cannot modify " << current_product_name << " in instruction '" << to_original_string(inst) << "' because it's an ingredient of recipe " << caller.name << " but not also a product\n" << end();
+        raise << maybe(caller.name) << "cannot modify '" << current_product_name << "' in instruction '" << to_original_string(inst) << "' because it's an ingredient of recipe " << caller.name << " but not also a product\n" << end();
       else
-        raise << maybe(caller.name) << "cannot modify " << current_product_name << " in instruction '" << to_original_string(inst) << "' because that would modify " << original_ingredient_name << " which is an ingredient of recipe " << caller.name << " but not also a product\n" << end();
+        raise << maybe(caller.name) << "cannot modify '" << current_product_name << "' in instruction '" << to_original_string(inst) << "' because that would modify " << original_ingredient_name << " which is an ingredient of recipe " << caller.name << " but not also a product\n" << end();
       return;
     }
   }
@@ -438,9 +438,9 @@ void check_immutable_ingredient_in_instruction(const instruction& inst, const se
       if (inst.operation == PUT || inst.operation == PUT_INDEX) {
         if (current_ingredient_index == 0) {
           if (current_ingredient_name == original_ingredient_name)
-            raise << maybe(caller.name) << "cannot modify " << current_ingredient_name << " in instruction '" << to_original_string(inst) << "' because it's an ingredient of recipe " << caller.name << " but not also a product\n" << end();
+            raise << maybe(caller.name) << "cannot modify '" << current_ingredient_name << "' in instruction '" << to_original_string(inst) << "' because it's an ingredient of recipe " << caller.name << " but not also a product\n" << end();
           else
-            raise << maybe(caller.name) << "cannot modify " << current_ingredient_name << " in instruction '" << to_original_string(inst) << "' because that would modify " << original_ingredient_name << " which is an ingredient of recipe " << caller.name << " but not also a product\n" << end();
+            raise << maybe(caller.name) << "cannot modify '" << current_ingredient_name << "' in instruction '" << to_original_string(inst) << "' because that would modify '" << original_ingredient_name << "' which is an ingredient of recipe " << caller.name << " but not also a product\n" << end();
         }
       }
     }
@@ -449,9 +449,9 @@ void check_immutable_ingredient_in_instruction(const instruction& inst, const se
       if (!is_mu_address(current_ingredient)) return;  // making a copy is ok
       if (is_modified_in_recipe(inst.operation, current_ingredient_index, caller)) {
         if (current_ingredient_name == original_ingredient_name)
-          raise << maybe(caller.name) << "cannot modify " << current_ingredient_name << " in instruction '" << to_original_string(inst) << "' because it's an ingredient of recipe " << caller.name << " but not also a product\n" << end();
+          raise << maybe(caller.name) << "cannot modify '" << current_ingredient_name << "' in instruction '" << to_original_string(inst) << "' because it's an ingredient of recipe " << caller.name << " but not also a product\n" << end();
         else
-          raise << maybe(caller.name) << "cannot modify " << current_ingredient_name << " in instruction '" << to_original_string(inst) << "' because that would modify " << original_ingredient_name << " which is an ingredient of recipe " << caller.name << " but not also a product\n" << end();
+          raise << maybe(caller.name) << "cannot modify '" << current_ingredient_name << "' in instruction '" << to_original_string(inst) << "' because that would modify '" << original_ingredient_name << "' which is an ingredient of recipe " << caller.name << " but not also a product\n" << end();
       }
     }
   }
@@ -460,7 +460,7 @@ void check_immutable_ingredient_in_instruction(const instruction& inst, const se
 bool is_modified_in_recipe(recipe_ordinal r, int ingredient_index, const recipe& caller) {
   const recipe& callee = get(Recipe, r);
   if (!callee.has_header) {
-    raise << maybe(caller.name) << "can't check mutability of ingredients in " << callee.name << " because it uses 'next-ingredient' directly, rather than a recipe header.\n" << end();
+    raise << maybe(caller.name) << "can't check mutability of ingredients in recipe " << callee.name << " because it uses 'next-ingredient' directly, rather than a recipe header.\n" << end();
     return true;
   }
   if (ingredient_index >= SIZE(callee.ingredients)) return false;  // optional immutable ingredient
@@ -539,6 +539,6 @@ if (has_property(current_ingredient, "contained-in")) {
   if (tmp->left || tmp->right
       || !is_present_in_ingredients(caller, tmp->value)
       || !is_present_in_products(caller, tmp->value))
-    raise << maybe(caller.name) << "contained-in can only point to another ingredient+product, but got " << to_string(property(current_ingredient, "contained-in")) << '\n' << end();
+    raise << maybe(caller.name) << "/contained-in can only point to another ingredient+product, but got '" << to_string(property(current_ingredient, "contained-in")) << "'\n" << end();
   continue;
 }
diff --git a/060recipe.cc b/060recipe.cc
index 93fe1bd2..5d20572b 100644
--- a/060recipe.cc
+++ b/060recipe.cc
@@ -51,7 +51,7 @@ case CALL: {
     break;
   }
   if (!is_mu_recipe(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'call' should be a recipe, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'call' should be a recipe, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   break;
diff --git a/061scheduler.cc b/061scheduler.cc
index a3d0baad..edf05c26 100644
--- a/061scheduler.cc
+++ b/061scheduler.cc
@@ -156,7 +156,7 @@ case START_RUNNING: {
     break;
   }
   if (!is_mu_recipe(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'start-running' should be a recipe, but got " << to_string(inst.ingredients.at(0)) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'start-running' should be a recipe, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end();
     break;
   }
   break;
@@ -342,11 +342,11 @@ put(Recipe_ordinal, "routine-state", ROUTINE_STATE);
 :(before "End Primitive Recipe Checks")
 case ROUTINE_STATE: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'routine-state' requires exactly one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'routine-state' 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 'routine-state' should be a routine id generated by 'start-running', but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'routine-state' should be a routine id generated by 'start-running', but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -375,11 +375,11 @@ put(Recipe_ordinal, "restart", RESTART);
 :(before "End Primitive Recipe Checks")
 case RESTART: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'restart' requires exactly one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'restart' 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 'restart' should be a routine id generated by 'start-running', but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'restart' should be a routine id generated by 'start-running', but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -403,11 +403,11 @@ put(Recipe_ordinal, "stop", STOP);
 :(before "End Primitive Recipe Checks")
 case STOP: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'stop' requires exactly one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'stop' 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 'stop' should be a routine id generated by 'start-running', but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'stop' should be a routine id generated by 'start-running', but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -507,15 +507,15 @@ put(Recipe_ordinal, "limit-time", LIMIT_TIME);
 :(before "End Primitive Recipe Checks")
 case LIMIT_TIME: {
   if (SIZE(inst.ingredients) != 2) {
-    raise << maybe(get(Recipe, r).name) << "'limit-time' requires exactly two ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'limit-time' requires exactly two 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 'limit-time' should be a routine id generated by 'start-running', but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'limit-time' should be a routine id generated by 'start-running', but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   if (!is_mu_number(inst.ingredients.at(1))) {
-    raise << maybe(get(Recipe, r).name) << "second ingredient of 'limit-time' should be a number (of instructions to run for), but got " << inst.ingredients.at(1).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second ingredient of 'limit-time' should be a number (of instructions to run for), but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
     break;
   }
   break;
diff --git a/062wait.cc b/062wait.cc
index e07d658a..d2c9004e 100644
--- a/062wait.cc
+++ b/062wait.cc
@@ -59,11 +59,11 @@ put(Recipe_ordinal, "wait-for-location", WAIT_FOR_LOCATION);
 :(before "End Primitive Recipe Checks")
 case WAIT_FOR_LOCATION: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'wait-for-location' requires exactly one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'wait-for-location' requires exactly one ingredient, but got '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   if (!is_mu_location(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'wait-for-location' requires a location ingredient, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'wait-for-location' requires a location ingredient, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
   }
   break;
 }
@@ -115,20 +115,20 @@ case GET_LOCATION: {
   reagent/*copy*/ base = inst.ingredients.at(0);
   if (!canonize_type(base)) break;
   if (!base.type || !base.type->value || !contains_key(Type, base.type->value) || get(Type, base.type->value).kind != CONTAINER) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'get-location' should be a container, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'get-location' should be a container, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   type_ordinal base_type = base.type->value;
   const reagent& offset = inst.ingredients.at(1);
   if (!is_literal(offset) || !is_mu_scalar(offset)) {
-    raise << maybe(get(Recipe, r).name) << "second ingredient of 'get-location' should have type 'offset', but got " << inst.ingredients.at(1).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second ingredient of 'get-location' should have type 'offset', but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
     break;
   }
   int offset_value = 0;
   if (is_integer(offset.name)) {  // later layers permit non-integer offsets
     offset_value = to_integer(offset.name);
     if (offset_value < 0 || offset_value >= SIZE(get(Type, base_type).elements)) {
-      raise << maybe(get(Recipe, r).name) << "invalid offset " << offset_value << " for " << get(Type, base_type).name << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "invalid offset " << offset_value << " for '" << get(Type, base_type).name << "'\n" << end();
       break;
     }
   }
@@ -137,7 +137,7 @@ case GET_LOCATION: {
   }
   if (inst.products.empty()) break;
   if (!is_mu_location(inst.products.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'get-location " << base.original_string << ", " << offset.original_string << "' should write to type location but " << inst.products.at(0).name << " has type " << names_to_string_without_quotes(inst.products.at(0).type) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'get-location " << base.original_string << ", " << offset.original_string << "' should write to type location but '" << inst.products.at(0).name << "' has type '" << names_to_string_without_quotes(inst.products.at(0).type) << "'\n" << end();
     break;
   }
   break;
@@ -179,7 +179,7 @@ def main [
   14:number <- copy 36
   get-location 12:point-number/raw, 2:offset  # point-number occupies 3 locations but has only 2 fields; out of bounds
 ]
-+error: main: invalid offset 2 for point-number
++error: main: invalid offset 2 for 'point-number'
 
 :(scenario get_location_out_of_bounds_2)
 % Hide_errors = true;
@@ -189,7 +189,7 @@ def main [
   14:number <- copy 36
   get-location 12:point-number/raw, -1:offset
 ]
-+error: main: invalid offset -1 for point-number
++error: main: invalid offset -1 for 'point-number'
 
 :(scenario get_location_product_type_mismatch)
 % Hide_errors = true;
@@ -202,7 +202,7 @@ def main [
   13:boolean <- copy 0
   15:boolean <- get-location 12:boolbool, 1:offset
 ]
-+error: main: 'get-location 12:boolbool, 1:offset' should write to type location but 15 has type boolean
++error: main: 'get-location 12:boolbool, 1:offset' should write to type location but '15' has type 'boolean'
 
 :(scenario get_location_indirect)
 # 'get-location' can read from container address
@@ -260,11 +260,11 @@ put(Recipe_ordinal, "wait-for-routine", WAIT_FOR_ROUTINE);
 :(before "End Primitive Recipe Checks")
 case WAIT_FOR_ROUTINE: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'wait-for-routine' requires exactly one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'wait-for-routine' 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 'wait-for-routine' should be a routine id generated by 'start-running', but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'wait-for-routine' should be a routine id generated by 'start-running', but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   break;
@@ -272,7 +272,7 @@ case WAIT_FOR_ROUTINE: {
 :(before "End Primitive Recipe Implementations")
 case WAIT_FOR_ROUTINE: {
   if (ingredients.at(0).at(0) == Current_routine->id) {
-    raise << maybe(current_recipe_name()) << "routine can't wait for itself! " << to_original_string(current_instruction()) << '\n' << end();
+    raise << maybe(current_recipe_name()) << "routine can't wait for itself! '" << to_original_string(current_instruction()) << "'\n" << end();
     break;
   }
   Current_routine->state = WAITING;
diff --git a/075random.cc b/075random.cc
index 1992649b..32840457 100644
--- a/075random.cc
+++ b/075random.cc
@@ -36,11 +36,11 @@ put(Recipe_ordinal, "round", ROUND);
 :(before "End Primitive Recipe Checks")
 case ROUND: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'round' requires exactly one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'round' 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 'round' should be a number, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'round' should be a number, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   break;
diff --git a/078hash.cc b/078hash.cc
index ce63a87d..0d28d364 100644
--- a/078hash.cc
+++ b/078hash.cc
@@ -355,7 +355,7 @@ case HASH_OLD: {
     break;
   }
   if (!is_mu_string(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "'hash_old' currently only supports strings (address:array:character), but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'hash_old' currently only supports strings (address:array:character), but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   break;
diff --git a/080display.cc b/080display.cc
index 4f0f962e..49c6d071 100644
--- a/080display.cc
+++ b/080display.cc
@@ -100,22 +100,22 @@ put(Recipe_ordinal, "print-character-to-display", PRINT_CHARACTER_TO_DISPLAY);
 :(before "End Primitive Recipe Checks")
 case PRINT_CHARACTER_TO_DISPLAY: {
   if (inst.ingredients.empty()) {
-    raise << maybe(get(Recipe, r).name) << "'print-character-to-display' requires at least one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'print-character-to-display' requires at least 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 'print-character-to-display' should be a character, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'print-character-to-display' should be a character, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   if (SIZE(inst.ingredients) > 1) {
     if (!is_mu_number(inst.ingredients.at(1))) {
-      raise << maybe(get(Recipe, r).name) << "second ingredient of 'print-character-to-display' should be a foreground color number, but got " << inst.ingredients.at(1).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "second ingredient of 'print-character-to-display' should be a foreground color number, but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
       break;
     }
   }
   if (SIZE(inst.ingredients) > 2) {
     if (!is_mu_number(inst.ingredients.at(2))) {
-      raise << maybe(get(Recipe, r).name) << "third ingredient of 'print-character-to-display' should be a background color number, but got " << inst.ingredients.at(2).original_string << '\n' << end();
+      raise << maybe(get(Recipe, r).name) << "third ingredient of 'print-character-to-display' should be a background color number, but got '" << inst.ingredients.at(2).original_string << "'\n" << end();
       break;
     }
   }
@@ -186,15 +186,15 @@ put(Recipe_ordinal, "move-cursor-on-display", MOVE_CURSOR_ON_DISPLAY);
 :(before "End Primitive Recipe Checks")
 case MOVE_CURSOR_ON_DISPLAY: {
   if (SIZE(inst.ingredients) != 2) {
-    raise << maybe(get(Recipe, r).name) << "'move-cursor-on-display' requires two ingredients, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'move-cursor-on-display' requires two ingredients, 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 'move-cursor-on-display' should be a row number, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'move-cursor-on-display' should be a row number, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   if (!is_mu_number(inst.ingredients.at(1))) {
-    raise << maybe(get(Recipe, r).name) << "second ingredient of 'move-cursor-on-display' should be a column number, but got " << inst.ingredients.at(1).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second ingredient of 'move-cursor-on-display' should be a column number, but got '" << inst.ingredients.at(1).original_string << "'\n" << end();
     break;
   }
   break;
diff --git a/085scenario_console.cc b/085scenario_console.cc
index a6b3dfa3..c6321623 100644
--- a/085scenario_console.cc
+++ b/085scenario_console.cc
@@ -78,7 +78,7 @@ case ASSUME_CONSOLE: {
       else if (contains_key(Key, key))
         put(Memory, Current_routine->alloc+1, Key[key]);
       else
-        raise << "assume-console: can't press " << key << '\n' << end();
+        raise << "assume-console: can't press '" << key << "'\n" << end();
       if (get_or_insert(Memory, Current_routine->alloc+1) < 256)
         // these keys are in ascii
         put(Memory, Current_routine->alloc, /*tag for 'text' variant of 'event' exclusive-container*/0);
diff --git a/091run_interactive.cc b/091run_interactive.cc
index a28dd7e0..59c17312 100644
--- a/091run_interactive.cc
+++ b/091run_interactive.cc
@@ -30,11 +30,11 @@ put(Recipe_ordinal, "run-interactive", RUN_INTERACTIVE);
 :(before "End Primitive Recipe Checks")
 case RUN_INTERACTIVE: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'run-interactive' requires exactly one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'run-interactive' requires exactly one ingredient, but got '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   if (!is_mu_string(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'run-interactive' should be a string, but got " << to_string(inst.ingredients.at(0)) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'run-interactive' should be a string, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end();
     break;
   }
   break;
@@ -437,11 +437,11 @@ put(Recipe_ordinal, "reload", RELOAD);
 :(before "End Primitive Recipe Checks")
 case RELOAD: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'reload' requires exactly one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'reload' requires exactly one ingredient, but got '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   if (!is_mu_string(inst.ingredients.at(0))) {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'reload' should be a string, but got " << inst.ingredients.at(0).original_string << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'reload' should be a string, but got '" << inst.ingredients.at(0).original_string << "'\n" << end();
     break;
   }
   break;
diff --git a/092persist.cc b/092persist.cc
index 8894d463..e4838913 100644
--- a/092persist.cc
+++ b/092persist.cc
@@ -9,7 +9,7 @@ put(Recipe_ordinal, "restore", RESTORE);
 :(before "End Primitive Recipe Checks")
 case RESTORE: {
   if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'restore' requires exactly one ingredient, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'restore' requires exactly one ingredient, but got '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   string filename;
@@ -20,7 +20,7 @@ case RESTORE: {
     ;
   }
   else {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'restore' should be a string, but got " << to_string(inst.ingredients.at(0)) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'restore' should be a string, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end();
     break;
   }
   break;
@@ -73,7 +73,7 @@ put(Recipe_ordinal, "save", SAVE);
 :(before "End Primitive Recipe Checks")
 case SAVE: {
   if (SIZE(inst.ingredients) != 2) {
-    raise << maybe(get(Recipe, r).name) << "'save' requires exactly two ingredients, but got " << to_original_string(inst) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "'save' requires exactly two ingredients, but got '" << to_original_string(inst) << "'\n" << end();
     break;
   }
   if (is_literal_string(inst.ingredients.at(0))) {
@@ -83,11 +83,11 @@ case SAVE: {
     ;
   }
   else {
-    raise << maybe(get(Recipe, r).name) << "first ingredient of 'save' should be a string, but got " << to_string(inst.ingredients.at(0)) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "first ingredient of 'save' should be a string, but got '" << to_string(inst.ingredients.at(0)) << "'\n" << end();
     break;
   }
   if (!is_mu_string(inst.ingredients.at(1))) {
-    raise << maybe(get(Recipe, r).name) << "second ingredient of 'save' should be an address:array:character, but got " << to_string(inst.ingredients.at(1)) << '\n' << end();
+    raise << maybe(get(Recipe, r).name) << "second ingredient of 'save' should be an address:array:character, but got '" << to_string(inst.ingredients.at(1)) << "'\n" << end();
     break;
   }
   break;
diff --git a/edit/011-errors.mu b/edit/011-errors.mu
index a5bfdeb6..688ea5aa 100644
--- a/edit/011-errors.mu
+++ b/edit/011-errors.mu
@@ -135,9 +135,9 @@ recipe foo [
     .recipe foo [                                      ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .  get 123:number, foo:offset                      ┊                                                 .
     .]                                                 ┊                                                 .
-    .foo: unknown element foo in container number      ┊                                                 .
+    .foo: unknown element 'foo' in container 'number'  ┊                                                 .
     .foo: first ingredient of 'get' should be a contai↩┊                                                 .
-    .ner, but got 123:number                           ┊                                                 .
+    .ner, but got '123:number'                         ┊                                                 .
     .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊                                                 .
     .                                                  ┊                                                 .
   ]
@@ -147,9 +147,9 @@ recipe foo [
     .                                                                                                    .
     .                                                                                                    .
     .                                                                                                    .
-    .foo: unknown element foo in container number                                                        .
+    .foo: unknown element 'foo' in container 'number'                                                    .
     .foo: first ingredient of 'get' should be a contai                                                   .
-    .ner, but got 123:number                                                                             .
+    .ner, but got '123:number'                                                                           .
     .                                                                                                    .
   ]
 ]
@@ -262,7 +262,7 @@ z <- add x, y
     .load-ingredients                                  ┊0   edit          copy            delete         .
     .y:address:number <- copy 0                        ┊foo 2                                            .
     .z <- add x, y                                     ┊foo_2: 'add' requires number ingredients, but go↩.
-    .]                                                 ┊t y                                              .
+    .]                                                 ┊t 'y'                                            .
     .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  ┊                                                 .
   ]
@@ -281,7 +281,7 @@ z <- add x, y
     .load-ingredients                                  ┊0   edit          copy            delete         .
     .y:address:number <- copy 0                        ┊foo 2                                            .
     .z <- add x, y                                     ┊foo_3: 'add' requires number ingredients, but go↩.
-    .]                                                 ┊t y                                              .
+    .]                                                 ┊t 'y'                                            .
     .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  ┊                                                 .
   ]
@@ -368,7 +368,7 @@ recipe foo [
     .recipe foo [                                      ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .  x <- copy 0                                     ┊                                                 .
     .]                                                 ┊                                                 .
-    .foo: missing type for x in 'x <- copy 0'          ┊                                                 .
+    .foo: missing type for 'x' in 'x <- copy 0'        ┊                                                 .
   ]
 ]
 
@@ -427,7 +427,7 @@ recipe foo [
     .  get x:address:point, 1:offset                   ┊                                                 .
     .]                                                 ┊                                                 .
     .foo: first ingredient of 'get' should be a contai↩┊                                                 .
-    .ner, but got x:address:point                      ┊                                                 .
+    .ner, but got 'x:address:point'                    ┊                                                 .
     .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊                                                 .
     .                                                  ┊                                                 .
   ]
@@ -461,7 +461,7 @@ recipe foo [
     .  get *y:address:point, x:number                  ┊                                                 .
     .]                                                 ┊                                                 .
     .foo: second ingredient of 'get' should have type ↩┊                                                 .
-    .'offset', but got x:number                        ┊                                                 .
+    .'offset', but got 'x:number'                      ┊                                                 .
     .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊                                                 .
     .                                                  ┊                                                 .
   ]
@@ -489,7 +489,7 @@ recipe foo [
     .  local-scope                                     ┊                                                 .
     .  x:number <- copy y:number                       ┊                                                 .
     .]                                                 ┊                                                 .
-    .foo: use before set: y                            ┊                                                 .
+    .foo: use before set: 'y'                          ┊                                                 .
     .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊                                                 .
     .                                                  ┊                                                 .
   ]
@@ -507,7 +507,7 @@ recipe foo [
     .  local-scope                                     ┊                                                 .
     .  x:number <- copy y:number                       ┊                                                 .
     .]                                                 ┊                                                 .
-    .foo: use before set: y                            ┊                                                 .
+    .foo: use before set: 'y'                          ┊                                                 .
     .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊                                                 .
     .                                                  ┊                                                 .
   ]
@@ -535,9 +535,9 @@ scenario run-instruction-and-print-errors [
     .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  ┊0   edit          copy            delete         .
     .                                                  ┊get 1234:number, foo:offset                      .
-    .                                                  ┊unknown element foo in container number          .
+    .                                                  ┊unknown element 'foo' in container 'number'      .
     .                                                  ┊first ingredient of 'get' should be a container,↩.
-    .                                                  ┊ but got 1234:number                             .
+    .                                                  ┊ but got '1234:number'                           .
     .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  ┊                                                 .
   ]
@@ -557,9 +557,9 @@ scenario run-instruction-and-print-errors [
     .                                                                                                    .
     .                                                                                                    .
     .                                                                                                    .
-    .                                                   unknown element foo in container number          .
+    .                                                   unknown element 'foo' in container 'number'      .
     .                                                   first ingredient of 'get' should be a container, .
-    .                                                    but got 1234:number                             .
+    .                                                    but got '1234:number'                           .
     .                                                                                                    .
   ]
   screen-should-contain-in-color 245/grey, [
@@ -599,9 +599,9 @@ scenario run-instruction-and-print-errors-only-once [
     .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  ┊0   edit          copy            delete         .
     .                                                  ┊get 1234:number, foo:offset                      .
-    .                                                  ┊unknown element foo in container number          .
+    .                                                  ┊unknown element 'foo' in container 'number'      .
     .                                                  ┊first ingredient of 'get' should be a container,↩.
-    .                                                  ┊ but got 1234:number                             .
+    .                                                  ┊ but got '1234:number'                           .
     .                                                  ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  ┊                                                 .
   ]
diff --git a/sandbox/011-errors.mu b/sandbox/011-errors.mu
index 8dfedf96..fc1e99ed 100644
--- a/sandbox/011-errors.mu
+++ b/sandbox/011-errors.mu
@@ -145,14 +145,9 @@ def foo [
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .0   edit           copy           delete          .
     .foo                                               .
-    .foo: unknown element foo in container number      .
+    .foo: unknown element 'foo' in container 'number'  .
     .foo: first ingredient of 'get' should be a contai↩.
-    .ner, but got 123:number                           .
-    .foo: unknown element foo in container number      .
-    .foo: first ingredient of 'get' should be a contai↩.
-    .ner, but got 123:number                           .
-    .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
-    .                                                  .
+    .ner, but got '123:number'                         .
   ]
   screen-should-contain-in-color 1/red, [
     .  errors found                                    .
@@ -264,7 +259,7 @@ z <- add x, y
     .0   edit           copy           delete          .
     .foo 2                                             .
     .foo_2: 'add' requires number ingredients, but got↩.
-    . y                                                .
+    . 'y'                                              .
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  .
   ]
@@ -283,7 +278,7 @@ z <- add x, y
     .0   edit           copy           delete          .
     .foo 2                                             .
     .foo_3: 'add' requires number ingredients, but got↩.
-    . y                                                .
+    . 'y'                                              .
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  .
   ]
@@ -358,12 +353,7 @@ def foo [
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .0   edit           copy           delete          .
     .foo                                               .
-    .foo: missing type for x in 'x <- copy 0'          .
-    .foo: can't copy 0 to x; types don't match         .
-    .foo: missing type for x in 'x <- copy 0'          .
-    .foo: can't copy 0 to x; types don't match         .
-    .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
-    .                                                  .
+    .foo: missing type for 'x' in 'x <- copy 0'        .
   ]
 ]
 
@@ -372,7 +362,7 @@ scenario run-shows-unbalanced-bracket-errors [
   assume-screen 50/width, 20/height
   # recipe is incomplete (unbalanced '[')
   1:address:array:character <- new [ 
-def foo «
+recipe foo «
   x <- copy 0
 ]
   replace 1:address:array:character, 171/«, 91  # '['
@@ -421,7 +411,7 @@ def foo [
     .0   edit           copy           delete          .
     .foo                                               .
     .foo: first ingredient of 'get' should be a contai↩.
-    .ner, but got x:address:point                      .
+    .ner, but got 'x:address:point'                    .
   ]
 ]
 
@@ -450,7 +440,7 @@ def foo [
     .0   edit           copy           delete          .
     .foo                                               .
     .foo: second ingredient of 'get' should have type ↩.
-    .'offset', but got x:number                        .
+    .'offset', but got 'x:number'                      .
   ]
 ]
 
@@ -475,7 +465,7 @@ def foo [
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .0   edit           copy           delete          .
     .foo                                               .
-    .foo: use before set: y                            .
+    .foo: use before set: 'y'                          .
   ]
   # rerun the file, check for the same error
   assume-console [
@@ -490,7 +480,7 @@ def foo [
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .0   edit           copy           delete          .
     .foo                                               .
-    .foo: use before set: y                            .
+    .foo: use before set: 'y'                          .
   ]
 ]
 
@@ -512,7 +502,7 @@ scenario run-instruction-and-print-errors [
     .0   edit           copy           delete          .
     .get 1:address:point, 1:offset                     .
     .first ingredient of 'get' should be a container, ↩.
-    .but got 1:address:point                           .
+    .but got '1:address:point'                         .
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  .
   ]
@@ -523,7 +513,7 @@ scenario run-instruction-and-print-errors [
     .                                                  .
     .                                                  .
     .first ingredient of 'get' should be a container,  .
-    .but got 1:address:point                           .
+    .but got '1:address:point'                         .
     .                                                  .
     .                                                  .
   ]
@@ -550,9 +540,9 @@ scenario run-instruction-and-print-errors-only-once [
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .0   edit           copy           delete          .
     .get 1234:number, foo:offset                       .
-    .unknown element foo in container number           .
+    .unknown element 'foo' in container 'number'       .
     .first ingredient of 'get' should be a container, ↩.
-    .but got 1234:number                               .
+    .but got '1234:number'                             .
     .━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  .
   ]