clamp macro
This commit is contained in:
@@ -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) -> {
|
||||
|
@@ -313,6 +313,10 @@ class BasicTestCase extends Test {
|
||||
function testDotAccessOnAlias() {
|
||||
_testDotAccessOnAlias();
|
||||
}
|
||||
|
||||
function testClamp() {
|
||||
_testClamp();
|
||||
}
|
||||
}
|
||||
|
||||
class BasicObject {
|
||||
|
@@ -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)))
|
Reference in New Issue
Block a user