Start making macros portable

This commit is contained in:
2025-11-14 13:38:36 -06:00
parent 050a5fbf66
commit d291037059
2 changed files with 39 additions and 10 deletions

View File

@@ -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<ReaderExp>, k:KissState) -> {
m(wholeExp, exps);
};
}
function destructiveVersion(op:String, assignOp:String) {
k.doc(assignOp, 2, null, '($assignOp <var> <v1> <values...>)');
macros[assignOp] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, 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("%", "%=");

View File

@@ -0,0 +1,31 @@
package kiss;
using kiss.ExpBuilder;
typedef PortableMacroFunction = (ReaderExp, Array<ReaderExp>)->ReaderExp;
class PortableMacros {
public static function builtins():Map<String,PortableMacroFunction> {
var m = new Map<String,PortableMacroFunction>();
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<ReaderExp>) -> {
var b = wholeExp.expBuilder();
b.call(
b.symbol("set"), [
exps[0],
b.call(
b.symbol(op),
exps)
]);
};
}
}