diff options
-rw-r--r-- | eval.c | 7 | ||||
-rw-r--r-- | functions.c | 10 | ||||
-rw-r--r-- | print.c | 18 |
3 files changed, 20 insertions, 15 deletions
@@ -28,7 +28,7 @@ int bindingstrengths[11][11] = { 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* H */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* MO */ 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, /* DO */ - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* AF */ + 3, 2, 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, /* ← */ @@ -43,7 +43,7 @@ evalfn evalfns[11][11] = { 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 */ + monadfun, train, 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, /* ← */ @@ -297,8 +297,7 @@ train(Datum left, Datum right) result.shy = 0; result.tag = FunctionTag; result.func.type = FunctypeTrain; - result.func.left = left.func.left; - + result.func.left = nil; if(left.func.type == FunctypeTrain) result.func = left.func; else{ diff --git a/functions.c b/functions.c index c229322..4b66972 100644 --- a/functions.c +++ b/functions.c @@ -226,7 +226,7 @@ rundfn(Rune *code, Array *left, Array *right) Array * runtrain(Function *funcs, int nfuncs, Array *left, Array *right, Array *acc) { - if(nfuncs >= 3 && acc == nil){ + if(nfuncs >= 3 && acc == nil && !(funcs[0].left != nil && nfuncs == 3)){ Array *rtmp = runfunc(funcs[nfuncs-1], left, right); Array *ltmp = runfunc(funcs[nfuncs-3], left, right); Array *r = simplifyarray(rtmp); @@ -240,7 +240,7 @@ runtrain(Function *funcs, int nfuncs, Array *left, Array *right, Array *acc) return c; else return runtrain(funcs, nfuncs-3, left, right, c); - }else if(nfuncs >= 2 && acc != nil){ + }else if(nfuncs >= 2 && acc != nil && !(funcs[0].left != nil && nfuncs == 2)){ Array *ltmp = runfunc(funcs[nfuncs-2], left, right); Array *l = simplifyarray(ltmp); Array *c = runfunc(funcs[nfuncs-1], l, acc); @@ -254,16 +254,16 @@ runtrain(Function *funcs, int nfuncs, Array *left, Array *right, Array *acc) }else if(nfuncs == 2 && acc == nil){ Array *rtmp = runfunc(funcs[1], left, right); Array *r = simplifyarray(rtmp); - Array *c = runfunc(funcs[0], nil, r); + Array *c = runfunc(funcs[0], funcs[0].left, r); freearray(rtmp); freearray(r); return c; }else if(nfuncs == 1 && acc != nil){ - Array *c = runfunc(funcs[0], nil, acc); + Array *c = runfunc(funcs[0], funcs[0].left, acc); freearray(acc); return c; }else{ - throwerror(L"train combination", ENotImplemented); + throwerror(L"train combination", ESyntax); return nil; } } @@ -16,11 +16,11 @@ ppdatum(Datum d) Rune *result; switch(d.tag){ case ArrayTag: result = pparray(d.array); break; + case BoundFunctionTag: case FunctionTag: result = ppfunction(d.func); break; case HybridTag: result = runesmprint("%C", primhybridnames[d.func.code]); break; case MonadicOpTag: case DyadicOpTag: result = ppoperator(d.operator); break; - case BoundFunctionTag: result = runesmprint("%S∘%S", pparray(d.func.left), ppfunction(d.func)); break; case LParTag: result = runestrdup(L"("); break; case RParTag: result = runestrdup(L")"); break; case ArrowTag: result = runestrdup(L"←"); break; @@ -195,21 +195,26 @@ Rune * ppfunction(Function f) { Rune *result; + Rune *left; + if(f.left) + left = runesmprint("%S∘", pparray(f.left)); + else + left = runestrdup(L""); switch(f.type){ case FunctypePrim: - result = runesmprint("%C", primfuncnames[f.code]); + result = runesmprint("%S%C", left, primfuncnames[f.code]); break; case FunctypeDfn: - result = runesmprint("{%S}", f.dfn); + result = runesmprint("%S{%S}", left, f.dfn); break; case FunctypeOp: - result = runesmprint("%S", ppoperator(f.operator)); + result = runesmprint("%S%S", left, ppoperator(f.operator)); break; case FunctypeQuad: - result = runesmprint("%S", f.quad->name); + result = runesmprint("%S%S", left, f.quad->name); break; case FunctypeTrain: - result = runesmprint(""); + result = runestrdup(left); for(int i = 0; i < f.train.nfuncs; i++){ Rune *tmp = result; Rune *fun = ppfunction(f.train.funcs[i]); @@ -222,6 +227,7 @@ ppfunction(Function f) result = runesmprint("<non printable function type %d>", f.type); break; } + free(left); return result; } |