From 07082593ab4abfbf9a3dd6729cb2e548ec303115 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Fri, 14 Jan 2022 00:31:03 +0000 Subject: =?UTF-8?q?Implement=20code=20for=20running=20operators=20(both=20?= =?UTF-8?q?monadic=20and=20dyadic).=20Also=20implement=20=E2=8D=A8=20and?= =?UTF-8?q?=20=E2=8D=A5=20since=20they=20are=20very=20simple?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- print.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'print.c') 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 -- cgit v1.2.3