:(scenarios run) :(scenario copy_literal) recipe main [ 1:integer <- copy 23:literal ] +run: instruction 0 +run: ingredient 0 is 23 +mem: storing in location 1 :(scenario copy) recipe main [ 1:integer <- copy 23:literal 2:integer <- copy 1:integer ] +run: instruction 1 +run: ingredient 0 is 1 +mem: location 1 is 23 +mem: storing in location 2 :(code) void run(string form) { run(add_recipe(form)); } void run(recipe_number r) { vector& instructions(Recipe[r].steps); int n = 0; vector::iterator p; for (n = 0, p = instructions.begin(); p != instructions.end(); ++p, ++n) { trace("run") << "instruction " << n; switch (p->operation) { // Primitive Recipe Implementations. case COPY: { trace("run") << "ingredient 0 is " << p->ingredients[0].name; vector data = read_memory(p->ingredients[0]); write_memory(p->products[0], data); break; } // End Primitive Recipe Implementations. default: raise << "undefined operation " << p->operation; } } } vector read_memory(reagent x) { vector result; if (x.types[0] == 0) { // literal result.push_back(to_int(x.name)); return result; } int val = Memory[to_int(x.name)]; trace("mem") << "location " << x.name << " is " << val; result.push_back(val); return result; } void write_memory(reagent x, vector data) { int dest = to_int(x.name); trace("mem") << "storing in location " << dest; Memory[dest] = data[0]; } :(code) int to_int(string n) { char* end = NULL; int result = strtol(n.c_str(), &end, /*any base*/0); assert(*end == '\0'); return result; }