Make (case) allow list matching
This commit is contained in:
@@ -8,6 +8,7 @@ import kiss.Stream;
|
|||||||
import kiss.CompileError;
|
import kiss.CompileError;
|
||||||
import kiss.Kiss;
|
import kiss.Kiss;
|
||||||
|
|
||||||
|
using kiss.Kiss;
|
||||||
using kiss.Helpers;
|
using kiss.Helpers;
|
||||||
using kiss.Reader;
|
using kiss.Reader;
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
@@ -10,6 +10,7 @@ import kiss.SpecialForms;
|
|||||||
|
|
||||||
using kiss.Reader;
|
using kiss.Reader;
|
||||||
using kiss.Helpers;
|
using kiss.Helpers;
|
||||||
|
using kiss.Kiss;
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
class Helpers {
|
class Helpers {
|
||||||
|
@@ -23,7 +23,7 @@ typedef KissState = {
|
|||||||
fieldForms:Map<String, FieldFormFunction>,
|
fieldForms:Map<String, FieldFormFunction>,
|
||||||
specialForms:Map<String, SpecialFormFunction>,
|
specialForms:Map<String, SpecialFormFunction>,
|
||||||
macros:Map<String, MacroFunction>,
|
macros:Map<String, MacroFunction>,
|
||||||
convert:ExprConversion
|
wrapListExps:Bool
|
||||||
};
|
};
|
||||||
|
|
||||||
class Kiss {
|
class Kiss {
|
||||||
@@ -43,9 +43,8 @@ class Kiss {
|
|||||||
fieldForms: FieldForms.builtins(),
|
fieldForms: FieldForms.builtins(),
|
||||||
specialForms: SpecialForms.builtins(),
|
specialForms: SpecialForms.builtins(),
|
||||||
macros: Macros.builtins(),
|
macros: Macros.builtins(),
|
||||||
convert: null
|
wrapListExps: true
|
||||||
}
|
};
|
||||||
k.convert = readerExpToHaxeExpr.bind(_, k);
|
|
||||||
|
|
||||||
// Helpful aliases
|
// Helpful aliases
|
||||||
k.defAlias("print", Symbol("Prelude.print"));
|
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);
|
ECast(convert(innerExp), if (type.length > 0) Helpers.parseComplexType(type, exp) else null).withMacroPosOf(wholeExp);
|
||||||
*/
|
*/
|
||||||
case ListExp(elements):
|
case ListExp(elements):
|
||||||
ENew({
|
var arrayDecl = EArrayDecl([for (elementExp in elements) convert(elementExp)]).withMacroPosOf(exp);
|
||||||
pack: ["kiss"],
|
if (k.wrapListExps) {
|
||||||
name: "List"
|
ENew({
|
||||||
}, [
|
pack: ["kiss"],
|
||||||
EArrayDecl([for (elementExp in elements) convert(elementExp)]).withMacroPosOf(exp)
|
name: "List"
|
||||||
]).withMacroPosOf(exp);
|
}, [arrayDecl]).withMacroPosOf(exp);
|
||||||
|
} else {
|
||||||
|
arrayDecl;
|
||||||
|
};
|
||||||
case RawHaxe(code):
|
case RawHaxe(code):
|
||||||
Context.parse(code, exp.macroPos());
|
Context.parse(code, exp.macroPos());
|
||||||
case FieldExp(field, innerExp):
|
case FieldExp(field, innerExp):
|
||||||
@@ -154,5 +156,15 @@ class Kiss {
|
|||||||
#end
|
#end
|
||||||
return expr;
|
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
|
#end
|
||||||
|
@@ -9,6 +9,7 @@ import kiss.Reader;
|
|||||||
import kiss.Kiss;
|
import kiss.Kiss;
|
||||||
import kiss.CompileError;
|
import kiss.CompileError;
|
||||||
|
|
||||||
|
using kiss.Kiss;
|
||||||
using uuid.Uuid;
|
using uuid.Uuid;
|
||||||
using kiss.Reader;
|
using kiss.Reader;
|
||||||
using kiss.Helpers;
|
using kiss.Helpers;
|
||||||
|
@@ -4,13 +4,13 @@ import haxe.macro.Expr;
|
|||||||
import haxe.macro.Context;
|
import haxe.macro.Context;
|
||||||
import kiss.Reader;
|
import kiss.Reader;
|
||||||
import uuid.Uuid;
|
import uuid.Uuid;
|
||||||
|
import kiss.Kiss;
|
||||||
|
|
||||||
using uuid.Uuid;
|
using uuid.Uuid;
|
||||||
using kiss.Reader;
|
using kiss.Reader;
|
||||||
using kiss.Helpers;
|
using kiss.Helpers;
|
||||||
using kiss.Prelude;
|
using kiss.Prelude;
|
||||||
|
using kiss.Kiss;
|
||||||
import kiss.Kiss;
|
|
||||||
|
|
||||||
// Special forms convert Kiss reader expressions into Haxe macro expressions
|
// Special forms convert Kiss reader expressions into Haxe macro expressions
|
||||||
typedef SpecialFormFunction = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> Expr;
|
typedef SpecialFormFunction = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> Expr;
|
||||||
@@ -231,14 +231,14 @@ class SpecialForms {
|
|||||||
default:
|
default:
|
||||||
null;
|
null;
|
||||||
};
|
};
|
||||||
ESwitch(k.convert(args[0]), [
|
ESwitch(k.forCaseParsing().convert(args[0]), [
|
||||||
for (caseExp in args.slice(1))
|
for (caseExp in args.slice(1))
|
||||||
switch (caseExp.def) {
|
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
|
// TODO support guards
|
||||||
case CallExp(patternExp, caseBodyExps):
|
case CallExp(patternExp, caseBodyExps):
|
||||||
{
|
{
|
||||||
values: [k.convert(patternExp)],
|
values: [k.forCaseParsing().convert(patternExp)],
|
||||||
expr: k.convert(CallExp(Symbol("begin").withPosOf(caseExp), caseBodyExps).withPosOf(caseExp))
|
expr: k.convert(CallExp(Symbol("begin").withPosOf(caseExp), caseBodyExps).withPosOf(caseExp))
|
||||||
};
|
};
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user