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;
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();
}
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;
}
#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);