diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-20 22:53:30 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-20 22:53:30 +0000 |
commit | b63ca926df347798ea113d7b197192bd28399f5a (patch) | |
tree | 18f4161678fe0d7239e4ebb735ab76cdb24745dd /eval.c | |
parent | 35f20421e7a4942b61c4a1910e8da0bf35f21fd9 (diff) |
Implement guards, and start work on ↑ and ↓
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 74 |
1 files changed, 44 insertions, 30 deletions
@@ -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 |