From eaff41733ec08c2913849920f0d3cd3b47df4bd2 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sun, 21 Aug 2022 18:14:00 +0000 Subject: [PATCH] n --- kiss/src/kiss/FieldForms.hx | 2 +- kiss/src/kiss/Helpers.hx | 6 ++---- kiss/src/kiss/Kiss.hx | 24 ++++++++++++++++++++++++ kiss/src/kiss/Macros.hx | 25 +++++++++++++++++++++---- kiss/src/kiss/SpecialForms.hx | 6 ++---- 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/kiss/src/kiss/FieldForms.hx b/kiss/src/kiss/FieldForms.hx index 6d8f3828..aeb28476 100644 --- a/kiss/src/kiss/FieldForms.hx +++ b/kiss/src/kiss/FieldForms.hx @@ -103,7 +103,7 @@ class FieldForms { var type = Helpers.explicitType(args[0]); if (type != null) - k.typeHints.push({name: name, type: type}); + k.addVarInScope({name: name, type: type}, false); ({ name: name, diff --git a/kiss/src/kiss/Helpers.hx b/kiss/src/kiss/Helpers.hx index 89705bba..cbd2e8b5 100644 --- a/kiss/src/kiss/Helpers.hx +++ b/kiss/src/kiss/Helpers.hx @@ -207,8 +207,7 @@ class Helpers { }]; for (v in vars) { - if (v.type != null) - k.typeHints.push(v); + k.addVarInScope(v, true); } var expr = if (body.length == 0) { @@ -224,8 +223,7 @@ class Helpers { } for (v in vars) { - if (v.type != null) - k.typeHints.remove(v); + k.removeVarInScope(v, true); } // To make function args immutable by default, we would use (let...) instead of (begin...) diff --git a/kiss/src/kiss/Kiss.hx b/kiss/src/kiss/Kiss.hx index 271e17c7..5ec15f06 100644 --- a/kiss/src/kiss/Kiss.hx +++ b/kiss/src/kiss/Kiss.hx @@ -59,6 +59,8 @@ typedef KissState = { collectedBlocks:Map>, inStaticFunction:Bool, typeHints:Array, + varsInScope:Array, + localVarsInScope:Array, conversionStack:Array, stateChanged:Bool }; @@ -170,6 +172,8 @@ class Kiss { collectedBlocks: new Map(), inStaticFunction: false, typeHints: [], + varsInScope: [], + localVarsInScope: [], conversionStack: [], stateChanged: false }; @@ -552,6 +556,26 @@ class Kiss { 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, 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) { copy.macros[m] = (wholeExp:ReaderExp, exps, k) -> { diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index f3e625eb..3a5ba4b8 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -1294,12 +1294,29 @@ class Macros { return Quasiquote(b.let(bindings, body)).withPosOf(wholeExp); }; - k.doc("printLocals", 0, 0, "(printLocals)"); - macros["printLocals"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { + function printAll (locals:Bool, wholeExp:ReaderExp, exps:Array, k:KissState) { 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, 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; } diff --git a/kiss/src/kiss/SpecialForms.hx b/kiss/src/kiss/SpecialForms.hx index c8caaabd..a211c1c8 100644 --- a/kiss/src/kiss/SpecialForms.hx +++ b/kiss/src/kiss/SpecialForms.hx @@ -204,8 +204,7 @@ class SpecialForms { } for (v in varDefs) { - if (v.type != null) - k.typeHints.push(v); + k.addVarInScope(v, true); } var block = EBlock([ @@ -214,8 +213,7 @@ class SpecialForms { ]).withMacroPosOf(wholeExp); for (v in varDefs) { - if (v.type != null) - k.typeHints.remove(v); + k.removeVarInScope(v, true); } block;