n
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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...)
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user