summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-10 19:32:39 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-10 19:32:39 +0000
commit6c964eb54c0056d14a1b929dc09c75240a585cea (patch)
tree3c57d83be54c151f5a7f5b9596e87b5e425982fc /eval.c
parent0b8bd8e88f2620992310c7ba41283f5d9120e371 (diff)
Implement ( expr ) and improve stranding
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/eval.c b/eval.c
index da49137..1ee7033 100644
--- a/eval.c
+++ b/eval.c
@@ -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