diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-03-15 09:49:23 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-03-15 09:49:27 -0700 |
commit | 69f04c3fb0136778b80f7f64e16ae37cf8d22907 (patch) | |
tree | 0415cc7fea88ecf37f98cdc265e24ec93298d2a9 /cpp/022call_reply | |
parent | ec92602746894c81990a37d7a5e5d7f14a518f0e (diff) | |
download | mu-69f04c3fb0136778b80f7f64e16ae37cf8d22907.tar.gz |
929 - recipes again take ingredients and reply with results
Diffstat (limited to 'cpp/022call_reply')
-rw-r--r-- | cpp/022call_reply | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/cpp/022call_reply b/cpp/022call_reply new file mode 100644 index 00000000..0d0149cb --- /dev/null +++ b/cpp/022call_reply @@ -0,0 +1,39 @@ +// Calls can also generate results, using 'reply'. +:(scenario "reply") +recipe main [ + 3:integer, 4:integer <- f 2:literal +] +recipe f [ + 12:integer <- next_ingredient + 13:integer <- add 1:literal, 12:integer + reply 12:integer, 13:integer +] ++run: instruction main/0 ++run: result 0 is 1[2...] ++mem: storing in location 3 ++run: result 1 is 1[3...] ++mem: storing in location 4 + +:(before "End Globals") +const int REPLY = 23; +:(before "End Primitive Recipe Numbers") +Recipe_number["reply"] = REPLY; +assert(Next_recipe_number == REPLY); +Next_recipe_number++; +:(before "End Primitive Recipe Implementations") +case REPLY: { + vector<vector<int> > callee_results; + for (size_t i = 0; i < instructions[pc].ingredients.size(); ++i) { + callee_results.push_back(read_memory(instructions[pc].ingredients[i])); + } + rr.calls.pop(); + size_t& caller_pc = rr.calls.top().pc; + instruction& caller_instruction = Recipe[rr.calls.top().running_recipe].steps[caller_pc]; + assert(caller_instruction.products.size() <= callee_results.size()); + for (size_t i = 0; i < caller_instruction.products.size(); ++i) { + trace("run") << "result " << i << " is " << callee_results[i].size() << "[" << callee_results[i][0] << "...]"; + write_memory(caller_instruction.products[i], callee_results[i]); + } + ++caller_pc; + break; +} |