Add a logarithm function

Fixes #9498. Adds a `log` function for calculating logarithms.
This commit is contained in:
Joshua Spence 2017-04-26 07:41:33 +10:00
parent 26a91abd0c
commit 38d4d2f9d4
3 changed files with 42 additions and 0 deletions

View File

@ -81,6 +81,7 @@ func Funcs() map[string]ast.Function {
"jsonencode": interpolationFuncJSONEncode(),
"length": interpolationFuncLength(),
"list": interpolationFuncList(),
"log": interpolationFuncLog(),
"lower": interpolationFuncLower(),
"map": interpolationFuncMap(),
"max": interpolationFuncMax(),
@ -489,6 +490,17 @@ func interpolationFuncCeil() ast.Function {
}
}
// interpolationFuncLog returns the logarithnm.
func interpolationFuncLog() ast.Function {
return ast.Function{
ArgTypes: []ast.Type{ast.TypeFloat, ast.TypeFloat},
ReturnType: ast.TypeFloat,
Callback: func(args []interface{}) (interface{}, error) {
return math.Log(args[0].(float64)) / math.Log(args[1].(float64)), nil
},
}
}
// interpolationFuncChomp removes trailing newlines from the given string
func interpolationFuncChomp() ast.Function {
newlines := regexp.MustCompile(`(?:\r\n?|\n)*\z`)

View File

@ -370,6 +370,34 @@ func TestInterpolateFuncCeil(t *testing.T) {
})
}
func TestInterpolateFuncLog(t *testing.T) {
testFunction(t, testFunctionConfig{
Cases: []testFunctionCase{
{
`${log(1, 10)}`,
"0",
false,
},
{
`${log(10, 10)}`,
"1",
false,
},
{
`${log(0, 10)}`,
"-Inf",
false,
},
{
`${log(10, 0)}`,
"-0",
false,
},
},
})
}
func TestInterpolateFuncChomp(t *testing.T) {
testFunction(t, testFunctionConfig{
Cases: []testFunctionCase{

View File

@ -278,6 +278,8 @@ The supported built-in functions are:
* `${list("a", "b", "c")}` returns a list of `"a", "b", "c"`.
* `${list()}` returns an empty list.
* `log(x, base)` - Returns the logarithm of `x`.
* `lookup(map, key, [default])` - Performs a dynamic lookup into a map
variable. The `map` parameter should be another variable, such
as `var.amis`. If `key` does not exist in `map`, the interpolation will