| // Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| /// Defines ^, log, ln, e, sqrt, exp operations. |
| library; |
| |
| import 'dart:math' as math; |
| import '../common/common.dart'; |
| |
| class ExponentOperation implements Operation { |
| @override |
| String get name => '^'; |
| |
| @override |
| num apply(List<num> arguments) { |
| if (arguments.length != 2) { |
| throw ArgumentError( |
| 'Exponentiation requires exactly 2 arguments (base, exponent).', |
| ); |
| } |
| final base = arguments[0]; |
| final exponent = arguments[1]; |
| return math.pow(base, exponent); |
| } |
| } |
| |
| class SqrtOperation implements Operation { |
| @override |
| String get name => 'sqrt'; |
| |
| @override |
| num apply(List<num> arguments) { |
| if (arguments.length != 1) { |
| throw ArgumentError('Square root requires exactly 1 argument.'); |
| } |
| return math.sqrt(arguments[0]); |
| } |
| } |
| |
| class LogOperation implements Operation { |
| @override |
| String get name => 'log'; |
| |
| @override |
| num apply(List<num> arguments) { |
| if (arguments.length == 1) { |
| return math.log(arguments[0]); |
| } else if (arguments.length == 2) { |
| return math.log(arguments[0]) / math.log(arguments[1]); |
| } else { |
| throw ArgumentError('Logarithm requires 1 or 2 arguments.'); |
| } |
| } |
| } |
| |
| class LnOperation implements Operation { |
| @override |
| String get name => 'ln'; |
| |
| @override |
| num apply(List<num> arguments) { |
| if (arguments.length != 1) { |
| throw ArgumentError('Natural logarithm requires exactly 1 argument.'); |
| } |
| return math.log(arguments[0]); |
| } |
| } |
| |
| class ExpNotationOperation implements Operation { |
| @override |
| String get name => 'EXP'; |
| |
| @override |
| num apply(List<num> arguments) { |
| if (arguments.length != 2) { |
| throw ArgumentError( |
| 'EXP requires exactly 2 arguments (mantissa, exponent).', |
| ); |
| } |
| return arguments[0] * math.pow(10, arguments[1]); |
| } |
| } |
| |
| class EOperation implements Operation { |
| @override |
| String get name => 'e'; |
| |
| @override |
| num apply(List<num> arguments) { |
| if (arguments.isNotEmpty) { |
| throw ArgumentError('Constant "e" does not accept arguments.'); |
| } |
| return math.e; |
| } |
| } |
| |
| /// The entrypoint of th edynamic module returns a `void Function(Registry)` |
| /// that, when invoke, registers all operations defined by this module. |
| @pragma('dyn-module:entry-point') |
| Object? dynamicModuleEntrypoint() { |
| return (Registry registry) { |
| registry.addOperation(ExponentOperation()); |
| registry.addOperation(SqrtOperation()); |
| registry.addOperation(LogOperation()); |
| registry.addOperation(LnOperation()); |
| registry.addOperation(ExpNotationOperation()); |
| registry.addOperation(EOperation()); |
| }; |
| } |