From 89a2c19deeb8b45dc8c655e59bc58f7a606ecd2c Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Thu, 16 Feb 2023 09:59:23 +0100 Subject: [PATCH] partial recursivity --- argument.c | 6 ++---- argument.h | 2 +- calc.c | 3 +++ program.c | 19 ++++++++----------- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/argument.c b/argument.c index c8f345f..2c6a93d 100644 --- a/argument.c +++ b/argument.c @@ -20,7 +20,7 @@ double arg (int n) /* set arguments */ -double def (int nbops, element_t **ops) +tab_t *def (int nbops, element_t **ops) { int i; tab_t *new = alloc_tab (nbops); @@ -29,9 +29,7 @@ double def (int nbops, element_t **ops) VERBOSE (DEBUG, fprintf (stdout, "arg[%d] = %g\n", i + i, val)); set_tab (new, i + 1, val); } - free_tab (argument); - argument = new; - return size_tab (argument); + return new; } /* vim: set ts=4 sw=4 et: */ diff --git a/argument.h b/argument.h index 01ae454..9bd8306 100644 --- a/argument.h +++ b/argument.h @@ -11,7 +11,7 @@ extern tab_t *argument; /* argument management */ double arg (int n); -double def (int nbops, element_t **ops); +tab_t *def (int nbops, element_t **ops); #endif /* __ARGUMENT_H__ */ diff --git a/calc.c b/calc.c index 6bac59e..cad608f 100644 --- a/calc.c +++ b/calc.c @@ -412,4 +412,7 @@ int main (int argc, char *argv[]) // Gold number // test: echo -e '{sto (1, 1), sto (2, 1), sto (10, 1), while (inc (10) < 15 - 1, {sto (3, rcl (1) + rcl (2)), sto (1, rcl (2)), print (sto (2, rcl (3)) / rcl (1))})};' | calc.exe | grep -q '=> 1.61803' +// Factorial sequence +// test: echo -e 'prog (1, cond (arg (1) > 1, arg (1) * call (1, arg (1) - 1), 1))\ncall (1, 10)' | ./calc.exe | grep -q '=> 3628800' + /* vim: set ts=4 sw=4 et: */ diff --git a/program.c b/program.c index a6801f8..7db9d40 100644 --- a/program.c +++ b/program.c @@ -81,20 +81,17 @@ double call (int id, int nbargs, element_t **args) VERBOSE (WARNING, fprintf (stdout, "error unknown program (%d)\n", id)); return 0; } - VERBOSE (DEBUG, fprintf (stdout, "id -> n; %d -> %d\n", id, n)); /* set arguments */ - free_tab (argument); - argument = NULL; - VERBOSE (DEBUG, fprintf (stdout, "nbargs; %d\n", nbargs)); - if (nbargs > 0) { - def (nbargs, args); - } + tab_t *old_argument = copy_tab (argument); /* backup context */ workspace_t *tmp = backup_ws (alloc_ws ()); restore_ws (programs[n]); + /* set arguments */ + argument = def (nbargs, args); + /* evaluate program */ answer = 0; element_t *elements = dupelement (programs[n]->root); @@ -102,15 +99,15 @@ double call (int id, int nbargs, element_t **args) VERBOSE (DEBUG, fprintf (stdout, "ret; %g\n", ret)); delelement (elements); - /* clean arguments */ - free_tab (argument); - argument = NULL; - /* restore context */ backup_ws (programs[n]); restore_ws (tmp); free_ws (tmp); + /* clean arguments */ + free_tab (argument); + argument = old_argument; + return ret; } -- 2.30.2