Special case of (set). Close #187
This commit is contained in:
@@ -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) {
|
||||
|
@@ -439,6 +439,10 @@ class BasicTestCase extends Test {
|
||||
_testCaseMacroError();
|
||||
}
|
||||
|
||||
function testQuickPrintOnSetVar() {
|
||||
_testQuickPrintOnSetVar();
|
||||
}
|
||||
|
||||
var aNullToPrint = null;
|
||||
}
|
||||
|
||||
|
@@ -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)))
|
Reference in New Issue
Block a user