Enum Postfix

Source
pub enum Postfix {
    Empty,
    Function(String, Box<Expression>),
    Index(Box<Postfix>, Box<Expression>),
    Method(Box<Postfix>, String, Box<Expression>),
    Inference(Reference, Box<Expression>),
    Primary(Box<Primary>),
}
Expand description

Represents a postfix expression in the AIMX grammar.

Postfix expressions are operations that occur after their operands, following the left-to-right associativity rule. This enum captures all possible postfix operations including function calls, method calls, array indexing, and inference operations, as well as flattened primary expressions for optimization.

§Variants

  • Empty - The empty placeholder _ representing no operation
  • Function - Function call with identifier and arguments
  • Index - Array indexing operation with base and index
  • Method - Method call on an object with method name and arguments
  • Inference - Inference call on a reference with arguments
  • Primary - Flattened primary expression (optimization)

§Examples

use aimx::expressions::postfix::Postfix;
use aimx::expressions::primary::Primary;
use aimx::Literal;
 
// Empty placeholder
let empty = Postfix::Empty;
assert!(empty.is_empty());
 
// Function call
let args = aimx::Expression::Empty;
let function = Postfix::Function("sum".to_string(), Box::new(args));
 
// Array indexing
let base = Box::new(Postfix::Primary(Box::new(Primary::Literal(Literal::Number(42.0)))));
let index = Box::new(aimx::Expression::Empty);
let index_op = Postfix::Index(base, index);
 
// Method call
let obj = Box::new(Postfix::Primary(Box::new(Primary::Literal(Literal::Text("data".to_string())))));
let method = Postfix::Method(obj, "to_upper".to_string(), Box::new(aimx::Expression::Empty));

§AST Flattening

The Primary variant represents an optimization where expressions that consist solely of primary expressions (literals, references, parentheses) are flattened to reduce AST depth and improve evaluation performance.

§See Also

Variants§

§

Empty

The empty placeholder _

§

Function(String, Box<Expression>)

Function call with function name and argument expression

§

Index(Box<Postfix>, Box<Expression>)

Array indexing operation with base and index expressions

§

Method(Box<Postfix>, String, Box<Expression>)

Method call on an object with method name and arguments

§

Inference(Reference, Box<Expression>)

Inference call on a reference and arguments

§

Primary(Box<Primary>)

Primary flattened AST optimization

Implementations§

Source§

impl Postfix

Source

pub fn is_empty(&self) -> bool

Check if this postfix expression represents an empty placeholder.

§Returns
  • bool - True if this is an Empty postfix expression, false otherwise
§Examples
use aimx::expressions::{
    postfix::Postfix,
    primary::Primary,
};
use aimx::Literal;
 
let empty = Postfix::Empty;
assert!(empty.is_empty());
 
let literal = Postfix::Primary(Box::new(Primary::Literal(Literal::Number(42.0))));
assert!(!literal.is_empty());

Trait Implementations§

Source§

impl Clone for Postfix

Source§

fn clone(&self) -> Postfix

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Postfix

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Postfix

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl ExpressionLike for Postfix

Source§

fn evaluate(&self, context: &mut dyn ContextLike) -> Result<Value>

Evaluate this postfix expression within the given context.

This method recursively evaluates the postfix expression tree, delegating to the appropriate evaluation methods for each postfix variant. It handles function calls, method calls, array indexing, and inference operations.

§Arguments
  • context - The evaluation context providing variable values, function implementations, and method implementations
§Returns

Returns a Result containing the evaluated Value if successful, or an error if evaluation fails.

§Evaluation Strategy
§Examples
use aimx::expressions::postfix::Postfix;
use aimx::expressions::primary::Primary;
use aimx::{Context, Literal, ExpressionLike};
 
// Evaluate empty placeholder
let mut context = Context::new();
let postfix = Postfix::Empty;
let result = postfix.evaluate(&mut context).unwrap();
assert_eq!(result, aimx::Value::Empty);
 
// Evaluate literal expression
let primary = Primary::Literal(Literal::Number(42.0));
let postfix = Postfix::Primary(Box::new(primary));
let result = postfix.evaluate(&mut context).unwrap();
assert_eq!(result.to_string(), "42");
§Error Handling

This method returns detailed error messages including:

  • Array index out of bounds errors
  • Type mismatch errors for array indexing
  • Function and method call failures
  • Inference call failures
§See Also
Source§

fn write(&self, writer: &mut Writer)

Write this expression to the provided writer. Read more
Source§

fn to_sanitized(&self) -> String

Convert this expression to a sanitized string representation. Read more
Source§

fn to_formula(&self) -> String

Convert this expression to a formula string representation. Read more
Source§

impl PartialEq for Postfix

Source§

fn eq(&self, other: &Postfix) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for Postfix

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> ToStringFallible for T
where T: Display,

§

fn try_to_string(&self) -> Result<String, TryReserveError>

ToString::to_string, but without panic on OOM.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,