diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-22 20:34:21 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-22 20:34:21 +0000 |
commit | f28544ec25ceee5fe2b783f1980cdf19caf0e977 (patch) | |
tree | f4a0658fc30b6c1ea1e7acde8e17985c479a3fce /functions.c | |
parent | 09d3d9272193a809cca535019f34cc5e7a5d4953 (diff) |
Implement fgh and gh trains
Diffstat (limited to 'functions.c')
-rw-r--r-- | functions.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/functions.c b/functions.c index 09e4917..c229322 100644 --- a/functions.c +++ b/functions.c @@ -206,8 +206,12 @@ runfunc(Function f, Array *left, Array *right) throwerror(err, ENotImplemented); } return d(left, right); - }else + }else if(f.type == FunctypeTrain) + return runtrain(f.train.funcs, f.train.nfuncs, left, right, nil); + else{ + throwerror(L"runfunc for this function type", ENotImplemented); return nil; + } } Array * @@ -219,6 +223,51 @@ rundfn(Rune *code, Array *left, Array *right) return runfunc(dfn, left, right); } +Array * +runtrain(Function *funcs, int nfuncs, Array *left, Array *right, Array *acc) +{ + if(nfuncs >= 3 && acc == nil){ + Array *rtmp = runfunc(funcs[nfuncs-1], left, right); + Array *ltmp = runfunc(funcs[nfuncs-3], left, right); + Array *r = simplifyarray(rtmp); + Array *l = simplifyarray(ltmp); + Array *c = runfunc(funcs[nfuncs-2], l, r); + freearray(rtmp); + freearray(ltmp); + freearray(r); + freearray(l); + if(nfuncs == 3) + return c; + else + return runtrain(funcs, nfuncs-3, left, right, c); + }else if(nfuncs >= 2 && acc != nil){ + Array *ltmp = runfunc(funcs[nfuncs-2], left, right); + Array *l = simplifyarray(ltmp); + Array *c = runfunc(funcs[nfuncs-1], l, acc); + freearray(ltmp); + freearray(acc); + freearray(l); + if(nfuncs == 2) + return c; + else + return runtrain(funcs, nfuncs-2, left, right, c); + }else if(nfuncs == 2 && acc == nil){ + Array *rtmp = runfunc(funcs[1], left, right); + Array *r = simplifyarray(rtmp); + Array *c = runfunc(funcs[0], nil, r); + freearray(rtmp); + freearray(r); + return c; + }else if(nfuncs == 1 && acc != nil){ + Array *c = runfunc(funcs[0], nil, acc); + freearray(acc); + return c; + }else{ + throwerror(L"train combination", ENotImplemented); + return nil; + } +} + /* Monadic functions */ Array * |