From 8cd163d433aed8edf41b348e43546bf47c5de197 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 1 Jan 2022 18:03:36 +0100 Subject: [PATCH] Update to new uwu syntax --- README.md | 40 +++++++++++++++++------------------ exit.uwu | 10 ++++++++- flow.c | 4 ++-- fs.c | 8 +++---- io.c | 4 ++-- os.c | 12 +++++------ random.c | 16 +++++++------- test.uwu | 62 +++++++++++++++++++++++++++---------------------------- 8 files changed, 82 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index 4c13ce7..5a1b5c7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# nolambda +e# nolambda nolambda is a collection of native [uwu](https://github.com/EliasFleckenstein03/uwulang) modules that break the lambda paradigm, such as linear execution, I/O, globals etc. ## Building @@ -21,39 +21,39 @@ Note: The module `global` is not implemented yet. ### `flow` -- `flow:linear`: Accepts an arbitrary number of arguments of arbitrary type, but at least one and evaulates all of them in order. Returns the last argument. -- `flow:error`: Accepts an arbitrary type as $0, prints it to stderr appending a newline and exits the program with failure. Returns `:nil:nil` in theory. +- `flow.linear`: Accepts an arbitrary number of arguments of arbitrary type, but at least one and evaulates all of them in order. Returns the last argument. +- `flow.error`: Accepts an arbitrary type as $0, prints it to stderr appending a newline and exits the program with failure. Returns `nil.nil` in theory. ### `io` -- `io:print`: Accepts an arbitrary type as $0 and prints it to stdout, followed by a newline. Returns $0. -- `io:scan`: Reads a line from stdin and returns it as a string, without the newline character at the end. If $0 is given, it is used as a prompt (after converting to string). +- `io.print`: Accepts an arbitrary type as $0 and prints it to stdout, followed by a newline. Returns $0. +- `io.scan`: Reads a line from stdin and returns it as a string, without the newline character at the end. If $0 is given, it is used as a prompt (after converting to string). ### `fs` Note: all file paths are relative to the _directory the program was started from_. -- `fs:read`: Accepts a file name (arbirary value, converted to string) as $0 and returns it's contents as a string. Causes an error if the file does not exist. -- `fs:write`: Accepts a file name (arbirary value, converted to string) as $0 and overwrites it with the contents in $1 (arbirary value, converted to string). Causes an error if the file could not be written. Returns `:nil:nil`. -- `fs:remove`: Accepts an arbitrary number of file names (arbirary type, converted to string), but at least one and unlinks them from the file system (the files can also be a directories). Causes an error if one of the file could not be removed, or if some or all of the files did not exist in the first place. Returns `:nil:nil`. -- `fs:exists`: Accepts an arbitrary number of file names (arbirary type, converted to string), but at least one and returns `:bool:true` if all of them exist, `:bool:fase` else. +- `fs.read`: Accepts a file name (arbirary value, converted to string) as $0 and returns it's contents as a string. Causes an error if the file does not exist. +- `fs.write`: Accepts a file name (arbirary value, converted to string) as $0 and overwrites it with the contents in $1 (arbirary value, converted to string). Causes an error if the file could not be written. Returns `nil.nil`. +- `fs.remove`: Accepts an arbitrary number of file names (arbirary type, converted to string), but at least one and unlinks them from the file system (the files can also be a directories). Causes an error if one of the file could not be removed, or if some or all of the files did not exist in the first place. Returns `nil.nil`. +- `fs.exists`: Accepts an arbitrary number of file names (arbirary type, converted to string), but at least one and returns `bool.true` if all of them exist, `bool.false` else. ### `os` -- `os:exit`: Optionally takes an exit code (integer) as $0 and exits the program with the given exit code, or 0 if no exit code was given. Returns `:nil:nil` in theory. -- `os:sleep`: Takes an integer as $0 and pauses the execution of the program for $1 milliseconds. Returns `:nil:nil`. -- `os:execute`: Takes a command (arbirary value, converted to string) as $0 and executes it as a shell command. Returns the exit code of the command as an integer. -- `os:time`: Returns the current unix millis as an integer. +- `os.exit`: Optionally takes an exit code (integer) as $0 and exits the program with the given exit code, or 0 if no exit code was given. Returns `nil.nil` in theory. +- `os.sleep`: Takes an integer as $0 and pauses the execution of the program for $1 milliseconds. Returns `nil.nil`. +- `os.execute`: Takes a command (arbirary value, converted to string) as $0 and executes it as a shell command. Returns the exit code of the command as an integer. +- `os.time`: Returns the current unix millis as an integer. ### `global` -- `global:set`: Creates or overwrites a global variable named $0 (arbirary value, converted to string) and puts the contents of $1 (arbitrary type) into it. Returns `:bool:false` if the variable existed previously and was updated, `:bool:true` if it was created. -- `global:get`: Returns the global variable named $0 (arbirary value, converted to string). Causes an error if the variable does not exist. -- `global:exists`: Returns `:bool:true` if the global variable named $0 (arbirary value, converted to string) exists, `:bool:false` else. -- `global:delete`: Deletes the global variable named $0 (arbirary value, converted to string). Returns `:bool:true` if the variable existed previously, `:bool:false` else. +- `global.set`: Creates or overwrites a global variable named $0 (arbirary value, converted to string) and puts the contents of $1 (arbitrary type) into it. Returns `bool.false` if the variable existed previously and was updated, `bool.true` if it was created. +- `global.get`: Returns the global variable named $0 (arbirary value, converted to string). Causes an error if the variable does not exist. +- `global.exists`: Returns `bool.true` if the global variable named $0 (arbirary value, converted to string) exists, `bool.false` else. +- `global.delete`: Deletes the global variable named $0 (arbirary value, converted to string). Returns `bool.true` if the variable existed previously, `bool.false` else. ### `random` -- `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 `random:max` or empty. -- `random:max`: Returns RAND_MAX. -- `random:seed`: Sets the random seed to $0 (integer) and returns `:nil:nil`. +- `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 `random.max` or empty. +- `random.max`: Returns RAND_MAX. +- `random.seed`: Sets the random seed to $0 (integer) and returns `nil.nil`. diff --git a/exit.uwu b/exit.uwu index f5e4ca1..6438ca8 100644 --- a/exit.uwu +++ b/exit.uwu @@ -1 +1,9 @@ -main os:exit(1) +main .flow.linear( + .random.seed(.os.time), + .os.exit( + bool.if(int.equal(.random.random(1, 2), 1), + 69, + int.sub(0, 8) + ) + ) +) diff --git a/flow.c b/flow.c index d17b492..23cd5f8 100644 --- a/flow.c +++ b/flow.c @@ -8,7 +8,7 @@ UwUVMValue uwu_linear(UwUVMArgs *args) { - uwuutil_require_min("flow:linear", args, 1); + uwuutil_require_min("flow.linear", args, 1); size_t return_arg = args->num - 1; @@ -20,7 +20,7 @@ UwUVMValue uwu_linear(UwUVMArgs *args) UwUVMValue uwu_error(UwUVMArgs *args) { - uwuutil_require_exact("flow:error", args, 1); + uwuutil_require_exact("flow.error", args, 1); char *err = uwustr_get(uwuvm_get_arg(args, 0)); fprintf(stderr, "%s\n", err); diff --git a/fs.c b/fs.c index 953c062..7b18289 100644 --- a/fs.c +++ b/fs.c @@ -11,7 +11,7 @@ UwUVMValue uwu_read(UwUVMArgs *args) { - uwuutil_require_exact("fs:read", args, 1); + uwuutil_require_exact("fs.read", args, 1); char *filename = uwustr_get(uwuvm_get_arg(args, 0)); @@ -36,7 +36,7 @@ UwUVMValue uwu_read(UwUVMArgs *args) UwUVMValue uwu_write(UwUVMArgs *args) { - uwuutil_require_exact("fs:write", args, 2); + uwuutil_require_exact("fs.write", args, 2); char *filename = uwustr_get(uwuvm_get_arg(args, 0)); char *contents = uwustr_get(uwuvm_get_arg(args, 1)); @@ -56,7 +56,7 @@ UwUVMValue uwu_write(UwUVMArgs *args) UwUVMValue uwu_remove(UwUVMArgs *args) { - uwuutil_require_min("fs:remove", args, 1); + uwuutil_require_min("fs.remove", args, 1); for (size_t i = 0; i < args->num; i++) { char *filename = uwustr_get(uwuvm_get_arg(args, i)); @@ -71,7 +71,7 @@ UwUVMValue uwu_remove(UwUVMArgs *args) UwUVMValue uwu_exists(UwUVMArgs *args) { - uwuutil_require_min("fs:exists", args, 1); + uwuutil_require_min("fs.exists", args, 1); for (size_t i = 0; i < args->num; i++) { char *filename = uwustr_get(uwuvm_get_arg(args, i)); diff --git a/io.c b/io.c index a54acc7..249eefe 100644 --- a/io.c +++ b/io.c @@ -9,7 +9,7 @@ UwUVMValue uwu_print(UwUVMArgs *args) { - uwuutil_require_exact("io:print", args, 1); + uwuutil_require_exact("io.print", args, 1); UwUVMValue value = uwuvm_get_arg(args, 0); @@ -22,7 +22,7 @@ UwUVMValue uwu_print(UwUVMArgs *args) UwUVMValue uwu_scan(UwUVMArgs *args) { - uwuutil_require_max("io:scan", args, 1); + uwuutil_require_max("io.scan", args, 1); char *prompt = NULL; diff --git a/os.c b/os.c index fe00492..9f6ff3b 100644 --- a/os.c +++ b/os.c @@ -10,7 +10,7 @@ UwUVMValue uwu_exit(UwUVMArgs *args) { - uwuutil_require_max("os:exit", args, 1); + uwuutil_require_max("os.exit", args, 1); long exit_code = 0; @@ -23,17 +23,17 @@ UwUVMValue uwu_exit(UwUVMArgs *args) UwUVMValue uwu_sleep(UwUVMArgs *args) { - uwuutil_require_exact("os:sleep", args, 1); + uwuutil_require_exact("os.sleep", args, 1); UwUVMValue value = uwuvm_get_arg(args, 0); if (value.type != &uwuint_type) - error("type error: nolamda:os:sleep requires an integer as $0\n"); + error("type error: os.sleep requires an integer as $1\n"); long millis = uwuint_get(value); if (millis < 0) - error("type error: nolamda:os:sleep requires a positive value as $0\n"); + error("type error: os.sleep requires a positive value as $2\n"); struct timespec ts = { .tv_sec = millis / 1000, @@ -49,7 +49,7 @@ UwUVMValue uwu_sleep(UwUVMArgs *args) UwUVMValue uwu_execute(UwUVMArgs *args) { - uwuutil_require_exact("os:execute", args, 1); + uwuutil_require_exact("os.execute", args, 1); char *command = uwustr_get(uwuvm_get_arg(args, 0)); int ret = system(command); @@ -60,7 +60,7 @@ UwUVMValue uwu_execute(UwUVMArgs *args) UwUVMValue uwu_time(UwUVMArgs *args) { - uwuutil_require_exact("os:time", args, 0); + uwuutil_require_exact("os.time", args, 0); struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); diff --git a/random.c b/random.c index c28e139..94c8fb9 100644 --- a/random.c +++ b/random.c @@ -7,17 +7,17 @@ UwUVMValue uwu_random(UwUVMArgs *args) { - uwuutil_require_exact("random:random", args, 2); + uwuutil_require_exact("random.random", args, 2); UwUVMValue value0 = uwuvm_get_arg(args, 0); if (value0.type != &uwuint_type) - error("type error: random:random requires an integer as $0\n"); + error("type error: random.random requires an integer as $1\n"); UwUVMValue value1 = uwuvm_get_arg(args, 1); if (value1.type != &uwuint_type) - error("type error: random:random requires an integer as $1\n"); + error("type error: random.random requires an integer as $2\n"); long min = uwuint_get(value0); long max = uwuint_get(value1) + 1; @@ -25,28 +25,28 @@ UwUVMValue uwu_random(UwUVMArgs *args) long range = max - min; if (range < 0) - error("type error: range passed to random:random is empty\n"); + error("type error: range passed to random.random is empty\n"); if (range > RAND_MAX) - error("type error: range passed to random:random is bigger than random:max"); + error("type error: range passed to random.random is bigger than random.max"); return uwuint_create(min + rand() % range); } UwUVMValue uwu_max(UwUVMArgs *args) { - uwuutil_require_exact("random:max", args, 0); + uwuutil_require_exact("random.max", args, 0); return uwuint_create(RAND_MAX); } UwUVMValue uwu_seed(UwUVMArgs *args) { - uwuutil_require_exact("random:seed", args, 1); + uwuutil_require_exact("random.seed", args, 1); UwUVMValue value = uwuvm_get_arg(args, 0); if (value.type != &uwuint_type) - error("type error: random:seed requires an integer as $0\n"); + error("type error: random.seed requires an integer as $1\n"); srand(uwuint_get(value) % RAND_MAX); return uwunil_create(); diff --git a/test.uwu b/test.uwu index 6182a05..e543bb4 100644 --- a/test.uwu +++ b/test.uwu @@ -1,52 +1,52 @@ -main flow:linear( - io:print("please enter something:"), - io:print(io:scan), +main .flow.linear( + .io.print("please enter something:"), + .io.print(.io.scan), - io:print(:str:cat( - "your input: ", - io:scan("please enter something else: ") + .io.print(str.cat( + "your input. ", + .io.scan("please enter something else: ") )), - io:print(:nil:nil), - fs:write("test", "hello world"), - :bool:if(fs:exists("test"), - io:print("successfully wrote file"), - flow:error("failed to write file") + .io.print(nil.nil), + .fs.write("test", "hello world"), + bool.if(.fs.exists("test"), + .io.print("successfully wrote file"), + .flow.error("failed to write file") ), - io:print(fs:read("test")), + .io.print(.fs.read("test")), - fs:remove("test"), - :bool:if(fs:exists("test"), - flow:error("failed to remove file"), - io:print("successfully removed file") + .fs.remove("test"), + bool.if(.fs.exists("test"), + .flow.error("failed to remove 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), + .io.print(.os.time), + .os.sleep(500), + .io.print(.os.time), - io:print(:nil:nil), - os:execute("echo hello world"), + .io.print(nil.nil), + .os.execute("echo hello world"), - io:print(:nil:nil), - io:print(:str:cat( + .io.print(nil.nil), + .io.print(str.cat( "Unseeded dice: ", - random:random(1, 6) + .random.random(1, 6) )), - random:seed(os:time), - io:print(:str:cat( + .random.seed(.os.time), + .io.print(str.cat( "Seeded dice: ", - random:random(1, 6) + .random.random(1, 6) )), - io:print(:str:cat( + .io.print(str.cat( "RAND_MAX = ", - random:max + .random.max )), - io:print(:nil:nil), + .io.print(nil.nil), "success" ) -- 2.44.0