LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
expr_common.hpp
浏览该文件的文档.
1#pragma once
2
3#include "expr.hpp"
5#include <exception>
6#include <memory>
7#include <string>
8#include <utility>
9
11
12inline constexpr const char* kSymOperation = "LMCAS.sym";
13inline constexpr const char* kIntegerOperation = "LMCAS.integer";
14inline constexpr const char* kRationalOperation = "LMCAS.rational";
15inline constexpr const char* kApproxOperation = "LMCAS.approx_real";
16inline constexpr const char* kComplexOperation = "LMCAS.complex";
17inline constexpr const char* kExprOperation = "LMCAS.expr_op";
18inline constexpr const char* kMathOperation = "LMCAS.math";
19inline constexpr const char* kRealOperation = "LMCAS.real";
20inline constexpr const char* kImagOperation = "LMCAS.imag";
21inline constexpr const char* kConjOperation = "LMCAS.conj";
22inline constexpr const char* kAbsOperation = "LMCAS.abs";
23inline constexpr const char* kExpandOperation = "LMCAS.expand";
24inline constexpr const char* kDifferentiateOperation = "LMCAS.differentiate";
25inline constexpr const char* kSubstituteOperation = "LMCAS.substitute";
26inline constexpr const char* kExprMatchOperation = "LMCAS.expr_match";
27
28ExprResult expression_failure(CasErrc code, std::string message,
29 const char* operation);
30ExprMatchResult expr_match_failure(CasErrc code, std::string message,
31 const char* operation);
32
35 const char* function_name,
36 ExprPtr (*factory)(ExprPtr));
37
40 const char* function_name,
42
44 const char* operation);
45
46bool is_reserved_symbol_name(const std::string& name);
48 const char* function_name);
49ExprResult comparison_value(const ExprPtr& expression,
51
52template <typename Factory>
54 const ExprPtr& rhs,
56 const char* function_name,
57 Factory&& factory) {
58 auto step = context.consume_steps(1, kMathOperation);
59 if (!step) return ExprResult::failure(step.error());
60 if (!lhs || !LMCAS::detail::node(lhs) ||
63 std::string(function_name) +
64 " arguments cannot be null",
66 }
67 try {
68 auto result = std::forward<Factory>(factory)(lhs, rhs);
69 if (!result || !LMCAS::detail::node(result)) {
71 std::string(function_name) +
72 " expression construction failed",
74 }
75 return ExprResult::success(std::move(result));
76 } catch (const std::bad_alloc&) {
78 std::string(function_name) +
79 " expression allocation failed",
81 } catch (const std::exception& error) {
84 }
85}
86
87template <typename Factory>
89 const ExprPtr& rhs,
91 const char* operation_name,
92 Factory&& factory) {
93 auto step = context.consume_steps(1, kExprOperation);
94 if (!step) return ExprResult::failure(step.error());
95 if (!lhs || !LMCAS::detail::node(lhs) ||
98 std::string(operation_name) +
99 " operands cannot be null",
101 }
102 try {
103 auto result = std::forward<Factory>(factory)(lhs, rhs);
104 if (!result || !LMCAS::detail::node(result)) {
106 std::string(operation_name) +
107 " expression construction failed",
109 }
110 return ExprResult::success(std::move(result));
111 } catch (const std::bad_alloc&) {
113 std::string(operation_name) +
114 " expression allocation failed",
116 } catch (const std::exception& error) {
117 return expression_failure(CasErrc::InvalidArgument, error.what(),
119 }
120}
121
122}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(ExprPtr value)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
constexpr const char * kRealOperation
constexpr const char * kExprMatchOperation
constexpr const char * kIntegerOperation
constexpr const char * kSymOperation
ExprResult make_unary_function_expr(const ExprPtr &expression, ComputationContext &context, const char *function_name, FunctionNode::FuncType type)
constexpr const char * kApproxOperation
constexpr const char * kComplexOperation
constexpr const char * kRationalOperation
constexpr const char * kSubstituteOperation
constexpr const char * kImagOperation
constexpr const char * kExpandOperation
ExprResult require_dimensionless(const ExprPtr &expression, const char *function_name)
ExprResult make_binary_expr(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context, const char *operation_name, Factory &&factory)
constexpr const char * kExprOperation
constexpr const char * kAbsOperation
ExprResult expression_failure(CasErrc code, std::string message, const char *operation)
ExprMatchResult expr_match_failure(CasErrc code, std::string message, const char *operation)
ExprResult make_unary_math_expr(const ExprPtr &expression, ComputationContext &context, const char *function_name, ExprPtr(*factory)(ExprPtr))
ExprResult make_binary_math_expr(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context, const char *function_name, Factory &&factory)
ExprResult comparison_value(const ExprPtr &expression, ComputationContext &context)
bool is_reserved_symbol_name(const std::string &name)
constexpr const char * kConjOperation
constexpr const char * kDifferentiateOperation
constexpr const char * kMathOperation
ExprResult expr_from_complex_result(const ExpressionResult &result, const char *operation)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
Result< ExprPtr > ExprResult
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.
std::shared_ptr< SymbolicExpr > ExprPtr
const ExprPtr & rhs
Result< ExprMatch > ExprMatchResult
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
内部 AST 定义。