assertLet

This commit is contained in:
2021-11-14 20:34:58 -07:00
parent 76a340e3b4
commit 2b31027446
2 changed files with 20 additions and 10 deletions

View File

@@ -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...>)");

View File

@@ -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 #| "\\" |# #"\"#)