diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-22 20:58:20 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-22 20:58:20 +0000 |
commit | 8299b90052e5fd064567f0bc06ee551970fd48ef (patch) | |
tree | 6d564708a6a50b0dedf8b2401efd7f5b422bcceb /print.c | |
parent | f28544ec25ceee5fe2b783f1980cdf19caf0e977 (diff) |
Implement Agh trains
Diffstat (limited to 'print.c')
-rw-r--r-- | print.c | 18 |
1 files changed, 12 insertions, 6 deletions
@@ -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; } |