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>)");
|
k.doc("set", 2, 2, "(set <variable> <value>)");
|
||||||
map["set"] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
|
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) {
|
function varName(nameExp:ReaderExp) {
|
||||||
|
@@ -439,6 +439,10 @@ class BasicTestCase extends Test {
|
|||||||
_testCaseMacroError();
|
_testCaseMacroError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testQuickPrintOnSetVar() {
|
||||||
|
_testQuickPrintOnSetVar();
|
||||||
|
}
|
||||||
|
|
||||||
var aNullToPrint = null;
|
var aNullToPrint = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -960,4 +960,13 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m
|
|||||||
e)
|
e)
|
||||||
(Assert.fail))
|
(Assert.fail))
|
||||||
e)
|
e)
|
||||||
(Assert.fail)))))
|
(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