diff options
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 29 |
1 files changed, 9 insertions, 20 deletions
@@ -14,8 +14,7 @@ typedef Datum (*evalfn)(Datum, Datum); Datum strand(Datum, Datum); Datum monadfun(Datum, Datum); Datum dyadfun(Datum, Datum); -Datum lpar(Datum, Datum); -Datum rpar(Datum, Datum); +Datum parens(Datum, Datum); Datum nameis(Datum, Datum); Datum assign(Datum, Datum); Datum *lookup(Datum); @@ -28,13 +27,13 @@ int bindingstrengths[13][13] = { 0, 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, 0, /* DO */ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AF */ - 5, 5, 5, 5, 5, 5, 0, 6, 5, 5, 5, 5, 5, /* ( */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ) */ + 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, /* ( */ + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, /* ) */ 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, 0, 0, 0, /* ← */ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* IS */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, /* N */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, /* N */ }; evalfn evalfns[13][13] = { @@ -45,7 +44,7 @@ evalfn evalfns[13][13] = { 0, 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, 0, /* DO */ monadfun, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AF */ - lpar, lpar, lpar, lpar, lpar, 0, lpar, rpar, lpar, lpar, lpar, lpar, lpar, /* ( */ + 0, 0, 0, 0, 0, 0, 0, parens, 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, 0, 0, 0, 0, 0, 0, 0, 0, /* ] */ @@ -191,24 +190,14 @@ dyadfun(Datum left, Datum right) } Datum -lpar(Datum left, Datum right) -{ - /* build up a parthenthesised expression */ - left.stmt.ntoks++; - left.stmt.toks = realloc(left.stmt.toks, sizeof(Datum) * left.stmt.ntoks); - left.stmt.toks[left.stmt.ntoks-1] = right; - traceprint("LPAR: %S\n", ppdatums(left.stmt.toks, left.stmt.ntoks)); - return left; -} - -Datum -rpar(Datum left, Datum right) +parens(Datum left, Datum right) { /* evaluate a parenthesis expression and return the result */ USED(right); - traceprint("RPAR: %S\n", ppdatums(left.stmt.toks, left.stmt.ntoks)); + traceprint("PARENS: %S\n", ppdatums(left.stmt.toks, left.stmt.ntoks)); Datum *result = eval(&left.stmt); - result[0].array->stranded = 0; + if(result[0].tag == ArrayTag) + result[0].array->stranded = 0; return result[0]; /* TODO handle error if ntoks != 1 */ } |