diff options
-rw-r--r-- | apl9.h | 1 | ||||
-rw-r--r-- | eval.c | 17 | ||||
-rw-r--r-- | main.c | 9 |
3 files changed, 19 insertions, 8 deletions
@@ -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 */ @@ -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 */ @@ -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"); |