+Value builtin_fn(Arguments arguments, const Location& loc) +{ + Parameters parameters = Parameters::parse(std::move(arguments), loc, {"r"}, {"d"}); + parameters.set_caller("fn"); + + auto name = parameters.exactlyOneOf({ "r", "d" }); + if (!name) { + return Value::undefined.clone(); + } + + double v; + if (!parameters.validate_number(*name, v)) { + return Value::undefined.clone(); + } + + if (*name == "d") { + v = v / 2; + } + + auto fn = parameters["$fn"].toDouble(); + auto fs = parameters["$fs"].toDouble(); + auto fa = parameters["$fa"].toDouble(); + + return Calc::get_fragments_from_r(v, fn, fs, fa); +}