Special case of (set). Close #187

This commit is contained in:
2023-04-12 10:34:12 -06:00
parent 9089489ed3
commit 76a9562aba
3 changed files with 29 additions and 2 deletions

View File

@@ -119,7 +119,21 @@ class SpecialForms {
k.doc("set", 2, 2, "(set <variable> <value>)");
map["set"] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
EBinop(OpAssign, k.convert(args[0]), k.convert(args[1])).withMacroPosOf(wholeExp);
// Special case: (set ~var value)
var printExp = null;
var setVar = switch (args[0].def) {
case CallExp({def:Symbol("print" | "Prelude.print" | "trace")}, printArgs):
printExp = args[0];
printArgs[0];
default:
args[0];
}
var setExp = EBinop(OpAssign, k.convert(setVar), k.convert(args[1])).withMacroPosOf(wholeExp);
if (printExp != null) {
EBlock([k.convert(printExp), setExp]).withMacroPosOf(wholeExp);
} else {
setExp;
}
};
function varName(nameExp:ReaderExp) {

View File

@@ -439,6 +439,10 @@ class BasicTestCase extends Test {
_testCaseMacroError();
}
function testQuickPrintOnSetVar() {
_testQuickPrintOnSetVar();
}
var aNullToPrint = null;
}

View File

@@ -961,3 +961,12 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m
(Assert.fail))
e)
(Assert.fail)))))
(function _testQuickPrintOnSetVar []
(let [&mut v 5]
(set (trace v) 7)
(set (print v) 8)
(set (Prelude.print v) 9)
(set ~v 6)
(Assert.equals v 6)))