summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eval.c7
-rw-r--r--functions.c10
-rw-r--r--print.c18
3 files changed, 20 insertions, 15 deletions
diff --git a/eval.c b/eval.c
index f63f5e0..63b5033 100644
--- a/eval.c
+++ b/eval.c
@@ -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;
}
}
diff --git a/print.c b/print.c
index 564956b..7e4c52e 100644
--- a/print.c
+++ b/print.c
@@ -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;
}