summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apl9.h1
-rw-r--r--eval.c17
-rw-r--r--main.c9
3 files changed, 19 insertions, 8 deletions
diff --git a/apl9.h b/apl9.h
index 415620d..9de7b12 100644
--- a/apl9.h
+++ b/apl9.h
@@ -105,6 +105,7 @@ Array *fnCatenateFirst(Array *, Array *);
Array *fnReshape(Array *, Array *);
/* Global variables */
+extern int traceeval; /* eval.c */
extern Rune *errormsg; /* eval.c */
extern int datasizes[]; /* array.c */
extern Rune primfuncnames[]; /* function.c */
diff --git a/eval.c b/eval.c
index 1ff40ce..4f228a7 100644
--- a/eval.c
+++ b/eval.c
@@ -4,7 +4,10 @@
#include "apl9.h"
+#define traceprint if(traceeval)print
+
Rune *errormsg;
+int traceeval;
typedef Datum (*evalfn)(Datum, Datum);
@@ -53,7 +56,7 @@ eval(Datum *tokens, int *ntoks)
int maxlevel = 0;
int offset;
evalfn fn = nil;
- print("CURRENT: %S\n", ppdatums(tokens, *ntoks));
+ traceprint("CURRENT: %S\n", ppdatums(tokens, *ntoks));
for(offset = (*ntoks)-1; offset >= 0; offset--){
int level;
if(offset == 0)
@@ -67,7 +70,7 @@ eval(Datum *tokens, int *ntoks)
Datum left = tokens[offset];
Datum right = tokens[offset+1];
fn = evalfns[left.tag][right.tag];
- print("Reducing %S and %S\n", ppdatum(left), ppdatum(right));
+ traceprint("Reducing %S and %S\n", ppdatum(left), ppdatum(right));
break;
}else if(level > maxlevel)
maxlevel = level;
@@ -88,7 +91,7 @@ eval(Datum *tokens, int *ntoks)
Datum
strand(Datum left, Datum right)
{
- print("Stranding\n");
+ traceprint("Stranding\n");
Datum result;
Array *leftarr = left.array->stranded ? left.array : fnEnclose(left.array);
Array *rightarr = right.array->stranded ? right.array : fnEnclose(right.array);
@@ -101,7 +104,7 @@ strand(Datum left, Datum right)
Datum
monadfun(Datum left, Datum right)
{
- print("Monadic function application\n");
+ traceprint("Monadic function application\n");
Datum result;
result.tag = ArrayTag;
@@ -116,7 +119,7 @@ monadfun(Datum left, Datum right)
Datum
dyadfun(Datum left, Datum right)
{
- print("Applying left argument to function\n");
+ traceprint("Applying left argument to function\n");
Datum result;
result.tag = BoundFunctionTag,
result.func = right.func;
@@ -131,7 +134,7 @@ lpar(Datum left, Datum right)
left.expr.ntoks++;
left.expr.toks = realloc(left.expr.toks, sizeof(Datum) * left.expr.ntoks);
left.expr.toks[left.expr.ntoks-1] = right;
- print("LPAR: %S\n", ppdatums(left.expr.toks, left.expr.ntoks));
+ traceprint("LPAR: %S\n", ppdatums(left.expr.toks, left.expr.ntoks));
return left;
}
@@ -140,7 +143,7 @@ rpar(Datum left, Datum right)
{
/* evaluate a parenthesis expression and return the result */
USED(right);
- print("RPAR: %S\n", ppdatums(left.expr.toks, left.expr.ntoks));
+ traceprint("RPAR: %S\n", ppdatums(left.expr.toks, left.expr.ntoks));
Datum *result = eval(left.expr.toks, &left.expr.ntoks);
result[0].array->stranded = 0;
return result[0]; /* TODO handle error if ntoks != 1 */
diff --git a/main.c b/main.c
index b2867c9..55ab340 100644
--- a/main.c
+++ b/main.c
@@ -10,10 +10,17 @@ Datum *evalline(Rune *);
Biobuf *stdin;
void
-main(void)
+main(int argc, char *argv[])
{
int off = 0;
stdin = Bfdopen(0, OREAD);
+ traceeval = 0;
+
+ ARGBEGIN{
+ case 't':
+ traceeval = 1;
+ break;
+ }ARGEND
while(!off){
Rune *input = prompt(L"\t");