From c990145e4dd7ca0e61f8ab5c1c906751df08e40d Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 1 Jan 2022 15:28:29 +0100 Subject: Implement nolamda:random module --- Makefile | 2 +- README.md | 6 +++--- random.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ test.uwu | 25 ++++++++++++++++++++----- 4 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 random.c diff --git a/Makefile b/Makefile index bdf5ded..5459cb5 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -all: flow.so io.so fs.so os.so +all: flow.so io.so fs.so os.so random.so uwu_include_path=../uwulang/ diff --git a/README.md b/README.md index 8dbdb0a..a2e93a7 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ make uwu_include_path=/path/to/uwulang/repo ## Modules -The following modules are implemented: `nolambda:flow`, `nolambda:io`, `nolambda:fs`, `nolambda:os`. The modules `nolambda:global`, and `nolambda:random` are ToDo. +Note: The module `nolambda:global` is not implemented yet. ### `nolambda:flow` @@ -54,6 +54,6 @@ Note: all file paths are relative to the _directory the program was started from ### `nolambda:random` -- `nolambda:random:random`: Returns a pseudorandom integer between $0 (integer) and $1 (integer). The upper bound is exclusive, the lower bound inclusive. Causes an error if the range is bigger than `nolambda:random:max`. -- `nolambda:random:max`: Returns RAND_MAX, which is usually 32767. +- `nolambda:random:random`: Returns a pseudorandom integer between $0 (integer) and $1 (integer). The range is inclusive on both boundse. Causes an error if the range is bigger than `nolambda:random:max` or empty. +- `nolambda:random:max`: Returns RAND_MAX. - `nolambda:random:seed`: Sets the random seed to $0 (integer) and returns `:nil:nil`. diff --git a/random.c b/random.c new file mode 100644 index 0000000..dea81aa --- /dev/null +++ b/random.c @@ -0,0 +1,53 @@ +#include +#include "api/vm.h" +#include "api/util.h" +#include "api/int.h" +#include "api/nil.h" +#include "common/err.h" + +UwUVMValue uwu_random(UwUVMArgs *args) +{ + uwuutil_require_exact("nolambda:random:random", args, 2); + + UwUVMValue value0 = uwuvm_get_arg(args, 0); + + if (value0.type != &uwuint_type) + error("type error: nolamda:random:random requires an integer as $0\n"); + + UwUVMValue value1 = uwuvm_get_arg(args, 1); + + if (value1.type != &uwuint_type) + error("type error: nolamda:random:random requires an integer as $1\n"); + + long min = uwuint_get(value0); + long max = uwuint_get(value1) + 1; + + long range = max - min; + + if (range < 0) + error("type error: range passed to nolambda:random:random is empty\n"); + + if (range > RAND_MAX) + error("type error: range passed to nolambda:random:random is bigger than nolambda:random:max"); + + return uwuint_create(min + rand() % range); +} + +UwUVMValue uwu_max(UwUVMArgs *args) +{ + uwuutil_require_exact("nolambda:random:max", args, 0); + return uwuint_create(RAND_MAX); +} + +UwUVMValue uwu_seed(UwUVMArgs *args) +{ + uwuutil_require_exact("nolambda:random:seed", args, 1); + + UwUVMValue value = uwuvm_get_arg(args, 0); + + if (value.type != &uwuint_type) + error("type error: nolamda:random:seed requires an integer as $0\n"); + + srand(uwuint_get(value) % RAND_MAX); + return uwunil_create(); +} diff --git a/test.uwu b/test.uwu index 8e7d32b..6182a05 100644 --- a/test.uwu +++ b/test.uwu @@ -8,11 +8,6 @@ main flow:linear( )), io:print(:nil:nil), - io:print("--- QUINE ---"), - io:print(fs:read("test.uwu")), - io:print("--- END OF QUINE ---"), - io:print(:nil:nil), - fs:write("test", "hello world"), :bool:if(fs:exists("test"), io:print("successfully wrote file"), @@ -27,11 +22,31 @@ main flow:linear( io:print("successfully removed file") ), + io:print(:nil:nil), io:print(os:time), os:sleep(500), io:print(os:time), + io:print(:nil:nil), os:execute("echo hello world"), + io:print(:nil:nil), + io:print(:str:cat( + "Unseeded dice: ", + random:random(1, 6) + )), + + random:seed(os:time), + io:print(:str:cat( + "Seeded dice: ", + random:random(1, 6) + )), + + io:print(:str:cat( + "RAND_MAX = ", + random:max + )), + + io:print(:nil:nil), "success" ) -- cgit v1.2.3