diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/bootstrap/main.c | 1 | ||||
-rw-r--r-- | src/bootstrap/primitives.c | 32 |
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 | ||
76 | void | 77 | void |
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 |