Skip to content

Commit c79a595

Browse files
committed
It lives Igor, it lives
1 parent ef0b7dd commit c79a595

File tree

1 file changed

+36
-17
lines changed

1 file changed

+36
-17
lines changed

interpreter.c

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ static Object *eval_call(Object *, Object *, ErrorHandler, Binding *);
1212
static Object *eval_identifier(Object *, ErrorHandler, Binding *);
1313
static Object *eval_arguments(Object *, ErrorHandler, Binding *);
1414
static Object *eval_arguments_onto(Object *, Object *, ErrorHandler, Binding *);
15-
static Object *execute(Callable, Object *, ErrorHandler, Binding *);
1615
static Object *eval_lambda(Object *block, Object *parameters, Object *arguments, ErrorHandler error, Binding *binding);
16+
static Object *apply_built_in(Object *, Object *, ErrorHandler, Binding *);
17+
static Object *apply_lambda(Object *, Object *, ErrorHandler, Binding *);
18+
static Object *execute(Callable, Object *, ErrorHandler, Binding *);
1719
static void bind_parameters(Object *, Object *, ErrorHandler, Binding *);
1820

1921
void create_interpreter(void) {
@@ -50,18 +52,9 @@ Object *eval(Object *object, ErrorHandler error, Binding *binding) {
5052

5153
Object *apply(Object *function, Object *arguments, ErrorHandler error, Binding *binding) {
5254
if (is_built_in(function)) {
53-
if (! is_special_form(function)) {
54-
arguments = eval_arguments(arguments, error, binding);
55-
}
56-
Callable built_in_code = code((BuiltIn *)value(function));
57-
destroy(function);
58-
return execute(built_in_code, arguments, error, binding);
55+
return apply_built_in(function, arguments, error, binding);
5956
} else if (is_lambda(function)) {
60-
arguments = eval_arguments(arguments, error, binding);
61-
Object *lambda_body = body(function);
62-
Object *lambda_parameters = parameters(function);
63-
destroy(function);
64-
return eval_lambda(lambda_body, lambda_parameters, arguments, error, binding);
57+
return apply_lambda(function, arguments, error, binding);
6558
} else {
6659
destroy(arguments);
6760
return error("Not a known function type", function);
@@ -110,13 +103,39 @@ static Object *eval_identifier(Object *identifier, ErrorHandler error, Binding *
110103
}
111104
}
112105

113-
static Object *execute(Callable code, Object *arguments, ErrorHandler error, Binding *binding) {
114-
return (*code)(arguments, error, binding);
106+
static Object *eval_lambda(Object *body, Object *parameters, Object *arguments, ErrorHandler error, Binding *binding) {
107+
binding = create_binding(binding);
108+
Object *result = NULL;
109+
Try {
110+
bind_parameters(parameters, arguments, error, binding);
111+
result = eval(body, error, binding);
112+
free_binding(binding);
113+
} Catch {
114+
free_binding(binding);
115+
return rethrow();
116+
}
117+
return result;
115118
}
116119

117-
static Object *eval_lambda(Object *body, Object *parameters, Object *arguments, ErrorHandler error, Binding *binding) {
118-
bind_parameters(parameters, arguments, error, binding);
119-
return eval(body, error, binding);
120+
static Object *apply_built_in(Object *function, Object *arguments, ErrorHandler error, Binding *binding) {
121+
if (! is_special_form(function)) {
122+
arguments = eval_arguments(arguments, error, binding);
123+
}
124+
Callable built_in_code = code((BuiltIn *)value(function));
125+
destroy(function);
126+
return execute(built_in_code, arguments, error, binding);
127+
}
128+
129+
static Object *apply_lambda(Object *function, Object *arguments, ErrorHandler error, Binding *binding) {
130+
arguments = eval_arguments(arguments, error, binding);
131+
Object *lambda_body = clone(body(function));
132+
Object *lambda_parameters = clone(parameters(function));
133+
destroy(function);
134+
return eval_lambda(lambda_body, lambda_parameters, arguments, error, binding);
135+
}
136+
137+
static Object *execute(Callable code, Object *arguments, ErrorHandler error, Binding *binding) {
138+
return (*code)(arguments, error, binding);
120139
}
121140

122141
static void bind_parameters(Object *parameters, Object *arguments, ErrorHandler error, Binding *binding) {

0 commit comments

Comments
 (0)