Start making macros portable
This commit is contained in:
@@ -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("%", "%=");
|
||||
|
||||
31
src/kiss/PortableMacros.hx
Normal file
31
src/kiss/PortableMacros.hx
Normal 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)
|
||||
]);
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user