// 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 > 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; }