From b63ca926df347798ea113d7b197192bd28399f5a Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Thu, 20 Jan 2022 22:53:30 +0000 Subject: =?UTF-8?q?Implement=20guards,=20and=20start=20work=20on=20?= =?UTF-8?q?=E2=86=91=20and=20=E2=86=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eval.c | 74 +++++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 30 deletions(-) (limited to 'eval.c') 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 -- cgit v1.2.3