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.c43
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
761Object *
762proc_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.