]> git.eli173.com Git - klapaucius/commitdiff
random uint
authorElijah Cohen <eli@eli173.com>
Wed, 25 Dec 2024 01:26:18 +0000 (17:26 -0800)
committerElijah Cohen <eli@eli173.com>
Wed, 25 Dec 2024 01:26:18 +0000 (17:26 -0800)
src/builtins.c
src/builtins/io.c
src/builtins/io.h

index dfe2052e640accabafd95f43fa5b8c913a4bfacb..65f577b07acf346d8d8478a92e17747d172f2763 100644 (file)
@@ -220,6 +220,8 @@ char* lookup_builtin(Sexpr* b) {
                        return IO_READFILE_STR;
                case IO_WRITEFILE:
                        return IO_WRITEFILE_STR;
+               case IO_RAND:
+                       return IO_RAND_STR;
                default:
                        return "NOT FOUND (IO)";
                }
index 18879663a639cabf4c98f63c5eaba167a4f530e0..3531addd8d81f58b31315e08ceff576ec5c7f2e0 100644 (file)
@@ -125,6 +125,26 @@ Sexpr* io_writefile(Sexpr* b, Sexpr* rest, Sexpr* env) {
        return cons(from_uint(num_written), rest);
 }
 
+Sexpr* io_rand(Sexpr* b, Sexpr* rest, Sexpr* env) {
+       if(IO_RAND_ARGS != u64_get_num_args(b)) {
+               return cons(b, rest);
+       }
+       Sexpr* args = b->value.b.args;
+       Sexpr* arg = eval(clone(car(args)), env);
+#ifdef TYPECHECK
+       if(arg->type != UINT) {
+               ERR(IO_RAND_STR ": ", "argument not uint");
+               sexpr_free(arg);
+               sexpr_free(b);
+               return cons(from_nil(), rest);
+       }
+#endif
+       K_UINT_TYPE m = unquote(arg)->value.u;
+       sexpr_free(b);
+       sexpr_free(arg);
+       return cons(from_uint(rand() % m), rest);
+}
+
 
 Sexpr* x_io_dispatch(Sexpr* b, Sexpr* rest, Sexpr* env) {
        uint64_t code = b->value.b.opcode & 0xff;
@@ -140,6 +160,8 @@ Sexpr* x_io_dispatch(Sexpr* b, Sexpr* rest, Sexpr* env) {
                return io_readfile(b, rest, env);
        case IO_WRITEFILE:
                return io_writefile(b, rest, env);
+       case IO_RAND:
+               return io_rand(b, rest, env);
        default:
                return from_nil();
        }
@@ -152,6 +174,7 @@ Sexpr* load_io_env(Sexpr* env) {
        load_builtin(IO_PB_STR, (IO_PREFIX << 8) | IO_PB, env);
        load_builtin(IO_READFILE_STR, (IO_PREFIX << 8) | IO_READFILE, env);
        load_builtin(IO_WRITEFILE_STR, (IO_PREFIX << 8) | IO_WRITEFILE, env);
-
+       load_builtin(IO_RAND_STR, (IO_PREFIX << 8) | IO_RAND, env);
+       
        return env;
 }
index 2d0b42bf9f79c8fd4d32d7fae39bb4bcee7946d2..44de27a3e31a41dd611a2823ff06658000518fd9 100644 (file)
@@ -20,6 +20,9 @@
 #define IO_WRITEFILE 0x04
 #define IO_WRITEFILE_ARGS 2
 #define IO_WRITEFILE_STR "writefile"
+#define IO_RAND 0x05
+#define IO_RAND_ARGS 1
+#define IO_RAND_STR "rand"
 
 Sexpr* x_io_dispatch(Sexpr* s, Sexpr* rest, Sexpr* env);
 Sexpr* load_io_env(Sexpr* env);