diff options
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 33 |
1 files changed, 30 insertions, 3 deletions
@@ -10,6 +10,8 @@ typedef Datum (*evalfn)(Datum, Datum); Datum strand(Datum, Datum); Datum monadfun(Datum, Datum); +Datum lpar(Datum, Datum); +Datum rpar(Datum, Datum); int bindingstrengths[12][12] = { /* A F H MO DO AF ( ) { } [ ] */ @@ -19,7 +21,7 @@ int bindingstrengths[12][12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* FA */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ( */ + 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, /* ( */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ) */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* { */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* } */ @@ -35,7 +37,7 @@ evalfn evalfns[12][12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* FA */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ( */ + lpar, lpar, lpar, lpar, lpar, lpar, lpar, rpar, lpar, lpar, lpar, lpar, /* ( */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ) */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* { */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* } */ @@ -88,8 +90,11 @@ strand(Datum left, Datum right) { print("Stranding\n"); Datum result; + Array *leftarr = left.array->stranded ? left.array : fnEnclose(left.array); + Array *rightarr = right.array->stranded ? right.array : fnEnclose(right.array); result.tag = ArrayTag; - result.array = fnCatenateFirst(left.array,fnEnclose(right.array)); + result.array = fnCatenateFirst(leftarr, rightarr); + result.array->stranded = 1; return result; } @@ -102,4 +107,26 @@ monadfun(Datum left, Datum right) /* TODO handle undefined functions here */ result.array = monadfunctiondefs[left.code](right.array); return result; +} + +Datum +lpar(Datum left, Datum right) +{ + /* build up a parthenthesised expression */ + 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)); + return left; +} + +Datum +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)); + Datum *result = eval(left.expr.toks, &left.expr.ntoks); + result[0].array->stranded = 0; + return result[0]; /* TODO handle error if ntoks != 1 */ }
\ No newline at end of file |