diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bootstrap/environment.c | 8 | ||||
-rwxr-xr-x | src/bootstrap/main.c | 1 | ||||
-rw-r--r-- | src/bootstrap/objects.c | 4 | ||||
-rw-r--r-- | src/bootstrap/primitives.c | 43 |
4 files changed, 46 insertions, 10 deletions
diff --git a/src/bootstrap/environment.c b/src/bootstrap/environment.c index e111753..78f31fb 100644 --- a/src/bootstrap/environment.c +++ b/src/bootstrap/environment.c | |||
@@ -106,15 +106,15 @@ env_extend(Environment *parent, Environment *extra) { | |||
106 | for (size_t i = 0; i < extra->size; i++) { | 106 | for (size_t i = 0; i < extra->size; i++) { |
107 | EnvEntry entry = extra->buf[i]; | 107 | EnvEntry entry = extra->buf[i]; |
108 | Environment *tmp = env; | 108 | Environment *tmp = env; |
109 | ssize_t idx = -1; | 109 | bool found = false; |
110 | while (tmp != NULL) { | 110 | while (tmp != NULL) { |
111 | idx = env_index_current(tmp, entry.symbol); | 111 | if (env_index_current(tmp, entry.symbol) != -1) { |
112 | if (idx != -1) { | 112 | found = true; |
113 | break; | 113 | break; |
114 | } | 114 | } |
115 | tmp = tmp->parent; | 115 | tmp = tmp->parent; |
116 | } | 116 | } |
117 | if (idx == -1) { | 117 | if (!found) { |
118 | env_add_symbol(env, obj_duplicate(entry.symbol), obj_duplicate(entry.value)); | 118 | env_add_symbol(env, obj_duplicate(entry.symbol), obj_duplicate(entry.value)); |
119 | } | 119 | } |
120 | } | 120 | } |
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c index 7591834..5191fd0 100755 --- a/src/bootstrap/main.c +++ b/src/bootstrap/main.c | |||
@@ -76,6 +76,7 @@ init(void) { | |||
76 | MAKE_ENV_PROC(global_env, "def", proc_define); | 76 | MAKE_ENV_PROC(global_env, "def", proc_define); |
77 | MAKE_ENV_PROC(global_env, "set!", proc_set); | 77 | MAKE_ENV_PROC(global_env, "set!", proc_set); |
78 | MAKE_ENV_PROC(global_env, "lambda", proc_lambda); | 78 | MAKE_ENV_PROC(global_env, "lambda", proc_lambda); |
79 | MAKE_ENV_PROC(global_env, "fun", proc_fun); | ||
79 | 80 | ||
80 | // Runtime procedures. | 81 | // Runtime procedures. |
81 | MAKE_ENV_PROC(global_env, "supress-errors", proc_supress_errors); | 82 | MAKE_ENV_PROC(global_env, "supress-errors", proc_supress_errors); |
diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c index b3aa3de..b03a616 100644 --- a/src/bootstrap/objects.c +++ b/src/bootstrap/objects.c | |||
@@ -41,7 +41,7 @@ typedef struct Object { | |||
41 | 41 | ||
42 | // OBJ_TYPE_LAMBDA | 42 | // OBJ_TYPE_LAMBDA |
43 | struct { | 43 | struct { |
44 | struct Object *args; | 44 | struct Object *params; |
45 | struct Object *body; | 45 | struct Object *body; |
46 | struct Environment *env; | 46 | struct Environment *env; |
47 | }; | 47 | }; |
@@ -186,7 +186,7 @@ free_objects(Object *root) { | |||
186 | free(root); | 186 | free(root); |
187 | } break; | 187 | } break; |
188 | case OBJ_TYPE_LAMBDA: { | 188 | case OBJ_TYPE_LAMBDA: { |
189 | free_objects(root->args); | 189 | free_objects(root->params); |
190 | free_objects(root->body); | 190 | free_objects(root->body); |
191 | // TODO: free_env(root->env); | 191 | // TODO: free_env(root->env); |
192 | free(root); | 192 | free(root); |
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. |