DRY bindingList() extractor

This commit is contained in:
2021-01-16 21:26:57 -07:00
parent 09ee5b4b23
commit a421bdd011
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) 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() // TODO use expBuilder()
function awaitLet(wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) { function awaitLet(wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
wholeExp.checkNumArgs(2, null, "(awaitLet [[promise bindings...]] [body...])"); wholeExp.checkNumArgs(2, null, "(awaitLet [[promise bindings...]] [body...])");
// TODO make a dry bindingList extractor function var bindingList = exps[0].bindingList("awaitLet");
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 firstName = bindingList.shift(); var firstName = bindingList.shift();
var firstValue = bindingList.shift(); var firstValue = bindingList.shift();
return CallExp(FieldExp("then", firstValue).withPosOf(wholeExp), [ return CallExp(FieldExp("then", firstValue).withPosOf(wholeExp), [

View File

@@ -166,12 +166,7 @@ class SpecialForms {
map["let"] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> { map["let"] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
wholeExp.checkNumArgs(2, null, "(let [[bindings...]] [body...])"); wholeExp.checkNumArgs(2, null, "(let [[bindings...]] [body...])");
var bindingList = switch (args[0].def) { var bindingList = args[0].bindingList("let");
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 bindingPairs = bindingList.groups(2); var bindingPairs = bindingList.groups(2);
var varDefs = []; var varDefs = [];
for (bindingPair in bindingPairs) { for (bindingPair in bindingPairs) {