@@ -12,8 +12,10 @@ static Object *eval_call(Object *, Object *, ErrorHandler, Binding *);
12
12
static Object * eval_identifier (Object * , ErrorHandler , Binding * );
13
13
static Object * eval_arguments (Object * , ErrorHandler , Binding * );
14
14
static Object * eval_arguments_onto (Object * , Object * , ErrorHandler , Binding * );
15
- static Object * execute (Callable , Object * , ErrorHandler , Binding * );
16
15
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 * );
17
19
static void bind_parameters (Object * , Object * , ErrorHandler , Binding * );
18
20
19
21
void create_interpreter (void ) {
@@ -50,18 +52,9 @@ Object *eval(Object *object, ErrorHandler error, Binding *binding) {
50
52
51
53
Object * apply (Object * function , Object * arguments , ErrorHandler error , Binding * binding ) {
52
54
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 );
59
56
} 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 );
65
58
} else {
66
59
destroy (arguments );
67
60
return error ("Not a known function type" , function );
@@ -110,13 +103,39 @@ static Object *eval_identifier(Object *identifier, ErrorHandler error, Binding *
110
103
}
111
104
}
112
105
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 ;
115
118
}
116
119
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 );
120
139
}
121
140
122
141
static void bind_parameters (Object * parameters , Object * arguments , ErrorHandler error , Binding * binding ) {
0 commit comments