diff --git a/src/kiss/FieldForms.hx b/src/kiss/FieldForms.hx index 5a32853..82b04a8 100644 --- a/src/kiss/FieldForms.hx +++ b/src/kiss/FieldForms.hx @@ -8,6 +8,7 @@ import kiss.Stream; import kiss.CompileError; import kiss.Kiss; +using kiss.Kiss; using kiss.Helpers; using kiss.Reader; using StringTools; diff --git a/src/kiss/Helpers.hx b/src/kiss/Helpers.hx index 9fc9bba..d631316 100644 --- a/src/kiss/Helpers.hx +++ b/src/kiss/Helpers.hx @@ -10,6 +10,7 @@ import kiss.SpecialForms; using kiss.Reader; using kiss.Helpers; +using kiss.Kiss; using StringTools; class Helpers { diff --git a/src/kiss/Kiss.hx b/src/kiss/Kiss.hx index bd1028b..eb94370 100644 --- a/src/kiss/Kiss.hx +++ b/src/kiss/Kiss.hx @@ -23,7 +23,7 @@ typedef KissState = { fieldForms:Map, specialForms:Map, macros:Map, - convert:ExprConversion + wrapListExps:Bool }; class Kiss { @@ -43,9 +43,8 @@ class Kiss { fieldForms: FieldForms.builtins(), specialForms: SpecialForms.builtins(), macros: Macros.builtins(), - convert: null - } - k.convert = readerExpToHaxeExpr.bind(_, k); + wrapListExps: true + }; // Helpful aliases k.defAlias("print", Symbol("Prelude.print")); @@ -136,12 +135,15 @@ class Kiss { ECast(convert(innerExp), if (type.length > 0) Helpers.parseComplexType(type, exp) else null).withMacroPosOf(wholeExp); */ case ListExp(elements): - ENew({ - pack: ["kiss"], - name: "List" - }, [ - EArrayDecl([for (elementExp in elements) convert(elementExp)]).withMacroPosOf(exp) - ]).withMacroPosOf(exp); + var arrayDecl = EArrayDecl([for (elementExp in elements) convert(elementExp)]).withMacroPosOf(exp); + if (k.wrapListExps) { + ENew({ + pack: ["kiss"], + name: "List" + }, [arrayDecl]).withMacroPosOf(exp); + } else { + arrayDecl; + }; case RawHaxe(code): Context.parse(code, exp.macroPos()); case FieldExp(field, innerExp): @@ -154,5 +156,15 @@ class Kiss { #end return expr; } + + public static function forCaseParsing(k:KissState):KissState { + var copy = Reflect.copy(k); + copy.wrapListExps = false; + return copy; + } + + public static function convert(k:KissState, exp:ReaderExp) { + return readerExpToHaxeExpr(exp, k); + } } #end diff --git a/src/kiss/Macros.hx b/src/kiss/Macros.hx index 3a234bf..47cc9c1 100644 --- a/src/kiss/Macros.hx +++ b/src/kiss/Macros.hx @@ -9,6 +9,7 @@ import kiss.Reader; import kiss.Kiss; import kiss.CompileError; +using kiss.Kiss; using uuid.Uuid; using kiss.Reader; using kiss.Helpers; diff --git a/src/kiss/SpecialForms.hx b/src/kiss/SpecialForms.hx index 2d80c39..cf30a0e 100644 --- a/src/kiss/SpecialForms.hx +++ b/src/kiss/SpecialForms.hx @@ -4,13 +4,13 @@ import haxe.macro.Expr; import haxe.macro.Context; import kiss.Reader; import uuid.Uuid; +import kiss.Kiss; using uuid.Uuid; using kiss.Reader; using kiss.Helpers; using kiss.Prelude; - -import kiss.Kiss; +using kiss.Kiss; // Special forms convert Kiss reader expressions into Haxe macro expressions typedef SpecialFormFunction = (wholeExp:ReaderExp, args:Array, k:KissState) -> Expr; @@ -231,14 +231,14 @@ class SpecialForms { default: null; }; - ESwitch(k.convert(args[0]), [ + ESwitch(k.forCaseParsing().convert(args[0]), [ for (caseExp in args.slice(1)) switch (caseExp.def) { - // TODO support | to generate more than one case value + // TODO support CallExp(Symbol("or")) to generate more than one case value // TODO support guards case CallExp(patternExp, caseBodyExps): { - values: [k.convert(patternExp)], + values: [k.forCaseParsing().convert(patternExp)], expr: k.convert(CallExp(Symbol("begin").withPosOf(caseExp), caseBodyExps).withPosOf(caseExp)) }; default: