From a421bdd011a78050df972b6f5011866b4351cff7 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sat, 16 Jan 2021 21:26:57 -0700 Subject: [PATCH] DRY bindingList() extractor --- kiss/src/kiss/Helpers.hx | 9 +++++++++ kiss/src/kiss/Macros.hx | 8 +------- kiss/src/kiss/SpecialForms.hx | 7 +------ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/kiss/src/kiss/Helpers.hx b/kiss/src/kiss/Helpers.hx index 2d45380d..bb8375ed 100644 --- a/kiss/src/kiss/Helpers.hx +++ b/kiss/src/kiss/Helpers.hx @@ -347,4 +347,13 @@ class Helpers { begin: (exps:Array) -> CallExp(Symbol("begin").withPosOf(posRef), exps).withPosOf(posRef) }; } + + public static function bindingList(exp:ReaderExp, forThis:String):Array { + 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)'); + }; + } } diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index 24443217..cc0ecaea 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -424,13 +424,7 @@ class Macros { // TODO use expBuilder() function awaitLet(wholeExp:ReaderExp, exps:Array, 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), [ diff --git a/kiss/src/kiss/SpecialForms.hx b/kiss/src/kiss/SpecialForms.hx index 731cb689..7d697e00 100644 --- a/kiss/src/kiss/SpecialForms.hx +++ b/kiss/src/kiss/SpecialForms.hx @@ -166,12 +166,7 @@ class SpecialForms { map["let"] = (wholeExp:ReaderExp, args:Array, 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) {