Make (case) allow list matching

This commit is contained in:
2020-12-07 08:36:54 -07:00
parent f3832bc4ad
commit 49d0ff3677
5 changed files with 30 additions and 15 deletions

View File

@@ -8,6 +8,7 @@ import kiss.Stream;
import kiss.CompileError;
import kiss.Kiss;
using kiss.Kiss;
using kiss.Helpers;
using kiss.Reader;
using StringTools;

View File

@@ -10,6 +10,7 @@ import kiss.SpecialForms;
using kiss.Reader;
using kiss.Helpers;
using kiss.Kiss;
using StringTools;
class Helpers {

View File

@@ -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):
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

View File

@@ -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;

View File

@@ -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: