forked from lix-project/lix
Merge pull request #4787 from Ma27/builtins-ceil-floor
Implement `builtins.floor` and `builtins.ceil` using the C library functions internally
This commit is contained in:
commit
8768398d5f
|
@ -21,6 +21,8 @@
|
||||||
#include <regex>
|
#include <regex>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
@ -714,6 +716,44 @@ static RegisterPrimOp primop_addErrorContext(RegisterPrimOp::Info {
|
||||||
.fun = prim_addErrorContext,
|
.fun = prim_addErrorContext,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
static void prim_ceil(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
|
{
|
||||||
|
auto value = state.forceFloat(*args[0], args[0]->determinePos(pos));
|
||||||
|
mkInt(v, ceil(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static RegisterPrimOp primop_ceil({
|
||||||
|
.name = "__ceil",
|
||||||
|
.args = {"double"},
|
||||||
|
.doc = R"(
|
||||||
|
Converts an IEEE-754 double-precision floating-point number (*double*) to
|
||||||
|
the next higher integer.
|
||||||
|
|
||||||
|
If the datatype is neither an integer nor a "float", an evaluation error will be
|
||||||
|
thrown.
|
||||||
|
)",
|
||||||
|
.fun = prim_ceil,
|
||||||
|
});
|
||||||
|
|
||||||
|
static void prim_floor(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
|
{
|
||||||
|
auto value = state.forceFloat(*args[0], args[0]->determinePos(pos));
|
||||||
|
mkInt(v, floor(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
static RegisterPrimOp primop_floor({
|
||||||
|
.name = "__floor",
|
||||||
|
.args = {"double"},
|
||||||
|
.doc = R"(
|
||||||
|
Converts an IEEE-754 double-precision floating-point number (*double*) to
|
||||||
|
the next lower integer.
|
||||||
|
|
||||||
|
If the datatype is neither an integer nor a "float", an evaluation error will be
|
||||||
|
thrown.
|
||||||
|
)",
|
||||||
|
.fun = prim_floor,
|
||||||
|
});
|
||||||
|
|
||||||
/* Try evaluating the argument. Success => {success=true; value=something;},
|
/* Try evaluating the argument. Success => {success=true; value=something;},
|
||||||
* else => {success=false; value=false;} */
|
* else => {success=false; value=false;} */
|
||||||
static void prim_tryEval(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
static void prim_tryEval(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||||
|
|
1
tests/lang/eval-okay-floor-ceil.exp
Normal file
1
tests/lang/eval-okay-floor-ceil.exp
Normal file
|
@ -0,0 +1 @@
|
||||||
|
"23;24;23;23"
|
9
tests/lang/eval-okay-floor-ceil.nix
Normal file
9
tests/lang/eval-okay-floor-ceil.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
with import ./lib.nix;
|
||||||
|
|
||||||
|
let
|
||||||
|
n1 = builtins.floor 23.5;
|
||||||
|
n2 = builtins.ceil 23.5;
|
||||||
|
n3 = builtins.floor 23;
|
||||||
|
n4 = builtins.ceil 23;
|
||||||
|
in
|
||||||
|
builtins.concatStringsSep ";" (map toString [ n1 n2 n3 n4 ])
|
Loading…
Reference in a new issue