## 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`
### `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`.
--- /dev/null
+#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();
+}
)),
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"),
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"
)