| 94 | } // namespace |
| 95 | |
| 96 | std::vector<Macro> math_macros() { |
| 97 | absl::StatusOr<Macro> least = Macro::ReceiverVarArg( |
| 98 | kLeast, |
| 99 | [](MacroExprFactory &factory, Expr &target, |
| 100 | absl::Span<Expr> arguments) -> absl::optional<Expr> { |
| 101 | if (!IsTargetNamespace(target)) { |
| 102 | return absl::nullopt; |
| 103 | } |
| 104 | |
| 105 | switch (arguments.size()) { |
| 106 | case 0: |
| 107 | return factory.ReportErrorAt( |
| 108 | target, "math.least() requires at least one argument."); |
| 109 | case 1: { |
| 110 | if (!IsListLiteralWithValidArgs(arguments[0]) && |
| 111 | !IsValidArgType(arguments[0])) { |
| 112 | return factory.ReportErrorAt( |
| 113 | arguments[0], "math.least() invalid single argument value."); |
| 114 | } |
| 115 | |
| 116 | return factory.NewCall(kMathMin, arguments); |
| 117 | } |
| 118 | case 2: { |
| 119 | if (auto error = |
| 120 | CheckInvalidArgs(factory, "math.least()", arguments); |
| 121 | error) { |
| 122 | return std::move(*error); |
| 123 | } |
| 124 | return factory.NewCall(kMathMin, arguments); |
| 125 | } |
| 126 | default: |
| 127 | if (auto error = |
| 128 | CheckInvalidArgs(factory, "math.least()", arguments); |
| 129 | error) { |
| 130 | return std::move(*error); |
| 131 | } |
| 132 | std::vector<ListExprElement> elements; |
| 133 | elements.reserve(arguments.size()); |
| 134 | for (auto &argument : arguments) { |
| 135 | elements.push_back(factory.NewListElement(std::move(argument))); |
| 136 | } |
| 137 | return factory.NewCall(kMathMin, |
| 138 | factory.NewList(std::move(elements))); |
| 139 | } |
| 140 | }); |
| 141 | absl::StatusOr<Macro> greatest = Macro::ReceiverVarArg( |
| 142 | kGreatest, |
| 143 | [](MacroExprFactory &factory, Expr &target, |
| 144 | absl::Span<Expr> arguments) -> absl::optional<Expr> { |
| 145 | if (!IsTargetNamespace(target)) { |
| 146 | return absl::nullopt; |
| 147 | } |
| 148 | |
| 149 | switch (arguments.size()) { |
| 150 | case 0: { |
| 151 | return factory.ReportErrorAt( |
| 152 | target, "math.greatest() requires at least one argument."); |
| 153 | } |