add None ReaderExp type

This commit is contained in:
2021-07-25 21:05:43 -06:00
parent e8d38d2330
commit 18df898344
4 changed files with 30 additions and 7 deletions

View File

@@ -470,7 +470,8 @@ class Helpers {
meta: (m:String, exp:ReaderExp) -> MetaExp(m, exp).withPosOf(posRef), meta: (m:String, exp:ReaderExp) -> MetaExp(m, exp).withPosOf(posRef),
field: (f:String, exp:ReaderExp) -> FieldExp(f, exp).withPosOf(posRef), field: (f:String, exp:ReaderExp) -> FieldExp(f, exp).withPosOf(posRef),
keyValue: (key:ReaderExp, value:ReaderExp) -> KeyValueExp(key, value).withPosOf(posRef), keyValue: (key:ReaderExp, value:ReaderExp) -> KeyValueExp(key, value).withPosOf(posRef),
begin: (exps:Array<ReaderExp>) -> CallExp(Symbol("begin").withPosOf(posRef), exps).withPosOf(posRef) begin: (exps:Array<ReaderExp>) -> CallExp(Symbol("begin").withPosOf(posRef), exps).withPosOf(posRef),
none: () -> None.withPosOf(posRef)
}; };
} }

View File

@@ -191,9 +191,24 @@ class Kiss {
// readerExpToHaxeExpr must be called to process readermacro, alias, and macro definitions // readerExpToHaxeExpr must be called to process readermacro, alias, and macro definitions
var expr = readerExpToHaxeExpr(nextExp, k); var expr = readerExpToHaxeExpr(nextExp, k);
// exps in the loaded file that actually become haxe expressions can be inserted into the file that loaded them at the position // exps in the loaded file that actually become haxe expressions can be inserted into the
// (load) was called // file that loaded them at the position (load) was called.
if (expr != null) { // conditional compiler macros like (#when) tend to return empty blocks, or blocks containing empty blocks
// when they contain field forms, so this should also be ignored
function isEmpty(expr) {
switch (expr.expr) {
case EBlock([]):
case EBlock(blockExps):
for (exp in blockExps) {
if (!isEmpty(exp))
return false;
}
default:
return false;
}
return true;
}
if (!isEmpty(expr)) {
loadedExps.push(nextExp); loadedExps.push(nextExp);
} }
}); });
@@ -228,7 +243,7 @@ class Kiss {
return k.fieldList; return k.fieldList;
} }
public static function readerExpToHaxeExpr(exp:ReaderExp, k:KissState):Null<Expr> { public static function readerExpToHaxeExpr(exp:ReaderExp, k:KissState):Expr {
var macros = k.macros; var macros = k.macros;
var fieldForms = k.fieldForms; var fieldForms = k.fieldForms;
var specialForms = k.specialForms; var specialForms = k.specialForms;
@@ -238,7 +253,11 @@ class Kiss {
if (k.hscript) if (k.hscript)
exp = Helpers.removeTypeAnnotations(exp); exp = Helpers.removeTypeAnnotations(exp);
var none = EBlock([]).withMacroPosOf(exp);
var expr = switch (exp.def) { var expr = switch (exp.def) {
case None:
none;
case Symbol(alias) if (k.identAliases.exists(alias)): case Symbol(alias) if (k.identAliases.exists(alias)):
readerExpToHaxeExpr(k.identAliases[alias].withPosOf(exp), k); readerExpToHaxeExpr(k.identAliases[alias].withPosOf(exp), k);
case Symbol(name): case Symbol(name):
@@ -253,13 +272,13 @@ class Kiss {
var field = fieldForms[ff](exp, args, k); var field = fieldForms[ff](exp, args, k);
k.fieldList.push(field); k.fieldList.push(field);
k.fieldDict[field.name] = field; k.fieldDict[field.name] = field;
null; // Field forms are no-ops none; // Field forms are no-ops
case CallExp({pos: _, def: Symbol(mac)}, args) if (macros.exists(mac)): case CallExp({pos: _, def: Symbol(mac)}, args) if (macros.exists(mac)):
var expanded = macros[mac](exp, args, k); var expanded = macros[mac](exp, args, k);
if (expanded != null) { if (expanded != null) {
convert(expanded); convert(expanded);
} else { } else {
null; none;
}; };
case CallExp({pos: _, def: Symbol(specialForm)}, args) if (specialForms.exists(specialForm)): case CallExp({pos: _, def: Symbol(specialForm)}, args) if (specialForms.exists(specialForm)):
specialForms[specialForm](exp, args, k); specialForms[specialForm](exp, args, k);

View File

@@ -393,6 +393,8 @@ class Reader {
str; str;
case ListRestExp(name): case ListRestExp(name):
'...${name}'; '...${name}';
case None:
'';
} }
} }
} }

View File

@@ -22,4 +22,5 @@ enum ReaderExpDef {
UnquoteList(exp:ReaderExp); // ,@[exp] UnquoteList(exp:ReaderExp); // ,@[exp]
ListEatingExp(exps:Array<ReaderExp>); // [::exp exp ...exps exp] ListEatingExp(exps:Array<ReaderExp>); // [::exp exp ...exps exp]
ListRestExp(name:String); // ...exps or ... ListRestExp(name:String); // ...exps or ...
None; // not an expression, i.e. (#unless falseCondition exp)
} }