diff options
-rw-r--r-- | 067random.cc | 8 | ||||
-rw-r--r-- | 068random.mu | 55 |
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 + ] +] |