summaryrefslogtreecommitdiff
path: root/print.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-22 20:58:20 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-22 20:58:20 +0000
commit8299b90052e5fd064567f0bc06ee551970fd48ef (patch)
tree6d564708a6a50b0dedf8b2401efd7f5b422bcceb /print.c
parentf28544ec25ceee5fe2b783f1980cdf19caf0e977 (diff)
Implement Agh trains
Diffstat (limited to 'print.c')
-rw-r--r--print.c18
1 files changed, 12 insertions, 6 deletions
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;
}