about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--067random.cc8
-rw-r--r--068random.mu55
2 files changed, 59 insertions, 4 deletions
diff --git a/067random.cc b/067random.cc
index 45bcfd7d..c9eaa4d1 100644
--- a/067random.cc
+++ b/067random.cc
@@ -1,13 +1,13 @@
 :(before "End Primitive Recipe Declarations")
-RANDOM,
+REAL_RANDOM,
 :(before "End Primitive Recipe Numbers")
-put(Recipe_ordinal, "random", RANDOM);
+put(Recipe_ordinal, "real-random", REAL_RANDOM);
 :(before "End Primitive Recipe Checks")
-case RANDOM: {
+case REAL_RANDOM: {
   break;
 }
 :(before "End Primitive Recipe Implementations")
-case RANDOM: {
+case REAL_RANDOM: {
   // todo: limited range of numbers, might be imperfectly random
   // todo: thread state in extra ingredients and products
   products.resize(1);
diff --git a/068random.mu b/068random.mu
new file mode 100644
index 00000000..923fc86e
--- /dev/null
+++ b/068random.mu
@@ -0,0 +1,55 @@
+def random generator:address:stream:number -> result:number, fail?:boolean, generator:address:stream:number [
+  local-scope
+  load-ingredients
+  {
+    break-if generator
+    # generator is 0? use real random-number generator
+    result <- real-random
+    reply result, 0/false
+  }
+  result, fail?, generator <- read generator
+]
+
+# helper for tests
+def assume-random-numbers -> result:address:stream:number [
+  local-scope
+  load-ingredients
+  # compute result-len, space to allocate in result
+  result-len:number <- copy 0
+  {
+    _, arg-received?:boolean <- next-ingredient
+    break-unless arg-received?
+    result-len <- add result-len, 1
+    loop
+  }
+  rewind-ingredients
+  result-data:address:array:number <- new number:type, result-len
+  idx:number <- copy 0
+  {
+    curr:number, arg-received?:boolean <- next-ingredient
+    break-unless arg-received?
+    *result-data <- put-index *result-data, idx, curr
+    idx <- add idx, 1
+    loop
+  }
+  result <- new-stream result-data
+]
+
+scenario random-numbers-in-scenario [
+  local-scope
+  source:address:stream:number <- assume-random-numbers 34, 35, 37
+  1:number/raw, 2:boolean/raw <- random source
+  3:number/raw, 4:boolean/raw <- random source
+  5:number/raw, 6:boolean/raw <- random source
+  7:number/raw, 8:boolean/raw <- random source
+  memory-should-contain [
+    1 <- 34
+    2 <- 0  # everything went well
+    3 <- 35
+    4 <- 0  # everything went well
+    5 <- 37
+    6 <- 0  # everything went well
+    7 <- 0  # empty result
+    8 <- 1  # end of stream
+  ]
+]