|
@ -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)); |
|
|