summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c29
1 files changed, 9 insertions, 20 deletions
diff --git a/eval.c b/eval.c
index 3221b4c..ab5dfc7 100644
--- a/eval.c
+++ b/eval.c
@@ -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 */
}