From d29103705906c14fbb0b2415c773f146565757c6 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Fri, 14 Nov 2025 13:38:36 -0600 Subject: [PATCH] Start making macros portable --- src/kiss/Macros.hx | 18 ++++++++---------- src/kiss/PortableMacros.hx | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 src/kiss/PortableMacros.hx diff --git a/src/kiss/Macros.hx b/src/kiss/Macros.hx index beb0475..5d15ad5 100644 --- a/src/kiss/Macros.hx +++ b/src/kiss/Macros.hx @@ -8,6 +8,7 @@ import kiss.ReaderExp; import kiss.Kiss; import kiss.KissError; import kiss.Helpers; +import kiss.PortableMacros; import uuid.Uuid; import hscript.Parser; import haxe.EnumTools; @@ -62,18 +63,15 @@ class Macros { Kiss.load(otherKissFile, k, libPath, false, wholeExp); }; + function wrapPortable(m:PortableMacroFunction) { + return (wholeExp:ReaderExp, exps:Array, k:KissState) -> { + m(wholeExp, exps); + }; + } + function destructiveVersion(op:String, assignOp:String) { k.doc(assignOp, 2, null, '($assignOp )'); - macros[assignOp] = (wholeExp:ReaderExp, exps:Array, k) -> { - var b = wholeExp.expBuilder(); - b.call( - b.symbol("set"), [ - exps[0], - b.call( - b.symbol(op), - exps) - ]); - }; + macros[assignOp] = wrapPortable(PortableMacros.destructiveVersion(op)); } destructiveVersion("%", "%="); diff --git a/src/kiss/PortableMacros.hx b/src/kiss/PortableMacros.hx new file mode 100644 index 0000000..c4a3100 --- /dev/null +++ b/src/kiss/PortableMacros.hx @@ -0,0 +1,31 @@ +package kiss; + +using kiss.ExpBuilder; + +typedef PortableMacroFunction = (ReaderExp, Array)->ReaderExp; + +class PortableMacros { + public static function builtins():Map { + var m = new Map(); + m["%="] = destructiveVersion("%"); + m["^="] = destructiveVersion("^"); + m["+="] = destructiveVersion("+"); + m["-="] = destructiveVersion("-"); + m["*="] = destructiveVersion("*"); + m["/="] = destructiveVersion("/"); + return m; + } + + public static function destructiveVersion(op:String) { + return (wholeExp:ReaderExp, exps:Array) -> { + var b = wholeExp.expBuilder(); + b.call( + b.symbol("set"), [ + exps[0], + b.call( + b.symbol(op), + exps) + ]); + }; + } +} \ No newline at end of file