summaryrefslogtreecommitdiff
path: root/functions.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-22 20:34:21 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-22 20:34:21 +0000
commitf28544ec25ceee5fe2b783f1980cdf19caf0e977 (patch)
treef4a0658fc30b6c1ea1e7acde8e17985c479a3fce /functions.c
parent09d3d9272193a809cca535019f34cc5e7a5d4953 (diff)
Implement fgh and gh trains
Diffstat (limited to 'functions.c')
-rw-r--r--functions.c51
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 *