diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-04-19 20:49:30 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-04-19 20:49:30 -0700 |
commit | 717ab65913f1585221632303f0ab53ac42d4b348 (patch) | |
tree | 645e537eea155ff2221ace71f80924a66c92116a /cpp/036call_ingredient | |
parent | e4a97d87a17a8edc5a2049bdc21143695d20dcfc (diff) | |
download | mu-717ab65913f1585221632303f0ab53ac42d4b348.tar.gz |
1105 - more primitives for managing ingredients
Diffstat (limited to 'cpp/036call_ingredient')
-rw-r--r-- | cpp/036call_ingredient | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/cpp/036call_ingredient b/cpp/036call_ingredient index 9f156d65..f71be902 100644 --- a/cpp/036call_ingredient +++ b/cpp/036call_ingredient @@ -62,3 +62,68 @@ case NEXT_INGREDIENT: { } break; } + +:(scenario "rewind_ingredients") +recipe main [ + f 2:literal +] +recipe f [ + 12:integer <- next-ingredient # consume ingredient + _, 1:boolean <- next-ingredient # will not find any ingredients + rewind-ingredients + 13:integer, 2:boolean <- next-ingredient # will find ingredient again +] ++mem: storing 2 in location 12 ++mem: storing 0 in location 1 ++mem: storing 2 in location 13 ++mem: storing 1 in location 2 + +:(before "End Primitive Recipe Declarations") +REWIND_INGREDIENTS, +:(before "End Primitive Recipe Numbers") +Recipe_number["rewind-ingredients"] = REWIND_INGREDIENTS; +:(before "End Primitive Recipe Implementations") +case REWIND_INGREDIENTS: { + rr.calls.top().next_ingredient_to_process = 0; + break; +} + +:(scenario "ingredient") +recipe main [ + f 1:literal, 2:literal +] +recipe f [ + 12:integer <- ingredient 1:literal # consume second ingredient first + 13:integer, 1:boolean <- next-ingredient # next-ingredient tries to scan past that +] ++mem: storing 2 in location 12 ++mem: storing 0 in location 1 + +:(before "End Primitive Recipe Declarations") +INGREDIENT, +:(before "End Primitive Recipe Numbers") +Recipe_number["ingredient"] = INGREDIENT; +:(before "End Primitive Recipe Implementations") +case INGREDIENT: { + if (static_cast<size_t>(instructions[pc].ingredients[0].value) < rr.calls.top().ingredient_atoms.size()) { + rr.calls.top().next_ingredient_to_process = instructions[pc].ingredients[0].value; + trace("run") << "product 0 is " + << rr.calls.top().ingredient_atoms[rr.calls.top().next_ingredient_to_process][0]; + write_memory(instructions[pc].products[0], + rr.calls.top().ingredient_atoms[rr.calls.top().next_ingredient_to_process]); + if (instructions[pc].products.size() > 1) { + vector<int> ingredient_exists; + ingredient_exists.push_back(1); + write_memory(instructions[pc].products[1], ingredient_exists); + } + ++rr.calls.top().next_ingredient_to_process; + } + else { + if (instructions[pc].products.size() > 1) { + vector<int> no_ingredient; + no_ingredient.push_back(0); + write_memory(instructions[pc].products[1], no_ingredient); + } + } + break; +} |