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 *
box_int(int x) {
svalue_t *val = malloc(sizeof(svalue_t));
svalue_t *val = malloc(sizeof (svalue_t));
CHECK(val);
svalue_variants_t value_val;
value_val.integer = x;
@ -54,7 +54,7 @@ box_int(int x) {
inline svalue_t *
box_float(float x) {
svalue_t *val = malloc(sizeof(svalue_t));
svalue_t *val = malloc(sizeof (svalue_t));
CHECK(val);
svalue_variants_t value_val;
value_val.floating = x;
@ -64,7 +64,7 @@ box_float(float x) {
inline svalue_t *
box_double(double x) {
svalue_t *val = malloc(sizeof(svalue_t));
svalue_t *val = malloc(sizeof (svalue_t));
CHECK(val);
svalue_variants_t value_val;
value_val.doublev = x;
@ -78,7 +78,7 @@ box_string(char *chars, size_t n) {
strval.string = chars;
strval.size = n;
svalue_t *val = malloc(sizeof(svalue_t));
svalue_t *val = malloc(sizeof (svalue_t));
CHECK(val);
svalue_variants_t value_val;
@ -89,7 +89,7 @@ box_string(char *chars, size_t n) {
inline svalue_t *
box_closure(closure_t *closure) {
svalue_t *val = calloc(sizeof(svalue_t), 1);
svalue_t *val = calloc(sizeof (svalue_t), 1);
CHECK(val);
svalue_variants_t value_val;
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**),
svalue_t **fvars) {
/* 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
* 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->fvars = fvars;
return closure;
return box_closure(closure);
}
inline svalue_t*
@ -132,25 +132,24 @@ make_doubleadder_inner_inner(svalue_t *z, svalue_t **env) {
static inline svalue_t*
make_doubleadder_inner(svalue_t *y, svalue_t **env) {
env[1] = y;
closure_t *inner = make_closure(make_doubleadder_inner_inner, env);
return box_closure(inner);
return make_closure(make_doubleadder_inner_inner, env);
}
static svalue_t*
make_doubleadder(svalue_t *x, svalue_t **env) {
env[0] = x;
closure_t *closure = make_closure(make_doubleadder_inner, env);
return box_closure(closure);
return make_closure(make_doubleadder_inner, env);
}
/*svalue_t **env extend(uint32_t n, svalue_t *v*/
int
main(void) {
(void)box_float;
(void)box_double;
(void)box_string;
svalue_t **env = calloc(sizeof(svalue_t *), 2);
closure_t *closure1_closure = make_closure(make_doubleadder, env);
svalue_t *closure1 = box_closure(closure1_closure);
svalue_t **env = calloc(sizeof (svalue_t *), 2);
svalue_t *closure1 = make_closure(make_doubleadder, env);
svalue_t *c1 = invoke(closure1, box_int(23));
svalue_t *c2 = invoke(c1, box_int(5));
svalue_t *result = invoke(c2, box_int(334));