diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-03-30 23:15:03 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-03-30 23:15:03 -0700 |
commit | 5e21a9f608f413eb1df4736f4c143f18ba7ac1ec (patch) | |
tree | 4ce5578f8678c50116d2bab7bc7e62ef4ec99b55 /cpp/029string | |
parent | 088665eff883b5bc28022800aed27f6af468a4ba (diff) | |
download | mu-5e21a9f608f413eb1df4736f4c143f18ba7ac1ec.tar.gz |
998 - convenient string initialization
Diffstat (limited to 'cpp/029string')
-rw-r--r-- | cpp/029string | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/cpp/029string b/cpp/029string index fd6b2824..209a1e7f 100644 --- a/cpp/029string +++ b/cpp/029string @@ -1,6 +1,13 @@ +//: Some instructions can take string literals for convenience. +//: +//: Instead of quotes, we'll use [] to delimit strings. That'll reduce the +//: need for escaping. And we can also imagine that 'recipe' might one day +//: itself be defined in mu, doing its own parsing. + +//: First extend the mu parser to support string literals. :(scenario "string_literal") recipe main [ - s:address:array:character <- new [abc def] + 1:address:array:character <- new [abc def] ] +parse: ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]} @@ -27,3 +34,30 @@ string slurp_quoted(istream& in) { } return out.str(); } + +//: Next, extend 'new' to handle a string literal argument. +:(scenario "new_string") +recipe main [ + 1:address:array:character <- new [abc def] + 2:character <- index 1:address:array:character/deref, 5:literal +] +# integer code for 'e' ++mem: storing 101 in location 2 + +:(before "End Mu Types Initialization") +Type_number["character"] = Next_type_number++; + +:(after "case NEW" following "Primitive Recipe Implementations") +if (instructions[pc].ingredients[0].properties[0].second[0] == "literal-string") { + // allocate an array just large enough for it + vector<int> result; + result.push_back(Current_routine.alloc); + write_memory(instructions[pc].products[0], result); + // assume that all characters fit in a single location + Memory[Current_routine.alloc++] = instructions[0].name.size(); + for (size_t i = 0; i < instructions[pc].ingredients[0].name.size(); ++i) { + Memory[Current_routine.alloc++] = instructions[pc].ingredients[0].name[i]; + } + // mu strings are not null-terminated in memory + break; +} |