aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-13 20:16:31 +0200
committerBad Diode <bd@badd10de.dev>2021-10-13 20:16:31 +0200
commit3ed2c60da6ef2e18d7e273cf39056833c5b41c13 (patch)
treef0b1f5e852bb46374a2815198db219b01a7bfa0b
parent101c6fdce11e26cd43ec85d7ae0590957cbe1c51 (diff)
downloadbdl-3ed2c60da6ef2e18d7e273cf39056833c5b41c13.tar.gz
bdl-3ed2c60da6ef2e18d7e273cf39056833c5b41c13.zip
Add the define `def` procedure
-rwxr-xr-xsrc/bootstrap/main.c1
-rw-r--r--src/bootstrap/primitives.c32
2 files changed, 33 insertions, 0 deletions
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c
index 945e121..e8e530d 100755
--- a/src/bootstrap/main.c
+++ b/src/bootstrap/main.c
@@ -71,6 +71,7 @@ init(void) {
71 MAKE_ENV_PROC(global_env, ">=", proc_num_greatereq_than); 71 MAKE_ENV_PROC(global_env, ">=", proc_num_greatereq_than);
72 MAKE_ENV_PROC(global_env, "=", proc_num_equal); 72 MAKE_ENV_PROC(global_env, "=", proc_num_equal);
73 MAKE_ENV_PROC(global_env, "eq?", proc_equal); 73 MAKE_ENV_PROC(global_env, "eq?", proc_equal);
74 MAKE_ENV_PROC(global_env, "def", proc_define);
74} 75}
75 76
76void 77void
diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c
index 39229ff..af8e9da 100644
--- a/src/bootstrap/primitives.c
+++ b/src/bootstrap/primitives.c
@@ -601,6 +601,38 @@ proc_equal(Environment *env, Object *obj) {
601 return obj_eq(a, b) ? obj_true : obj_false; 601 return obj_eq(a, b) ? obj_true : obj_false;
602} 602}
603 603
604//
605// Variables and declarations.
606//
607
608Object *
609proc_define(Environment *env, Object *obj) {
610 if (obj == obj_nil || obj->cdr == obj_nil) {
611 error_push((Error){
612 .type = ERR_TYPE_RUNTIME,
613 .value = ERR_NOT_ENOUGH_ARGS,
614 });
615 return obj_err;
616 }
617
618 Object *symbol = obj->car;
619 if (symbol->type != OBJ_TYPE_SYMBOL) {
620 error_push((Error){
621 .type = ERR_TYPE_RUNTIME,
622 .value = ERR_WRONG_ARG_TYPE,
623 });
624 return obj_err;
625 }
626
627 Object *value = eval(env, obj->cdr->car);
628 if (value == obj_err) {
629 return obj_err;
630 }
631
632 // Make a copy of the symbol and to make them permanent in the environment.
633 env_update_symbol(env, obj_duplicate(symbol), obj_duplicate(value));
634 return obj_nil;
635}
604 636
605// TODO: fixnum left/right shift, mask, invert 637// TODO: fixnum left/right shift, mask, invert
606// TODO: add primitives for type transforms: string->symbol, symbol->string, etc 638// TODO: add primitives for type transforms: string->symbol, symbol->string, etc