diff options
author | Elias Fleckenstein <eliasfleckenstein@web.de> | 2022-01-01 15:28:29 +0100 |
---|---|---|
committer | Elias Fleckenstein <eliasfleckenstein@web.de> | 2022-01-01 15:28:29 +0100 |
commit | c990145e4dd7ca0e61f8ab5c1c906751df08e40d (patch) | |
tree | e3d199ed4b71585de67db5a01fff784ff80f8754 | |
parent | 840cad2daa6294ff6d452c649ef8ba352414a9e4 (diff) | |
download | uwu-nolambda-c990145e4dd7ca0e61f8ab5c1c906751df08e40d.tar.xz |
Implement nolamda:random module
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | random.c | 53 | ||||
-rw-r--r-- | test.uwu | 25 |
4 files changed, 77 insertions, 9 deletions
@@ -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/ @@ -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 <stdlib.h> +#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(); +} @@ -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" ) |