This commit is contained in:
2022-08-21 18:14:00 +00:00
parent 905db8ed75
commit 66646dfcbe
5 changed files with 50 additions and 13 deletions

View File

@@ -103,7 +103,7 @@ class FieldForms {
var type = Helpers.explicitType(args[0]); var type = Helpers.explicitType(args[0]);
if (type != null) if (type != null)
k.typeHints.push({name: name, type: type}); k.addVarInScope({name: name, type: type}, false);
({ ({
name: name, name: name,

View File

@@ -207,8 +207,7 @@ class Helpers {
}]; }];
for (v in vars) { for (v in vars) {
if (v.type != null) k.addVarInScope(v, true);
k.typeHints.push(v);
} }
var expr = if (body.length == 0) { var expr = if (body.length == 0) {
@@ -224,8 +223,7 @@ class Helpers {
} }
for (v in vars) { for (v in vars) {
if (v.type != null) k.removeVarInScope(v, true);
k.typeHints.remove(v);
} }
// To make function args immutable by default, we would use (let...) instead of (begin...) // To make function args immutable by default, we would use (let...) instead of (begin...)

View File

@@ -59,6 +59,8 @@ typedef KissState = {
collectedBlocks:Map<String, Array<ReaderExp>>, collectedBlocks:Map<String, Array<ReaderExp>>,
inStaticFunction:Bool, inStaticFunction:Bool,
typeHints:Array<Var>, typeHints:Array<Var>,
varsInScope:Array<Var>,
localVarsInScope:Array<Var>,
conversionStack:Array<ReaderExp>, conversionStack:Array<ReaderExp>,
stateChanged:Bool stateChanged:Bool
}; };
@@ -170,6 +172,8 @@ class Kiss {
collectedBlocks: new Map(), collectedBlocks: new Map(),
inStaticFunction: false, inStaticFunction: false,
typeHints: [], typeHints: [],
varsInScope: [],
localVarsInScope: [],
conversionStack: [], conversionStack: [],
stateChanged: false stateChanged: false
}; };
@@ -553,6 +557,26 @@ class Kiss {
return expr; return expr;
} }
public static function addVarInScope(k: KissState, v:Var, local:Bool) {
if (v.type != null)
k.typeHints.push(v);
k.varsInScope.push(v);
if (local)
k.localVarsInScope.push(v);
}
public static function removeVarInScope(k: KissState, v:Var, local:Bool) {
function removeLast(list:Array<Var>, v:Var) {
var index = list.lastIndexOf(v);
list.splice(index, 1);
}
if (v.type != null)
removeLast(k.typeHints, v);
removeLast(k.varsInScope, v);
if (local)
removeLast(k.localVarsInScope, v);
}
static function disableMacro(copy:KissState, m:String, reason:String) { static function disableMacro(copy:KissState, m:String, reason:String) {
copy.macros[m] = (wholeExp:ReaderExp, exps, k) -> { copy.macros[m] = (wholeExp:ReaderExp, exps, k) -> {
var b = wholeExp.expBuilder(); var b = wholeExp.expBuilder();

View File

@@ -1294,12 +1294,29 @@ class Macros {
return Quasiquote(b.let(bindings, body)).withPosOf(wholeExp); return Quasiquote(b.let(bindings, body)).withPosOf(wholeExp);
}; };
k.doc("printLocals", 0, 0, "(printLocals)"); function printAll (locals:Bool, wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
macros["printLocals"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
var b = wholeExp.expBuilder(); var b = wholeExp.expBuilder();
b.begin([for (v in k.typeHints) b.callSymbol("print", [b.symbol(v.name), b.str(v.name)])]); var list = if (locals) k.localVarsInScope else k.varsInScope;
}; return b.begin([for (v in list) b.callSymbol("print", [b.symbol(v.name), b.str(v.name)])]);
}
k.doc("printAll", 0, 0, "(printAll)");
macros["printAll"] = printAll.bind(false);
k.doc("printLocals", 0, 0, "(printLocals)");
macros["printLocals"] = printAll.bind(true);
k.doc("printLocalNulls", 0, 0, "(printLocalNulls)");
function printAllNulls (locals:Bool, wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
var b = wholeExp.expBuilder();
var list = if (locals) k.localVarsInScope else k.varsInScope;
return b.begin([for (v in list) {
var symbol = b.symbol(v.name);
b.callSymbol("unless", [symbol,
b.callSymbol("print", [symbol, b.str(v.name)])]);}]);
};
k.doc("printAllNulls", 0, 0, "(printAllNulls)");
macros["printAllNulls"] = printAllNulls.bind(false);
k.doc("printLocalNulls", 0, 0, "(printLocalNulls)");
macros["printLocalNulls"] = printAllNulls.bind(true);
return macros; return macros;
} }

View File

@@ -204,8 +204,7 @@ class SpecialForms {
} }
for (v in varDefs) { for (v in varDefs) {
if (v.type != null) k.addVarInScope(v, true);
k.typeHints.push(v);
} }
var block = EBlock([ var block = EBlock([
@@ -214,8 +213,7 @@ class SpecialForms {
]).withMacroPosOf(wholeExp); ]).withMacroPosOf(wholeExp);
for (v in varDefs) { for (v in varDefs) {
if (v.type != null) k.removeVarInScope(v, true);
k.typeHints.remove(v);
} }
block; block;