Browse Source

switch types around to be actually correct

master
nisstyre56 10 years ago
parent
commit
0c4774861f
  1. 15
      RTS.h
  2. 39
      closures.c

15
RTS.h

@ -46,8 +46,8 @@ typedef
*/ */
typedef typedef
struct { struct {
svalue_t *(*func)(svalue_t, svalue_t*); svalue_t *(*func)(svalue_t*, svalue_t**);
svalue_t *fvars; svalue_t **fvars;
} closure_t; } closure_t;
typedef typedef
@ -61,11 +61,11 @@ svalue_t *
box_value(svalue_variants_t, stype_t); box_value(svalue_variants_t, stype_t);
closure_t closure_t
make_closure(svalue_t *(*func)(svalue_t, svalue_t*), make_closure(svalue_t *(*func)(svalue_t*, svalue_t**),
svalue_t*); svalue_t**);
svalue_t * svalue_t *
invoke(closure_t, svalue_t); invoke(closure_t, svalue_t*);
inline svalue_t * inline svalue_t *
@ -86,7 +86,10 @@ box_closure(closure_t);
#ifndef LIB #ifndef LIB
static svalue_t* static svalue_t*
make_adder_inner(svalue_t, svalue_t *); make_doubleadder_inner_inner(svalue_t*, svalue_t **);
static svalue_t*
make_adder_inner(svalue_t*, svalue_t **);
static closure_t static closure_t
make_adder(svalue_t *); make_adder(svalue_t *);

39
closures.c

@ -89,8 +89,8 @@ box_closure(closure_t closure) {
inline closure_t inline closure_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) {
closure_t closure; closure_t closure;
closure.func = func; closure.func = func;
closure.fvars = fvars; closure.fvars = fvars;
@ -98,33 +98,54 @@ make_closure(svalue_t *(*func)(svalue_t, svalue_t*),
} }
inline svalue_t* inline svalue_t*
invoke(closure_t closure, svalue_t val) { invoke(closure_t closure, svalue_t *val) {
svalue_t *(*func)(svalue_t, svalue_t*) = closure.func; svalue_t *(*func)(svalue_t*, svalue_t**) = closure.func;
return func(val, closure.fvars); return func(val, closure.fvars);
} }
#ifndef LIB #ifndef LIB
static svalue_t* static svalue_t*
make_adder_inner(svalue_t x, svalue_t *env) { make_adder_inner(svalue_t *x, svalue_t **env) {
svalue_variants_t val; svalue_variants_t val;
val.integer = env[0].value.integer + x.value.integer; val.integer = env[0]->value.integer + x->value.integer;
return box_value(val, INT); return box_value(val, INT);
} }
static closure_t static closure_t
make_adder(svalue_t *inc) { make_adder(svalue_t *inc) {
closure_t closure = make_closure(make_adder_inner, inc); svalue_t **env = calloc(sizeof(svalue_t *), 2);
CHECK(env);
env[0] = inc;
closure_t closure = make_closure(make_adder_inner, env);
return closure; return closure;
} }
static svalue_t*
make_doubleadder_inner_inner(svalue_t *z, svalue_t **env) {
int x,y;
x = env[0]->value.integer;
y = env[1]->value.integer;
z->value.integer = x + y + z->value.integer;
return box_value(z->value, INT);
}
static 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);
}
int int
main(void) { main(void) {
closure_t add2 = make_adder(box_int(2)); (void)make_adder;
printf("%d\n", invoke(add2, *box_int(5))->value.integer);
(void)box_float; (void)box_float;
(void)box_double; (void)box_double;
(void)box_string; (void)box_string;
(void)box_closure; (void)box_closure;
(void)make_doubleadder_inner_inner;
(void)make_doubleadder_inner;
return 0; return 0;
} }
#endif #endif