From 6786822dd4f50b16c12b0f5020c89c46b57a10b0 Mon Sep 17 00:00:00 2001 From: nisstyre56 Date: Fri, 17 Oct 2014 21:42:46 -0400 Subject: [PATCH] change over stuff to new arguments format --- RTS.c | 33 +++++++++++++++++---------------- RTS.h | 9 ++++++--- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/RTS.c b/RTS.c index d12f8a1..e4328f7 100644 --- a/RTS.c +++ b/RTS.c @@ -7,13 +7,13 @@ /* Test case stuff */ #ifndef LIB static svalue_t* -make_doubleadder_inner_inner(svalue_t *, svalue_t **); +make_doubleadder_inner_inner(svalue_t **, svalue_t **); static svalue_t* -make_doubleadder_inner(svalue_t *, svalue_t **); +make_doubleadder_inner(svalue_t **, svalue_t **); static svalue_t* -make_doubleadder(svalue_t *, svalue_t **); +make_doubleadder(svalue_t **, svalue_t **); #endif inline svalue_t @@ -126,7 +126,7 @@ box_pair(svalue_t *left, svalue_t *right) { } inline svalue_t* -make_closure(svalue_t *(*func)(svalue_t*, svalue_t**), +make_closure(svalue_t *(*func)(svalue_t**, svalue_t**), svalue_t **fvars) { /* The reason we dynamically allocate here is because * svalue_variants_t will hold a pointer to the closure @@ -141,8 +141,8 @@ make_closure(svalue_t *(*func)(svalue_t*, svalue_t**), } inline svalue_t* -invoke(svalue_t *closure, svalue_t *val) { - return closure->value.closure->func(val, closure->value.closure->fvars); +invoke(svalue_t *closure, svalue_t **arguments) { + return closure->value.closure->func(arguments, closure->value.closure->fvars); } /* @@ -157,23 +157,23 @@ invoke(svalue_t *closure, svalue_t *val) { /* More testing stuff */ #ifndef LIB static inline svalue_t* -make_doubleadder_inner_inner(svalue_t *z, svalue_t **env) { +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_int(z->value.integer); + z[0]->value.integer = x + y + (z[0]->value.integer); + return box_int(z[0]->value.integer); } static inline svalue_t* -make_doubleadder_inner(svalue_t *y, svalue_t **env) { - env[1] = y; +make_doubleadder_inner(svalue_t **y, svalue_t **env) { + env[1] = *y; return make_closure(make_doubleadder_inner_inner, env); } static svalue_t* -make_doubleadder(svalue_t *x, svalue_t **env) { - env[0] = x; +make_doubleadder(svalue_t **x, svalue_t **env) { + env[0] = *x; return make_closure(make_doubleadder_inner, env); } @@ -189,15 +189,16 @@ main(void) { /* Get the final closure */ svalue_t *closure1 = make_closure(make_doubleadder, env); /* Invoke the closure that the closure returns */ - svalue_t *c1 = invoke(closure1, box_int(23)); - svalue_t *c2 = invoke(c1, box_int(5)); - svalue_t *result = invoke(c2, box_int(334)); + svalue_t *c1 = invoke(closure1, &box_int(23)); + svalue_t *c2 = invoke(c1, &box_int(5)); + svalue_t *result = invoke(c2, &box_int(334)); /* The final result */ printf("print 23 + 5 + 334 == %d\n", result->value.integer); svalue_t *a = box_int(123); svalue_t *b = box_int(455); svalue_t *improper = box_pair(a, b); improper->value.pair.right = improper; + /* woo cyclic pair */ printf("(%d, %d)\n", improper->value.pair.left->value.integer, improper->value.pair.right->value.pair.left->value.integer); return 0; } diff --git a/RTS.h b/RTS.h index 7934aca..6d7e2df 100644 --- a/RTS.h +++ b/RTS.h @@ -55,7 +55,7 @@ typedef */ typedef struct sc_closure_t { - svalue_t *(*func)(svalue_t*, svalue_t**); + svalue_t *(*func)(svalue_t**, svalue_t**); svalue_t **fvars; } sc_closure_t; @@ -63,11 +63,11 @@ svalue_t box_value(svalue_variants_t, stype_t); svalue_t* -make_closure(svalue_t *(*func)(svalue_t*, svalue_t**), +make_closure(svalue_t *(*func)(svalue_t**, svalue_t**), svalue_t**); svalue_t * -invoke(svalue_t*, svalue_t*); +invoke(svalue_t*, svalue_t**); svalue_t * @@ -85,3 +85,6 @@ box_string(char *, svalue_t * box_closure(sc_closure_t*); + +svalue_t * +box_pair(svalue_t*, svalue_t*);