summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c74
1 files changed, 44 insertions, 30 deletions
diff --git a/eval.c b/eval.c
index 3958a98..7d9afbe 100644
--- a/eval.c
+++ b/eval.c
@@ -21,38 +21,34 @@ Datum monadop(Datum, Datum);
Datum dyadop(Datum, Datum);
Datum *lookup(Datum);
-int bindingstrengths[13][13] = {
-/* A F H MO DO AF ( ) [ ] ← IS N */
- 6, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A */
- 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* F */
- 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* H */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */
- 5, 5, 5, 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 */
- 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, /* ( */
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, /* ) */
- 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, 8, 0, 0, /* N */
+int bindingstrengths[11][11] = {
+/* A F H MO DO AF ( ) ← IS N */
+ 6, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* A */
+ 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* F */
+ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* H */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */
+ 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AF */
+ 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, /* ( */
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, /* ) */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ← */
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* IS */
+ 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, /* N */
};
-evalfn evalfns[13][13] = {
-/* A F H MO DO AF ( ) [ ] ← IS N */
- strand, dyadfun, 0, monadop, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A */
- monadfun, 0, 0, monadop, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* F */
- 0, 0, 0, monadop, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* H */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */
- dyadop, dyadop, dyadop, 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 */
- 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, /* ] */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ← */
- assign, assign, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* IS */
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nameis, 0, 0, /* N */
+evalfn evalfns[11][11] = {
+/* A F H MO DO AF ( ) ← IS N */
+ strand, dyadfun, 0, monadop, 0, 0, 0, 0, 0, 0, 0, /* A */
+ monadfun, 0, 0, monadop, 0, 0, 0, 0, 0, 0, 0, /* F */
+ 0, 0, 0, monadop, 0, 0, 0, 0, 0, 0, 0, /* H */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */
+ dyadop, dyadop, dyadop, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */
+ monadfun, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AF */
+ 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, /* ← */
+ assign, assign, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* IS */
+ 0, 0, 0, 0, 0, 0, 0, 0, nameis, 0, 0, /* N */
};
Datum *
@@ -107,6 +103,7 @@ retry:
return nil;
}else{
Datum new = fn(stmt->toks[offset],stmt->toks[offset+1]);
+ traceprint("handler fn done\n");
if(stmt->toks[offset].tag == ArrayTag)
freearray(stmt->toks[offset].array);
if(stmt->toks[offset+1].tag == ArrayTag)
@@ -125,6 +122,23 @@ retry:
}
}
if(stmt->ntoks == 1){
+ if(stmt->guard){
+ int guardOK = 1;
+ if(stmt->toks[0].tag != ArrayTag)
+ guardOK = 0;
+ else if(stmt->toks[0].array->size != 1)
+ guardOK = 0;
+ else if(stmt->toks[0].array->type != AtypeInt)
+ guardOK = 0;
+ else if(stmt->toks[0].array->intdata[0] != 0 && stmt->toks[0].array->intdata[0] != 1)
+ guardOK = 0;
+ if(!guardOK){
+ print("Guard expected single valued boolean\n");
+ exits(nil);
+ }
+ if(stmt->toks[0].array->intdata[0] == 1)
+ return eval(stmt->guard);
+ }
if(stmt->next)
return eval(stmt->next);
else