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-19 16:32:00 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-02-19 16:32:05 -0800
commitc1a50c82b85825c07b58ce5e4f3a1d5433cae5dd (patch)
treeb80292093b7743eade48187c130e6f7aa05004bc /cpp/012run
parent79a7ad4f8c67f7de7d2e478aa7c62d39f8f62f6f (diff)
downloadmu-c1a50c82b85825c07b58ce5e4f3a1d5433cae5dd.tar.gz
787 - arithmetic operations
Lots of duplication here; we'll clean it up later.
Diffstat (limited to 'cpp/012run')
-rw-r--r--cpp/012run206
1 files changed, 204 insertions, 2 deletions
diff --git a/cpp/012run b/cpp/012run
index 2b14fd4b..abbe954a 100644
--- a/cpp/012run
+++ b/cpp/012run
@@ -13,8 +13,8 @@ recipe main [
   2:integer <- copy 1:integer
 ]
 +run: instruction 1
++run: ingredient 0 is 1
 +mem: location 1 is 23
-+run: ingredient 0 is 23
 +mem: storing in location 2
 
 :(code)
@@ -29,12 +29,14 @@ void run(recipe_number r) {
   for (n = 0, p = instructions.begin(); p != instructions.end(); ++p, ++n) {
     trace("run") << "instruction " << n;
     switch (p->operation) {
+    // Primitive Recipe Implementations.
     case 1: {  // copy
+      trace("run") << "ingredient 0 is " << p->ingredients[0].name;
       vector<int> data = read_memory(p->ingredients[0]);
-      trace("run") << "ingredient 0 is " << data[0];
       write_memory(p->products[0], data);
       break;
     }
+    // End Primitive Recipe Implementations.
     default:
       raise << "undefined operation " << p->operation;
     }
@@ -59,6 +61,206 @@ void write_memory(reagent x, vector<int> data) {
   Memory[dest] = data[0];
 }
 
+:(before "End Primitive Recipe Numbers")
+// Arithmetic ops.
+Recipe_number["add"] = 2;
+Next_recipe_number++;
+Recipe_number["subtract"] = 3;
+Next_recipe_number++;
+Recipe_number["multiply"] = 4;
+Next_recipe_number++;
+Recipe_number["divide"] = 5;
+Next_recipe_number++;
+Recipe_number["divide_with_remainder"] = 6;
+Next_recipe_number++;
+:(before "End Primitive Recipe Implementations")
+  case 2: {  // add
+    trace("run") << "ingredient 0 is " << p->ingredients[0].name;
+    vector<int> arg0 = read_memory(p->ingredients[0]);
+    assert(arg0.size() == 1);
+    trace("run") << "ingredient 1 is " << p->ingredients[1].name;
+    vector<int> arg1 = read_memory(p->ingredients[1]);
+    assert(arg1.size() == 1);
+    vector<int> result;
+    result.push_back(arg0[0]+arg1[0]);
+    trace("run") << "product 0 is " << result[0];
+    write_memory(p->products[0], result);
+    break;
+  }
+  case 3: {  // subtract
+    trace("run") << "ingredient 0 is " << p->ingredients[0].name;
+    vector<int> arg0 = read_memory(p->ingredients[0]);
+    assert(arg0.size() == 1);
+    trace("run") << "ingredient 1 is " << p->ingredients[1].name;
+    vector<int> arg1 = read_memory(p->ingredients[1]);
+    assert(arg1.size() == 1);
+    vector<int> result;
+    result.push_back(arg0[0]-arg1[0]);
+    trace("run") << "product 0 is " << result[0];
+    write_memory(p->products[0], result);
+    break;
+  }
+  case 4: {  // multiply
+    trace("run") << "ingredient 0 is " << p->ingredients[0].name;
+    vector<int> arg0 = read_memory(p->ingredients[0]);
+    assert(arg0.size() == 1);
+    trace("run") << "ingredient 1 is " << p->ingredients[1].name;
+    vector<int> arg1 = read_memory(p->ingredients[1]);
+    assert(arg1.size() == 1);
+    trace("run") << "ingredient 1 is " << arg1[0];
+    vector<int> result;
+    result.push_back(arg0[0]*arg1[0]);
+    trace("run") << "product 0 is " << result[0];
+    write_memory(p->products[0], result);
+    break;
+  }
+  case 5: {  // divide
+    trace("run") << "ingredient 0 is " << p->ingredients[0].name;
+    vector<int> arg0 = read_memory(p->ingredients[0]);
+    assert(arg0.size() == 1);
+    trace("run") << "ingredient 1 is " << p->ingredients[1].name;
+    vector<int> arg1 = read_memory(p->ingredients[1]);
+    assert(arg1.size() == 1);
+    trace("run") << "ingredient 1 is " << arg1[0];
+    vector<int> result;
+    result.push_back(arg0[0]/arg1[0]);
+    trace("run") << "product 0 is " << result[0];
+    write_memory(p->products[0], result);
+    break;
+  }
+  case 6: {  // divide_with_remainder
+    trace("run") << "ingredient 0 is " << p->ingredients[0].name;
+    vector<int> arg0 = read_memory(p->ingredients[0]);
+    assert(arg0.size() == 1);
+    trace("run") << "ingredient 1 is " << p->ingredients[1].name;
+    vector<int> arg1 = read_memory(p->ingredients[1]);
+    assert(arg1.size() == 1);
+    vector<int> result0;
+    result0.push_back(arg0[0]/arg1[0]);
+    trace("run") << "product 0 is " << result0[0];
+    write_memory(p->products[0], result0);
+    vector<int> result1;
+    result1.push_back(arg0[0]%arg1[0]);
+    trace("run") << "product 1 is " << result1[0];
+    write_memory(p->products[1], result1);
+    break;
+  }
+:(scenario "add_literal")
+recipe main [
+  1:integer <- add 23:literal, 34:literal
+]
++run: instruction 0
++run: ingredient 0 is 23
++run: ingredient 1 is 34
++run: product 0 is 57
++mem: storing in location 1
+:(scenario "add")
+recipe main [
+  1:integer <- copy 23:literal
+  2:integer <- copy 34:literal
+  3:integer <- add 1:integer, 2:integer
+]
++run: instruction 2
++run: ingredient 0 is 1
++mem: location 1 is 23
++run: ingredient 1 is 2
++mem: location 2 is 34
++run: product 0 is 57
++mem: storing in location 3
+:(scenario "subtract_literal")
+recipe main [
+  1:integer <- subtract 5:literal, 2:literal
+]
++run: instruction 0
++run: ingredient 0 is 5
++run: ingredient 1 is 2
++run: product 0 is 3
++mem: storing in location 1
+:(scenario "subtract")
+recipe main [
+  1:integer <- copy 23:literal
+  2:integer <- copy 34:literal
+  3:integer <- subtract 1:integer, 2:integer
+]
++run: instruction 2
++run: ingredient 0 is 1
++mem: location 1 is 23
++run: ingredient 1 is 2
++mem: location 2 is 34
++run: product 0 is -11
++mem: storing in location 3
+:(scenario "multiply_literal")
+recipe main [
+  1:integer <- multiply 2:literal, 3:literal
+]
++run: instruction 0
++run: ingredient 0 is 2
++run: ingredient 1 is 3
++run: product 0 is 6
++mem: storing in location 1
+:(scenario "multiply")
+recipe main [
+  1:integer <- copy 4:literal
+  2:integer <- copy 6:literal
+  3:integer <- multiply 1:integer, 2:integer
+]
++run: instruction 2
++run: ingredient 0 is 1
++mem: location 1 is 4
++run: ingredient 1 is 2
++mem: location 2 is 6
++run: product 0 is 24
++mem: storing in location 3
+:(scenario "divide_literal")
+recipe main [
+  1:integer <- divide 8:literal, 2:literal
+]
++run: instruction 0
++run: ingredient 0 is 8
++run: ingredient 1 is 2
++run: product 0 is 4
++mem: storing in location 1
+:(scenario "divide")
+recipe main [
+  1:integer <- copy 27:literal
+  2:integer <- copy 3:literal
+  3:integer <- divide 1:integer, 2:integer
+]
++run: instruction 2
++run: ingredient 0 is 1
++mem: location 1 is 27
++run: ingredient 1 is 2
++mem: location 2 is 3
++run: product 0 is 9
++mem: storing in location 3
+:(scenario "divide_with_remainder_literal")
+recipe main [
+  1:integer, 2:integer <- divide_with_remainder 9:literal, 2:literal
+]
++run: instruction 0
++run: ingredient 0 is 9
++run: ingredient 1 is 2
++run: product 0 is 4
++mem: storing in location 1
++run: product 1 is 1
++mem: storing in location 2
+:(scenario "divide_with_remainder")
+recipe main [
+  1:integer <- copy 27:literal
+  2:integer <- copy 11:literal
+  3:integer, 4:integer <- divide_with_remainder 1:integer, 2:integer
+]
++run: instruction 2
++run: ingredient 0 is 1
++mem: location 1 is 27
++run: ingredient 1 is 2
++mem: location 2 is 11
++run: product 0 is 2
++mem: storing in location 3
++run: product 1 is 5
++mem: storing in location 4
+
+:(code)
 int to_int(string n) {
   char* end = NULL;
   int result = strtol(n.c_str(), &end, /*any base*/0);