clamp macro

This commit is contained in:
2021-10-29 13:36:46 -04:00
parent a402bc6f2c
commit 6e3d030a74
3 changed files with 38 additions and 1 deletions

View File

@@ -827,6 +827,31 @@ class Macros {
b.callSymbol("object", objectExps);
}
macros["clamp"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
wholeExp.checkNumArgs(2, 3, "(clamp <expr> <min or null> <?max or null>)");
var b = wholeExp.expBuilder();
var maxExp = if (exps.length == 3) exps.pop() else b.symbol("null");
var expToSet = exps.shift();
var minExp = exps.shift();
var min = b.symbol("minVal");
var max = b.symbol("maxVal");
b.callSymbol("let", [
b.list([
min, minExp,
max, maxExp
]),
b.callSymbol("when", [
min,
b.callSymbol("set", [expToSet, b.callSymbol("max", [min, expToSet])])
]),
b.callSymbol("when", [
max,
b.callSymbol("set", [expToSet, b.callSymbol("min", [max, expToSet])])
]),
expToSet
]);
};
// The wildest code in Kiss to date
// TODO test exprCase!!
macros["exprCase"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {

View File

@@ -313,6 +313,10 @@ class BasicTestCase extends Test {
function testDotAccessOnAlias() {
_testDotAccessOnAlias();
}
function testClamp() {
_testClamp();
}
}
class BasicObject {

View File

@@ -546,4 +546,12 @@
(var float 0.5) // This should still read as a float, not a dot access on a variable called 0
(defAlias &ident owf objWithField)
(function _testDotAccessOnAlias []
(Assert.equals 5 owf.field))
(Assert.equals 5 owf.field))
(function _testClamp []
(let [&mut bigValue 12
&mut smallValue 3]
(Assert.equals 10 (clamp bigValue 5 10))
(Assert.equals 10 bigValue)
(Assert.equals 5 (clamp smallValue 5 10))
(Assert.equals 5 smallValue)))