aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/primitives.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/primitives.c')
-rw-r--r--src/bootstrap/primitives.c32
1 files changed, 32 insertions, 0 deletions
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