Browse Source

make make_closure just return the boxed value to simplify code

master
nisstyre56 11 years ago
parent
commit
dad53171a4
  1. 15
      closures.c

15
closures.c

@ -98,7 +98,7 @@ box_closure(closure_t *closure) {
} }
inline closure_t* inline svalue_t*
make_closure(svalue_t *(*func)(svalue_t*, svalue_t**), make_closure(svalue_t *(*func)(svalue_t*, svalue_t**),
svalue_t **fvars) { svalue_t **fvars) {
/* The reason we dynamically allocate here is because /* The reason we dynamically allocate here is because
@ -110,7 +110,7 @@ make_closure(svalue_t *(*func)(svalue_t*, svalue_t**),
closure_t *closure = malloc(sizeof (closure_t)); closure_t *closure = malloc(sizeof (closure_t));
closure->func = func; closure->func = func;
closure->fvars = fvars; closure->fvars = fvars;
return closure; return box_closure(closure);
} }
inline svalue_t* inline svalue_t*
@ -132,25 +132,24 @@ make_doubleadder_inner_inner(svalue_t *z, svalue_t **env) {
static inline svalue_t* static inline svalue_t*
make_doubleadder_inner(svalue_t *y, svalue_t **env) { make_doubleadder_inner(svalue_t *y, svalue_t **env) {
env[1] = y; env[1] = y;
closure_t *inner = make_closure(make_doubleadder_inner_inner, env); return make_closure(make_doubleadder_inner_inner, env);
return box_closure(inner);
} }
static svalue_t* static svalue_t*
make_doubleadder(svalue_t *x, svalue_t **env) { make_doubleadder(svalue_t *x, svalue_t **env) {
env[0] = x; env[0] = x;
closure_t *closure = make_closure(make_doubleadder_inner, env); return make_closure(make_doubleadder_inner, env);
return box_closure(closure);
} }
/*svalue_t **env extend(uint32_t n, svalue_t *v*/
int int
main(void) { main(void) {
(void)box_float; (void)box_float;
(void)box_double; (void)box_double;
(void)box_string; (void)box_string;
svalue_t **env = calloc(sizeof (svalue_t *), 2); svalue_t **env = calloc(sizeof (svalue_t *), 2);
closure_t *closure1_closure = make_closure(make_doubleadder, env); svalue_t *closure1 = make_closure(make_doubleadder, env);
svalue_t *closure1 = box_closure(closure1_closure);
svalue_t *c1 = invoke(closure1, box_int(23)); svalue_t *c1 = invoke(closure1, box_int(23));
svalue_t *c2 = invoke(c1, box_int(5)); svalue_t *c2 = invoke(c1, box_int(5));
svalue_t *result = invoke(c2, box_int(334)); svalue_t *result = invoke(c2, box_int(334));