about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-09-12 21:02:38 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-09-12 21:02:38 -0700
commitdb01afa844004406da3a6ab9b306219c807e057e (patch)
treedd74fb6acbb9f5163c8be10b8c6cea9d1295b390
parente309b9e82ded3ece3985a214cbd432b45de1ba4d (diff)
downloadmu-db01afa844004406da3a6ab9b306219c807e057e.tar.gz
3343
Reorganize layers a bit so I can add a couple of scenarios testing
static dispatch *before* I add `stash` into the mix.
-rw-r--r--058to_text.cc23
-rw-r--r--059to_text.mu31
-rw-r--r--061text.mu15
-rw-r--r--062rewrite_stash.cc20
4 files changed, 54 insertions, 35 deletions
diff --git a/058to_text.cc b/058to_text.cc
new file mode 100644
index 00000000..75a6b295
--- /dev/null
+++ b/058to_text.cc
@@ -0,0 +1,23 @@
+//: Primitive to convert any type to text (array of characters).
+//: Later layers will allow us to override this to do something smarter for
+//: specific types.
+
+:(before "End Primitive Recipe Declarations")
+TO_TEXT,
+:(before "End Primitive Recipe Numbers")
+put(Recipe_ordinal, "to-text", TO_TEXT);
+:(before "End Primitive Recipe Checks")
+case TO_TEXT: {
+  if (SIZE(inst.ingredients) != 1) {
+    raise << maybe(get(Recipe, r).name) << "'to-text' requires a single ingredient, but got '" << inst.original_string << "'\n" << end();
+    break;
+  }
+  // can handle any type
+  break;
+}
+:(before "End Primitive Recipe Implementations")
+case TO_TEXT: {
+  products.resize(1);
+  products.at(0).push_back(new_mu_string(print_mu(current_instruction().ingredients.at(0), ingredients.at(0))));
+  break;
+}
diff --git a/059to_text.mu b/059to_text.mu
new file mode 100644
index 00000000..25d5f55a
--- /dev/null
+++ b/059to_text.mu
@@ -0,0 +1,31 @@
+# A couple of variants of `to-text` that we'll use implicitly in stashes (see
+# later layers).
+#
+# Mu code might specialize them to be smarter, but I don't anticipate any need
+# beyond specializing `to-text` itself.
+
+# 'shorter' variant of to-text, when you want to enable some sort of trimming
+# define it to be identical to 'to-text' by default
+def to-text-line x:_elem -> y:address:array:character [
+  local-scope
+  load-ingredients
+  y <- to-text x
+]
+
+# variant for arrays (since we can't pass them around otherwise)
+def array-to-text-line x:address:array:_elem -> y:address:array:character [
+  local-scope
+  load-ingredients
+  y <- to-text *x
+]
+
+scenario to-text-line-early-warning-for-static-dispatch [
+  x:address:array:character <- to-text-line 34
+  # just ensure there were no errors
+]
+
+scenario array-to-text-line-early-warning-for-static-dispatch [
+  n:address:array:number <- new number:type, 3
+  x:address:array:character <- array-to-text-line n
+  # just ensure there were no errors
+]
diff --git a/061text.mu b/061text.mu
index 2fa60f1c..5e3f798a 100644
--- a/061text.mu
+++ b/061text.mu
@@ -1,21 +1,6 @@
 # Some useful helpers for dealing with text (arrays of characters)
 type text = address:array:character
 
-# to-text-line gets called implicitly in various places
-# define it to be identical to 'to-text' by default
-def to-text-line x:_elem -> y:address:array:character [
-  local-scope
-  load-ingredients
-  y <- to-text x
-]
-
-# variant for arrays (since we can't pass them around otherwise)
-def array-to-text-line x:address:array:_elem -> y:address:array:character [
-  local-scope
-  load-ingredients
-  y <- to-text *x
-]
-
 def equal a:text, b:text -> result:boolean [
   local-scope
   load-ingredients
diff --git a/062rewrite_stash.cc b/062rewrite_stash.cc
index 7ef0f38c..92a885e2 100644
--- a/062rewrite_stash.cc
+++ b/062rewrite_stash.cc
@@ -144,23 +144,3 @@ recipe main [
   stash x
 ]
 +app: 34 35
-
-:(before "End Primitive Recipe Declarations")
-TO_TEXT,
-:(before "End Primitive Recipe Numbers")
-put(Recipe_ordinal, "to-text", TO_TEXT);
-:(before "End Primitive Recipe Checks")
-case TO_TEXT: {
-  if (SIZE(inst.ingredients) != 1) {
-    raise << maybe(get(Recipe, r).name) << "'to-text' requires a single ingredient, but got '" << inst.original_string << "'\n" << end();
-    break;
-  }
-  // can handle any type
-  break;
-}
-:(before "End Primitive Recipe Implementations")
-case TO_TEXT: {
-  products.resize(1);
-  products.at(0).push_back(new_mu_string(print_mu(current_instruction().ingredients.at(0), ingredients.at(0))));
-  break;
-}