summaryrefslogtreecommitdiff
path: root/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'print.c')
-rw-r--r--print.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/print.c b/print.c
index 8deac3e..8c3dbbf 100644
--- a/print.c
+++ b/print.c
@@ -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