about summary refs log tree commit diff stats
path: root/032array.cc
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-05-26 15:16:36 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-05-26 15:16:36 -0700
commitc8a58cdc8cc3353de3a42a9f53e5c4759ef9701a (patch)
tree367f52a1cc671b73696abf3f905632b195f95e1a /032array.cc
parent5b84f01fdcf30ffb62d53ed6f5886f626d47bcfa (diff)
downloadmu-c8a58cdc8cc3353de3a42a9f53e5c4759ef9701a.tar.gz
1473
Diffstat (limited to '032array.cc')
-rw-r--r--032array.cc28
1 files changed, 28 insertions, 0 deletions
diff --git a/032array.cc b/032array.cc
index deef886e..0d8efc5c 100644
--- a/032array.cc
+++ b/032array.cc
@@ -139,3 +139,31 @@ case INDEX_ADDRESS: {
   products.at(0).push_back(result);
   break;
 }
+
+//:: compute the length of an array
+
+:(scenario array_length)
+recipe main [
+  1:number <- copy 3:literal  # length
+  2:number <- copy 14:literal
+  3:number <- copy 15:literal
+  4:number <- copy 16:literal
+  5:number <- length 1:array:number
+]
++mem: storing 3 in location 5
+
+:(before "End Primitive Recipe Declarations")
+LENGTH,
+:(before "End Primitive Recipe Numbers")
+Recipe_number["length"] = LENGTH;
+:(before "End Primitive Recipe Implementations")
+case LENGTH: {
+  reagent x = canonize(current_instruction().ingredients.at(0));
+  if (x.types.at(0) != Type_number["array"]) {
+    raise << "tried to calculate length of non-array " << x.to_string() << '\n';
+    break;
+  }
+  products.resize(1);
+  products.at(0).push_back(Memory[x.value]);
+  break;
+}