DRY bindingList() extractor

This commit is contained in:
2021-01-16 21:26:57 -07:00
parent b5a098e587
commit a0a42e7ffd
3 changed files with 11 additions and 13 deletions

View File

@@ -347,4 +347,13 @@ class Helpers {
begin: (exps:Array<ReaderExp>) -> CallExp(Symbol("begin").withPosOf(posRef), exps).withPosOf(posRef)
};
}
public static function bindingList(exp:ReaderExp, forThis:String):Array<ReaderExp> {
return switch (exp.def) {
case ListExp(bindingExps) if (bindingExps.length > 0 && bindingExps.length % 2 == 0):
bindingExps;
default:
throw CompileError.fromExp(exp, '$forThis bindings should be a list expression with an even number of sub expressions (at least 2)');
};
}
}

View File

@@ -424,13 +424,7 @@ class Macros {
// TODO use expBuilder()
function awaitLet(wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
wholeExp.checkNumArgs(2, null, "(awaitLet [[promise bindings...]] [body...])");
// TODO make a dry bindingList extractor function
var bindingList = switch (exps[0].def) {
case ListExp(bindingExps) if (bindingExps.length > 0 && bindingExps.length % 2 == 0):
bindingExps;
default:
throw CompileError.fromExp(exps[0], 'awaitLet bindings should be a list expression with an even number of sub expressions (at least 2)');
};
var bindingList = exps[0].bindingList("awaitLet");
var firstName = bindingList.shift();
var firstValue = bindingList.shift();
return CallExp(FieldExp("then", firstValue).withPosOf(wholeExp), [

View File

@@ -166,12 +166,7 @@ class SpecialForms {
map["let"] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
wholeExp.checkNumArgs(2, null, "(let [[bindings...]] [body...])");
var bindingList = switch (args[0].def) {
case ListExp(bindingExps) if (bindingExps.length > 0 && bindingExps.length % 2 == 0):
bindingExps;
default:
throw CompileError.fromExp(args[0], 'let bindings should be a list expression with an even number of sub expressions');
};
var bindingList = args[0].bindingList("let");
var bindingPairs = bindingList.groups(2);
var varDefs = [];
for (bindingPair in bindingPairs) {