diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-09-28 23:36:39 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-09-28 23:36:39 -0700 |
commit | bb58e1797e8a813891d2ba8ceabcfb518c6f8050 (patch) | |
tree | 38ac76c87f12339766189621db31ec01017d9539 /023boolean.cc | |
parent | 86a6c9cd8952b4600f648519a64a86156d1a3e10 (diff) | |
download | mu-bb58e1797e8a813891d2ba8ceabcfb518c6f8050.tar.gz |
2214
Diffstat (limited to '023boolean.cc')
-rw-r--r-- | 023boolean.cc | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/023boolean.cc b/023boolean.cc new file mode 100644 index 00000000..ead678cf --- /dev/null +++ b/023boolean.cc @@ -0,0 +1,123 @@ +//: Boolean primitives + +:(before "End Primitive Recipe Declarations") +AND, +:(before "End Primitive Recipe Numbers") +Recipe_ordinal["and"] = AND; +:(before "End Primitive Recipe Implementations") +case AND: { + bool result = true; + for (long long int i = 0; i < SIZE(ingredients); ++i) { + if (!scalar(ingredients.at(i))) { + raise << current_recipe_name() << ": 'and' requires boolean ingredients, but got " << current_instruction().ingredients.at(i).original_string << '\n' << end(); + goto finish_instruction; + } + result = result && ingredients.at(i).at(0); + } + products.resize(1); + products.at(0).push_back(result); + break; +} + +:(scenario and) +recipe main [ + 1:boolean <- copy 1 + 2:boolean <- copy 0 + 3:boolean <- and 1:boolean, 2:boolean +] ++mem: storing 0 in location 3 + +:(scenario and_2) +recipe main [ + 1:boolean <- and 1, 1 +] ++mem: storing 1 in location 1 + +:(scenario and_multiple) +recipe main [ + 1:boolean <- and 1, 1, 0 +] ++mem: storing 0 in location 1 + +:(scenario and_multiple_2) +recipe main [ + 1:boolean <- and 1, 1, 1 +] ++mem: storing 1 in location 1 + +:(before "End Primitive Recipe Declarations") +OR, +:(before "End Primitive Recipe Numbers") +Recipe_ordinal["or"] = OR; +:(before "End Primitive Recipe Implementations") +case OR: { + bool result = false; + for (long long int i = 0; i < SIZE(ingredients); ++i) { + if (!scalar(ingredients.at(i))) { + raise << current_recipe_name() << ": 'or' requires boolean ingredients, but got " << current_instruction().ingredients.at(i).original_string << '\n' << end(); + goto finish_instruction; + } + result = result || ingredients.at(i).at(0); + } + products.resize(1); + products.at(0).push_back(result); + break; +} + +:(scenario or) +recipe main [ + 1:boolean <- copy 1 + 2:boolean <- copy 0 + 3:boolean <- or 1:boolean, 2:boolean +] ++mem: storing 1 in location 3 + +:(scenario or_2) +recipe main [ + 1:boolean <- or 0, 0 +] ++mem: storing 0 in location 1 + +:(scenario or_multiple) +recipe main [ + 1:boolean <- and 0, 0, 0 +] ++mem: storing 0 in location 1 + +:(scenario or_multiple_2) +recipe main [ + 1:boolean <- or 0, 0, 1 +] ++mem: storing 1 in location 1 + +:(before "End Primitive Recipe Declarations") +NOT, +:(before "End Primitive Recipe Numbers") +Recipe_ordinal["not"] = NOT; +:(before "End Primitive Recipe Implementations") +case NOT: { + products.resize(SIZE(ingredients)); + for (long long int i = 0; i < SIZE(ingredients); ++i) { + if (!scalar(ingredients.at(i))) { + raise << current_recipe_name() << ": 'not' requires boolean ingredients, but got " << current_instruction().ingredients.at(i).original_string << '\n' << end(); + goto finish_instruction; + } + products.at(i).push_back(!ingredients.at(i).at(0)); + } + break; +} + +:(scenario not) +recipe main [ + 1:boolean <- copy 1 + 2:boolean <- not 1:boolean +] ++mem: storing 0 in location 2 + +:(scenario not_multiple) +recipe main [ + 1:boolean, 2:boolean, 3:boolean <- not 1, 0, 1 +] ++mem: storing 0 in location 1 ++mem: storing 1 in location 2 ++mem: storing 0 in location 3 |