/* 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);
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: */
/* argument management */
double arg (int n);
-double def (int nbops, element_t **ops);
+tab_t *def (int nbops, element_t **ops);
#endif /* __ARGUMENT_H__ */
// 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: */
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);
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;
}