withTempSet macro
This commit is contained in:
@@ -840,6 +840,30 @@ class Macros {
|
|||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
k.doc("withTempSet", 2, null, "(withTempSet [<bindings...>] <body...>)");
|
||||||
|
macros["withTempSet"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
|
||||||
|
var b = wholeExp.expBuilder();
|
||||||
|
var bindingList = exps[0].bindingList("withTempSet");
|
||||||
|
var body = exps.slice(1);
|
||||||
|
var bindingPairs = Prelude.groups(bindingList, 2);
|
||||||
|
var exps = [for (pair in bindingPairs) pair[0]];
|
||||||
|
var values = [for (pair in bindingPairs) pair[1]];
|
||||||
|
var oldValueSymbols = [for (i in 0...bindingPairs.length) b.symbol()];
|
||||||
|
var letBindings = Lambda.flatten(Prelude.zipThrow(oldValueSymbols, exps));
|
||||||
|
var setBindings:Array<Array<ReaderExp>> = Prelude.zipThrow(exps, values);
|
||||||
|
var resetBindings:Array<Array<ReaderExp>> = Prelude.zipThrow(exps, oldValueSymbols);
|
||||||
|
var result = b.symbol();
|
||||||
|
b.let(letBindings, [
|
||||||
|
for (pair in setBindings)
|
||||||
|
b.set(pair[0], pair[1])
|
||||||
|
].concat([
|
||||||
|
b.let([result, b.begin(body)], [
|
||||||
|
for (pair in resetBindings)
|
||||||
|
b.set(pair[0], pair[1])
|
||||||
|
].concat([result]))
|
||||||
|
]));
|
||||||
|
};
|
||||||
|
|
||||||
k.doc("defnew", 1, null, "(defNew [<args...>] [<optional property bindings...>] <optional body...>");
|
k.doc("defnew", 1, null, "(defNew [<args...>] [<optional property bindings...>] <optional body...>");
|
||||||
macros["defnew"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
|
macros["defnew"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
|
||||||
var args = exps.shift();
|
var args = exps.shift();
|
||||||
|
@@ -399,6 +399,10 @@ class BasicTestCase extends Test {
|
|||||||
_testWithFunctions();
|
_testWithFunctions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testWithTempSet() {
|
||||||
|
_testWithTempSet();
|
||||||
|
}
|
||||||
|
|
||||||
function testPrintMacrosCheck() {
|
function testPrintMacrosCheck() {
|
||||||
_testPrintMacrosCheck();
|
_testPrintMacrosCheck();
|
||||||
}
|
}
|
||||||
|
@@ -751,6 +751,23 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m
|
|||||||
(localFunction c [val] (+ (a val) (b val)))
|
(localFunction c [val] (+ (a val) (b val)))
|
||||||
(Assert.equals 5 (c 1))))
|
(Assert.equals 5 (c 1))))
|
||||||
|
|
||||||
|
(function _testWithTempSet []
|
||||||
|
(let [&mut v 5
|
||||||
|
&mut v2 3]
|
||||||
|
(assertEquals 5 v)
|
||||||
|
(assertEquals 3 v2)
|
||||||
|
(withTempSet [v 6]
|
||||||
|
(assertEquals 6 v)
|
||||||
|
(assertEquals 3 v2))
|
||||||
|
(assertEquals 5 v)
|
||||||
|
(assertEquals 3 v2)
|
||||||
|
(withTempSet [v 7 v2 9]
|
||||||
|
(assertEquals 7 v)
|
||||||
|
(assertEquals 9 v2))
|
||||||
|
(assertEquals 5 v)
|
||||||
|
(assertEquals 3 v2))
|
||||||
|
(Assert.pass))
|
||||||
|
|
||||||
(var anotherNullToPrint null)
|
(var anotherNullToPrint null)
|
||||||
(function _testPrintMacrosCheck []
|
(function _testPrintMacrosCheck []
|
||||||
(printAllNulls)
|
(printAllNulls)
|
||||||
|
Reference in New Issue
Block a user