assertLet
This commit is contained in:
@@ -598,22 +598,27 @@ class Macros {
|
|||||||
renameAndDeprecate("undefalias", "undefAlias");
|
renameAndDeprecate("undefalias", "undefAlias");
|
||||||
|
|
||||||
// Macros that null-check and extract patterns from enums (inspired by Rust)
|
// Macros that null-check and extract patterns from enums (inspired by Rust)
|
||||||
function ifLet(wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
|
function ifLet(assertLet:Bool, wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
|
||||||
wholeExp.checkNumArgs(2, 3, "(ifLet [[enum bindings...]] [thenExp] [?elseExp])");
|
var funcName = if (assertLet) "assertLet" else "ifLet";
|
||||||
|
var elseExpStr = if (assertLet) "" else " <?elseExp>";
|
||||||
|
var maxArgs = if (assertLet) 2 else 3;
|
||||||
|
wholeExp.checkNumArgs(2, maxArgs, '($funcName [<enum bindings...>] <thenExp>${elseExpStr})');
|
||||||
var b = wholeExp.expBuilder();
|
var b = wholeExp.expBuilder();
|
||||||
|
|
||||||
|
var bindingList = exps[0].bindingList(funcName);
|
||||||
|
var firstPattern = bindingList.shift();
|
||||||
|
var firstValue = bindingList.shift();
|
||||||
|
var firstValueSymbol = b.symbol();
|
||||||
|
|
||||||
var thenExp = exps[1];
|
var thenExp = exps[1];
|
||||||
var elseExp = if (exps.length > 2) {
|
var elseExp = if (exps.length > 2) {
|
||||||
exps[2];
|
exps[2];
|
||||||
|
} else if (assertLet) {
|
||||||
|
b.callSymbol("throw", [b.str('Assertion binding ${firstValue.def.toString()} -> ${firstPattern.def.toString()} failed')]);
|
||||||
} else {
|
} else {
|
||||||
b.symbol("null");
|
b.symbol("null");
|
||||||
};
|
};
|
||||||
|
|
||||||
var bindingList = exps[0].bindingList("ifLet");
|
|
||||||
var firstPattern = bindingList.shift();
|
|
||||||
var firstValue = bindingList.shift();
|
|
||||||
var firstValueSymbol = b.symbol();
|
|
||||||
|
|
||||||
return b.callSymbol("let", [
|
return b.callSymbol("let", [
|
||||||
b.list([firstValueSymbol, firstValue]),
|
b.list([firstValueSymbol, firstValue]),
|
||||||
b.callSymbol("if", [
|
b.callSymbol("if", [
|
||||||
@@ -626,7 +631,7 @@ class Macros {
|
|||||||
if (bindingList.length == 0) {
|
if (bindingList.length == 0) {
|
||||||
exps[1];
|
exps[1];
|
||||||
} else {
|
} else {
|
||||||
ifLet(wholeExp, [
|
ifLet(assertLet, wholeExp, [
|
||||||
b.list(bindingList)
|
b.list(bindingList)
|
||||||
].concat(exps.slice(1)), k);
|
].concat(exps.slice(1)), k);
|
||||||
}
|
}
|
||||||
@@ -641,7 +646,7 @@ class Macros {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
macros["ifLet"] = ifLet;
|
macros["ifLet"] = ifLet.bind(false);
|
||||||
|
|
||||||
macros["whenLet"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
|
macros["whenLet"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
|
||||||
wholeExp.checkNumArgs(2, null, "(whenLet [[enum bindings...]] [body...])");
|
wholeExp.checkNumArgs(2, null, "(whenLet [[enum bindings...]] [body...])");
|
||||||
@@ -663,6 +668,8 @@ class Macros {
|
|||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
macros["assertLet"] = ifLet.bind(true);
|
||||||
|
|
||||||
function awaitLet(wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
|
function awaitLet(wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
|
||||||
wholeExp.checkNumArgs(2, null, "(awaitLet [<promise bindings...>] <?catchHandler> <body...>)");
|
wholeExp.checkNumArgs(2, null, "(awaitLet [<promise bindings...>] <?catchHandler> <body...>)");
|
||||||
|
|
||||||
|
@@ -498,7 +498,10 @@
|
|||||||
(let [&mut v 1]
|
(let [&mut v 1]
|
||||||
(unlessLet [2 (begin (+= v 1) v)]
|
(unlessLet [2 (begin (+= v 1) v)]
|
||||||
(Assert.fail))
|
(Assert.fail))
|
||||||
(Assert.equals 2 v))))
|
(Assert.equals 2 v))
|
||||||
|
|
||||||
|
(assertThrows (assertLet [(Some thing) none] thing))
|
||||||
|
(Assert.equals 5 (assertLet [(Some thing) some5] thing))))
|
||||||
|
|
||||||
(function _testRawString []
|
(function _testRawString []
|
||||||
(Assert.equals #| "\\" |# #"\"#)
|
(Assert.equals #| "\\" |# #"\"#)
|
||||||
|
Reference in New Issue
Block a user