diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-09-12 21:02:38 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-09-12 21:02:38 -0700 |
commit | db01afa844004406da3a6ab9b306219c807e057e (patch) | |
tree | dd74fb6acbb9f5163c8be10b8c6cea9d1295b390 | |
parent | e309b9e82ded3ece3985a214cbd432b45de1ba4d (diff) | |
download | mu-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.cc | 23 | ||||
-rw-r--r-- | 059to_text.mu | 31 | ||||
-rw-r--r-- | 061text.mu | 15 | ||||
-rw-r--r-- | 062rewrite_stash.cc | 20 |
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; -} |