Make (case) allow list matching
This commit is contained in:
@@ -8,6 +8,7 @@ import kiss.Stream;
|
||||
import kiss.CompileError;
|
||||
import kiss.Kiss;
|
||||
|
||||
using kiss.Kiss;
|
||||
using kiss.Helpers;
|
||||
using kiss.Reader;
|
||||
using StringTools;
|
||||
|
@@ -10,6 +10,7 @@ import kiss.SpecialForms;
|
||||
|
||||
using kiss.Reader;
|
||||
using kiss.Helpers;
|
||||
using kiss.Kiss;
|
||||
using StringTools;
|
||||
|
||||
class Helpers {
|
||||
|
@@ -23,7 +23,7 @@ typedef KissState = {
|
||||
fieldForms:Map<String, FieldFormFunction>,
|
||||
specialForms:Map<String, SpecialFormFunction>,
|
||||
macros:Map<String, MacroFunction>,
|
||||
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):
|
||||
var arrayDecl = EArrayDecl([for (elementExp in elements) convert(elementExp)]).withMacroPosOf(exp);
|
||||
if (k.wrapListExps) {
|
||||
ENew({
|
||||
pack: ["kiss"],
|
||||
name: "List"
|
||||
}, [
|
||||
EArrayDecl([for (elementExp in elements) convert(elementExp)]).withMacroPosOf(exp)
|
||||
]).withMacroPosOf(exp);
|
||||
}, [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
|
||||
|
@@ -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;
|
||||
|
@@ -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<ReaderExp>, 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:
|
||||
|
Reference in New Issue
Block a user