diff options
Diffstat (limited to 'print.c')
-rw-r--r-- | print.c | 31 |
1 files changed, 27 insertions, 4 deletions
@@ -13,17 +13,21 @@ ppdatum(Datum d) case FunctionTag: if(d.func.type == FunctypePrim) result = runesmprint("%C", primfuncnames[d.func.code]); - else + else if(d.func.type == FunctypeDfn) result = runesmprint("{%S}", d.func.dfn); + else + result = runesmprint("%S", ppoperator(d.func.operator)); break; case HybridTag: result = runesmprint("%C", primhybridnames[d.func.code]); break; - case MonadicOpTag: result = runesmprint("%C", primmonopnames[d.func.code]); break; - case DyadicOpTag: result = runesmprint("%C", primdyadopnames[d.func.code]); break; + case MonadicOpTag: + case DyadicOpTag: result = ppoperator(d.operator); break; case BoundFunctionTag: if(d.func.type == FunctypePrim) result = runesmprint("%S∘%C", pparray(d.func.left), primfuncnames[d.func.code]); - else + else if(d.func.type == FunctypeDfn) result = runesmprint("%S∘{%S}", pparray(d.func.left), d.func.dfn); + else + result = runesmprint("%S∘%S", pparray(d.func.left), ppoperator(d.func.operator)); break; case LParTag: result = runestrdup(L"("); break; case RParTag: result = runestrdup(L")"); break; @@ -90,4 +94,23 @@ pparray(Array *a) } } return res; +} + +Rune * +ppoperator(Operator op) +{ + Rune *left = op.left ? ppdatum(*op.left) : runestrdup(L""); + Rune *right = op.right ? ppdatum(*op.right) : runestrdup(L""); + Rune *res; + if(op.type == OperatortypeDop) + res = runesmprint("(%S{%S}%S)", left, op.dop, right); + else{ + res = runesmprint("(%S%C%S)", + left, + op.dyadic ? primdyadopnames[op.code] : primmonopnames[op.code], + right); + } + free(left); + free(right); + return res; }
\ No newline at end of file |