DRY bindingList() extractor
This commit is contained in:
@@ -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)');
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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), [
|
||||||
|
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user