diff options
Diffstat (limited to 'src/bootstrap/primitives.c')
-rw-r--r-- | src/bootstrap/primitives.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c index 4ef56d5..4c3e4c6 100644 --- a/src/bootstrap/primitives.c +++ b/src/bootstrap/primitives.c | |||
@@ -54,7 +54,7 @@ eval_lambda: | |||
54 | if (lambda->type == OBJ_TYPE_LAMBDA) { | 54 | if (lambda->type == OBJ_TYPE_LAMBDA) { |
55 | Object *fun = lambda; | 55 | Object *fun = lambda; |
56 | Object *args = root->cdr; | 56 | Object *args = root->cdr; |
57 | Object *params = fun->args; | 57 | Object *params = fun->params; |
58 | env = env_extend(fun->env, env); | 58 | env = env_extend(fun->env, env); |
59 | while (params != obj_nil) { | 59 | while (params != obj_nil) { |
60 | if (args == obj_nil) { | 60 | if (args == obj_nil) { |
@@ -742,8 +742,8 @@ proc_lambda(Environment *env, Object *obj) { | |||
742 | }); | 742 | }); |
743 | return obj_err; | 743 | return obj_err; |
744 | } | 744 | } |
745 | Object *args = obj->car; | 745 | Object *params = obj->car; |
746 | if (args != obj_nil && args->type != OBJ_TYPE_PAIR) { | 746 | if (params != obj_nil && params->type != OBJ_TYPE_PAIR) { |
747 | error_push((Error){ | 747 | error_push((Error){ |
748 | .type = ERR_TYPE_RUNTIME, | 748 | .type = ERR_TYPE_RUNTIME, |
749 | .value = ERR_WRONG_ARG_TYPE, | 749 | .value = ERR_WRONG_ARG_TYPE, |
@@ -752,12 +752,47 @@ proc_lambda(Environment *env, Object *obj) { | |||
752 | } | 752 | } |
753 | Object *body = obj->cdr; | 753 | Object *body = obj->cdr; |
754 | Object *fun = alloc_object(OBJ_TYPE_LAMBDA); | 754 | Object *fun = alloc_object(OBJ_TYPE_LAMBDA); |
755 | fun->args = obj_duplicate(args); | 755 | fun->params = obj_duplicate(params); |
756 | fun->body = obj_duplicate(body); | 756 | fun->body = obj_duplicate(body); |
757 | fun->env = env; | 757 | fun->env = env; |
758 | return fun; | 758 | return fun; |
759 | } | 759 | } |
760 | 760 | ||
761 | Object * | ||
762 | proc_fun(Environment *env, Object *obj) { | ||
763 | if (obj == obj_nil || obj->cdr == obj_nil || obj->cdr->cdr == obj_nil) { | ||
764 | error_push((Error){ | ||
765 | .type = ERR_TYPE_RUNTIME, | ||
766 | .value = ERR_NOT_ENOUGH_ARGS, | ||
767 | }); | ||
768 | return obj_err; | ||
769 | } | ||
770 | |||
771 | Object *name = obj->car; | ||
772 | if (name->type != OBJ_TYPE_SYMBOL) { | ||
773 | error_push((Error){ | ||
774 | .type = ERR_TYPE_RUNTIME, | ||
775 | .value = ERR_WRONG_ARG_TYPE, | ||
776 | }); | ||
777 | return obj_err; | ||
778 | } | ||
779 | |||
780 | Object *params = obj->cdr->car; | ||
781 | if (params != obj_nil && params->type != OBJ_TYPE_PAIR) { | ||
782 | error_push((Error){ | ||
783 | .type = ERR_TYPE_RUNTIME, | ||
784 | .value = ERR_WRONG_ARG_TYPE, | ||
785 | }); | ||
786 | return obj_err; | ||
787 | } | ||
788 | Object *body = obj->cdr->cdr; | ||
789 | Object *fun = alloc_object(OBJ_TYPE_LAMBDA); | ||
790 | fun->params = obj_duplicate(params); | ||
791 | fun->body = obj_duplicate(body); | ||
792 | fun->env = env; | ||
793 | env_add_or_update_current(env, name, fun); | ||
794 | return obj_nil; | ||
795 | } | ||
761 | 796 | ||
762 | // | 797 | // |
763 | // Evaluation. | 798 | // Evaluation. |