diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-13 20:16:31 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-13 20:16:31 +0200 |
commit | 3ed2c60da6ef2e18d7e273cf39056833c5b41c13 (patch) | |
tree | f0b1f5e852bb46374a2815198db219b01a7bfa0b /src/bootstrap/primitives.c | |
parent | 101c6fdce11e26cd43ec85d7ae0590957cbe1c51 (diff) | |
download | bdl-3ed2c60da6ef2e18d7e273cf39056833c5b41c13.tar.gz bdl-3ed2c60da6ef2e18d7e273cf39056833c5b41c13.zip |
Add the define `def` procedure
Diffstat (limited to 'src/bootstrap/primitives.c')
-rw-r--r-- | src/bootstrap/primitives.c | 32 |
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 | |||
608 | Object * | ||
609 | proc_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 |