// 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'
+// test: echo -e 'prog (1, cond (arg (1) > 1, arg (1) * call (1, arg (1) - 1), 1))\ncall (1, 10)' | calc.exe | grep -q '=> 3.6288e+06'
/* vim: set ts=4 sw=4 et: */
double call (int id, int nbargs, element_t **args)
{
+ int i;
double ret = 0;
+ VERBOSE (DEBUG, fprintf (stdout, "new call (%d)\n", id));
+
/* look for program */
int n = lookfor_program (id);
if (n == -1) {
return 0;
}
- /* set arguments */
- VERBOSE (DEBUG, fprintf (stdout, "1 arg[0]: %g\n", get_tab (argument, 1)));
- tab_t *old_argument = copy_tab (argument);
+ /* display debug information */
+ VERBOSE (DEBUG, fprintf (stdout, "nbargs: %d\n", nbargs));
+ for (i = 0; i < nbargs; i++) {
+ VERBOSE (DEBUG, fprintf (stdout, "argument %d\n", i + 1); print_element (args[i], 0));
+ }
+ VERBOSE (DEBUG, fprintf (stdout, "program\n"); print_element (programs[n]->root, 0));
/* backup context */
workspace_t *tmp = backup_ws (alloc_ws ());
restore_ws (programs[n]);
- VERBOSE (DEBUG, fprintf (stdout, "2 arg[0]: %g\n", get_tab (argument, 1)));
/* set arguments */
- argument = def (nbargs, args);
- VERBOSE (DEBUG, fprintf (stdout, "3 arg[0]: %g\n", get_tab (argument, 1)));
+ VERBOSE (DEBUG, fprintf (stdout, "argument before evaluation (%d)\n", size_tab (argument)));
+ for (i = 0; i < size_tab (argument); i++) {
+ VERBOSE (DEBUG, fprintf (stdout, "arg %d value: %g\n", i + 1, get_tab (argument, i + 1)));
+ }
+ VERBOSE (DEBUG, fprintf (stdout, "evaluate %d args\n", nbargs));
+ tab_t *new_argument = def (nbargs, args);
+ tab_t *old_argument = argument;
+ argument = new_argument;
+ VERBOSE (DEBUG, fprintf (stdout, "argument after evaluation (%d)\n", size_tab (argument)));
+ for (i = 0; i < size_tab (argument); i++) {
+ VERBOSE (DEBUG, fprintf (stdout, "arg %d value: %g\n", i + 1, get_tab (argument, i + 1)));
+ }
/* evaluate program */
answer = 0;
element_t *elements = dupelement (programs[n]->root);
- VERBOSE (DEBUG, fprintf (stdout, "4 arg[0]: %g\n", get_tab (argument, 1)));
ret = evaluate_element (elements, 0);
VERBOSE (DEBUG, fprintf (stdout, "ret; %g\n", ret));
- VERBOSE (DEBUG, fprintf (stdout, "5 arg[0]: %g\n", get_tab (argument, 1)));
delelement (elements);
/* restore context */
backup_ws (programs[n]);
restore_ws (tmp);
free_ws (tmp);
- VERBOSE (DEBUG, fprintf (stdout, "6 arg[0]: %g\n", get_tab (argument, 1)));
/* clean arguments */
free_tab (argument);
argument = old_argument;
- VERBOSE (DEBUG, fprintf (stdout, "7 arg[0]: %g\n", get_tab (argument, 1)));
return ret;
}