From f28544ec25ceee5fe2b783f1980cdf19caf0e977 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Sat, 22 Jan 2022 20:34:21 +0000 Subject: Implement fgh and gh trains --- eval.c | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 86d0d15..f63f5e0 100644 --- a/eval.c +++ b/eval.c @@ -18,27 +18,28 @@ Datum nameis(Datum, Datum); Datum assign(Datum, Datum); Datum monadop(Datum, Datum); Datum dyadop(Datum, Datum); +Datum train(Datum, Datum); Datum *lookup(Datum); int bindingstrengths[11][11] = { /* A F H MO DO AF ( ) ← IS N */ - 6, 3, 3, 4, 0, 0, 0, 0, 0, 0, 0, /* A */ - 2, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, /* F */ - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* H */ + 7, 4, 4, 5, 0, 0, 0, 0, 0, 0, 0, /* A */ + 3, 2, 5, 5, 0, 0, 0, 0, 0, 0, 0, /* F */ + 0, 0, 0, 5, 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, /* ) */ + 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */ + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AF */ + 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, /* ( */ + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, /* ) */ 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 */ + 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, /* N */ }; evalfn evalfns[11][11] = { /* A F H MO DO AF ( ) ← IS N */ strand, dyadfun, dyadfun, monadop, 0, 0, 0, 0, 0, 0, 0, /* A */ - monadfun, 0, monadop, monadop, 0, 0, 0, 0, 0, 0, 0, /* F */ + monadfun, train, monadop, 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 */ @@ -287,4 +288,35 @@ dyadop(Datum left, Datum right) if(arg->tag == ArrayTag) incref(arg->array); return result; +} + +Datum +train(Datum left, Datum right) +{ + Datum result; + result.shy = 0; + result.tag = FunctionTag; + result.func.type = FunctypeTrain; + result.func.left = left.func.left; + + if(left.func.type == FunctypeTrain) + result.func = left.func; + else{ + result.func.train.nfuncs = 1; + result.func.train.funcs = malloc(sizeof(Function)); + result.func.train.funcs[0] = left.func; + } + + if(right.func.type == FunctypeTrain){ + int oldn = result.func.train.nfuncs; + result.func.train.nfuncs = oldn + right.func.train.nfuncs; + result.func.train.funcs = realloc(result.func.train.funcs, sizeof(Function) * result.func.train.nfuncs); + for(int i = 0; i < right.func.train.nfuncs; i++) + result.func.train.funcs[oldn + i] = right.func.train.funcs[i]; + }else{ + result.func.train.nfuncs++; + result.func.train.funcs = realloc(result.func.train.funcs, sizeof(Function) * result.func.train.nfuncs); + result.func.train.funcs[result.func.train.nfuncs-1] = right.func; + } + return result; } \ No newline at end of file -- cgit v1.2.3