diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index 83d90193..4910703d 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -827,6 +827,31 @@ class Macros { b.callSymbol("object", objectExps); } + macros["clamp"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { + wholeExp.checkNumArgs(2, 3, "(clamp )"); + 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, k:KissState) -> { diff --git a/kiss/src/test/cases/BasicTestCase.hx b/kiss/src/test/cases/BasicTestCase.hx index 56c814bd..8bd50c54 100644 --- a/kiss/src/test/cases/BasicTestCase.hx +++ b/kiss/src/test/cases/BasicTestCase.hx @@ -313,6 +313,10 @@ class BasicTestCase extends Test { function testDotAccessOnAlias() { _testDotAccessOnAlias(); } + + function testClamp() { + _testClamp(); + } } class BasicObject { diff --git a/kiss/src/test/cases/BasicTestCase.kiss b/kiss/src/test/cases/BasicTestCase.kiss index 9a1e2760..6eda4ccd 100644 --- a/kiss/src/test/cases/BasicTestCase.kiss +++ b/kiss/src/test/cases/BasicTestCase.kiss @@ -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)) \ No newline at end of file + (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))) \ No newline at end of file