Browse Source

make make_closure just return the boxed value to simplify code

master
nisstyre56 10 years ago
parent
commit
dad53171a4
  1. 29
      closures.c

29
closures.c

@ -44,7 +44,7 @@ box_value(svalue_variants_t value,
inline svalue_t * inline svalue_t *
box_int(int x) { box_int(int x) {
svalue_t *val = malloc(sizeof(svalue_t)); svalue_t *val = malloc(sizeof (svalue_t));
CHECK(val); CHECK(val);
svalue_variants_t value_val; svalue_variants_t value_val;
value_val.integer = x; value_val.integer = x;
@ -54,7 +54,7 @@ box_int(int x) {
inline svalue_t * inline svalue_t *
box_float(float x) { box_float(float x) {
svalue_t *val = malloc(sizeof(svalue_t)); svalue_t *val = malloc(sizeof (svalue_t));
CHECK(val); CHECK(val);
svalue_variants_t value_val; svalue_variants_t value_val;
value_val.floating = x; value_val.floating = x;
@ -64,7 +64,7 @@ box_float(float x) {
inline svalue_t * inline svalue_t *
box_double(double x) { box_double(double x) {
svalue_t *val = malloc(sizeof(svalue_t)); svalue_t *val = malloc(sizeof (svalue_t));
CHECK(val); CHECK(val);
svalue_variants_t value_val; svalue_variants_t value_val;
value_val.doublev = x; value_val.doublev = x;
@ -78,7 +78,7 @@ box_string(char *chars, size_t n) {
strval.string = chars; strval.string = chars;
strval.size = n; strval.size = n;
svalue_t *val = malloc(sizeof(svalue_t)); svalue_t *val = malloc(sizeof (svalue_t));
CHECK(val); CHECK(val);
svalue_variants_t value_val; svalue_variants_t value_val;
@ -89,7 +89,7 @@ box_string(char *chars, size_t n) {
inline svalue_t * inline svalue_t *
box_closure(closure_t *closure) { box_closure(closure_t *closure) {
svalue_t *val = calloc(sizeof(svalue_t), 1); svalue_t *val = calloc(sizeof (svalue_t), 1);
CHECK(val); CHECK(val);
svalue_variants_t value_val; svalue_variants_t value_val;
value_val.closure = closure; value_val.closure = closure;
@ -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
@ -107,10 +107,10 @@ make_closure(svalue_t *(*func)(svalue_t*, svalue_t**),
* closure or else it is undefined behavior when it is invoked * closure or else it is undefined behavior when it is invoked
* since it would get deallocated when this function returns * since it would get deallocated when this function returns
*/ */
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));