allow &rest :Array<Dynamic>
This commit is contained in:
@@ -169,12 +169,29 @@ class Helpers {
|
|||||||
throw KissError.fromExp(funcArg, "lambda does not support &rest arguments");
|
throw KissError.fromExp(funcArg, "lambda does not support &rest arguments");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var typeOfRestArg = explicitTypeString(funcArg);
|
||||||
|
var isDynamicArray = switch (typeOfRestArg) {
|
||||||
|
case "Array<Dynamic>" | "kiss.List<Dynamic>" | "List<Dynamic>":
|
||||||
|
true;
|
||||||
|
default:
|
||||||
|
false;
|
||||||
|
};
|
||||||
|
|
||||||
// rest arguments define a Kiss special form with the function's name that wraps
|
// rest arguments define a Kiss special form with the function's name that wraps
|
||||||
// the rest args in a list when calling it from Kiss
|
// the rest args in a list when calling it from Kiss
|
||||||
k.specialForms[funcName] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
|
k.specialForms[funcName] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
|
||||||
var realCallArgs = args.slice(0, numArgs);
|
var realCallArgs = args.slice(0, numArgs);
|
||||||
var restArgs = args.slice(numArgs);
|
var restArgs = args.slice(numArgs);
|
||||||
realCallArgs.push(ListExp(restArgs).withPosOf(wholeExp));
|
var arg = if (isDynamicArray) {
|
||||||
|
var b = funcArg.expBuilder();
|
||||||
|
b.let([b.typed("Array<Dynamic>", b.symbol("args")), b.list([])], [
|
||||||
|
for (arg in restArgs)
|
||||||
|
b.callField("push", b.symbol("args"), [arg])
|
||||||
|
].concat([b.symbol("args")]));
|
||||||
|
} else {
|
||||||
|
ListExp(restArgs).withPosOf(wholeExp);
|
||||||
|
}
|
||||||
|
realCallArgs.push(arg);
|
||||||
ECall(k.convert(Symbol(funcName).withPosOf(wholeExp)), realCallArgs.map(k.convert)).withMacroPosOf(wholeExp);
|
ECall(k.convert(Symbol(funcName).withPosOf(wholeExp)), realCallArgs.map(k.convert)).withMacroPosOf(wholeExp);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user