aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2022-01-01 15:28:29 +0100
committerElias Fleckenstein <eliasfleckenstein@web.de>2022-01-01 15:28:29 +0100
commitc990145e4dd7ca0e61f8ab5c1c906751df08e40d (patch)
treee3d199ed4b71585de67db5a01fff784ff80f8754
parent840cad2daa6294ff6d452c649ef8ba352414a9e4 (diff)
downloaduwu-nolambda-c990145e4dd7ca0e61f8ab5c1c906751df08e40d.tar.xz
Implement nolamda:random module
-rw-r--r--Makefile2
-rw-r--r--README.md6
-rw-r--r--random.c53
-rw-r--r--test.uwu25
4 files changed, 77 insertions, 9 deletions
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 <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();
+}
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"
)