about summary refs log tree commit diff stats
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/019address35
-rw-r--r--cpp/020array4
2 files changed, 8 insertions, 31 deletions
diff --git a/cpp/019address b/cpp/019address
index a642ceb1..07487499 100644
--- a/cpp/019address
+++ b/cpp/019address
@@ -12,24 +12,8 @@ recipe main [
 +mem: location 2 is 34
 +mem: storing 34 in location 3
 
-:(replace{} "vector<int> read_memory(reagent x)")
-vector<int> read_memory(reagent x) {
-  vector<int> result;
-  if (isa_literal(x)) {
-    result.push_back(x.value);
-    return result;
-  }
-  x = canonize(x);
-  int base = x.value;
-//?   cout << "base: " << base << '\n'; //? 1
-  size_t size = size_of(x);
-  for (size_t offset = 0; offset < size; ++offset) {
-    int val = Memory[base+offset];
-    trace("mem") << "location " << base+offset << " is " << val;
-    result.push_back(val);
-  }
-  return result;
-}
+:(before "int base = x.value" following "vector<int> read_memory(reagent x)")
+x = canonize(x);
 
 //: similarly, write to addresses pointing at other locations using the
 //: 'deref' property
@@ -42,19 +26,8 @@ recipe main [
 +mem: location 1 is 2
 +mem: storing 34 in location 2
 
-:(replace{} "void write_memory(reagent x, vector<int> data)")
-void write_memory(reagent x, vector<int> data) {
-  if (x.name == "_") return;  // dummy results are never stored
-  x = canonize(x);
-//?   cout << x.to_string() << '\n'; //? 1
-  int base = x.value;
-  if (!Type[x.types[0]].is_array && size_of(x) != data.size())
-    raise << "size mismatch in storing to " << x.to_string();
-  for (size_t offset = 0; offset < data.size(); ++offset) {
-    trace("mem") << "storing " << data[offset] << " in location " << base+offset;
-    Memory[base+offset] = data[offset];
-  }
-}
+:(before "int base = x.value" following "void write_memory(reagent x, vector<int> data)")
+x = canonize(x);
 
 :(code)
 reagent canonize(reagent x) {
diff --git a/cpp/020array b/cpp/020array
index aafeacf8..96591366 100644
--- a/cpp/020array
+++ b/cpp/020array
@@ -6,6 +6,10 @@ Type[integer_array].is_array = true;
 Type[integer_array].element.push_back(integer);
 Type[integer_array].name = "integer-array";
 
+//: update size mismatch check
+:(replace "if (size_of(x) != data.size())" following "void write_memory(reagent x, vector<int> data)")
+if (!Type[x.types[0]].is_array && size_of(x) != data.size())
+
 //: Arrays can be copied around with a single instruction just like integers,
 //: no matter how large they are.