about summary refs log tree commit diff stats
path: root/cpp/012run
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-02-18 14:48:19 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-02-18 14:48:19 -0800
commit01b2852b653a81c4d5e197a0c52659c7e0dcaf5f (patch)
tree9c9864846c27191afd73b4c1a44810ac0fdd1091 /cpp/012run
parent9fc64bbc95bb4e55f28f5262d0f5c660177f0a19 (diff)
downloadmu-01b2852b653a81c4d5e197a0c52659c7e0dcaf5f.tar.gz
782 - promote literate version to canonical C++ version
Diffstat (limited to 'cpp/012run')
-rw-r--r--cpp/012run41
1 files changed, 41 insertions, 0 deletions
diff --git a/cpp/012run b/cpp/012run
new file mode 100644
index 00000000..f7b5469a
--- /dev/null
+++ b/cpp/012run
@@ -0,0 +1,41 @@
+:(scenarios run)
+:(scenario copy_literal)
+recipe main [
+  1:integer <- copy 23:literal
+]
++run: instruction 0
++run:   ingredient 23
++mem:   storing in location 1
+
+:(code)
+void run(string form) {
+  run(add_recipe(form));
+}
+
+void run(recipe_number r) {
+  vector<instruction>& instructions(Recipe[r].steps);
+  int n = 0;
+  vector<instruction>::iterator p;
+  for (n = 0, p = instructions.begin(); p != instructions.end(); ++p, ++n) {
+    trace("run") << "instruction " << n;
+    switch (p->operation) {
+    case 1: {  // copy
+      int arg = to_int(p->ingredients[0].name);
+      trace("run") << "  ingredient " << arg;
+      int dest = to_int(p->products[0].name);
+      trace("mem") << "  storing in location " << dest;
+      Memory[dest] = arg;
+      break;
+    }
+    default:
+      raise << "undefined operation " << p->operation;
+    }
+  }
+}
+
+int to_int(string n) {
+  char* end = NULL;
+  int result = strtol(n.c_str(), &end, /*any base*/0);
+  assert(*end == '\0');
+  return result;
+}