Skip to main content

Expr

Enum Expr 

Source
pub enum Expr<A: AstTypes = DefaultTypes> {
    Omitted,
    Id(A::Path),
    MetId(A::MacroId),
    Lit(A::Literal),
    Use(Use<A>),
    Bind(Box<Bind<A>>),
    Make(Box<Make<A>>),
    Match(Box<Match<A>>),
    Op(Op, Vec<At<Self, A>>),
}
Expand description

Expressions: The beating heart of Conlang.

A program in Conlang is a single expression which, at compile time, sets up the state in which a program will run. This expression binds types, functions, and values to names which are exposed at runtime.

Whereas in the body of a function, do sequences are ordered, in the global scope (or subsequent module scopes, which are children of the global module,) do sequences are considered unordered, and subexpressions may be reordered in whichever way the compiler sees fit. This is especially important when performing import resolution, as imports typically depend on the order in which names are bound.

Variants§

§

Omitted

Omitted by semicolon insertion-elision rules

§

Id(A::Path)

An identifier

§

MetId(A::MacroId)

An escaped token for macro binding

§

Lit(A::Literal)

A literal bool, string, char, or int

§

Use(Use<A>)

use Use

§

Bind(Box<Bind<A>>)

let Pat::NoTopAlt (= expr (else expr)?)? | (fn | mod | impl) Pat::Fn Expr

§

Make(Box<Make<A>>)

Expr { (Ident (: Expr)?),* }

§

Match(Box<Match<A>>)

match Expr { (Pat => Expr),* }

§

Op(Op, Vec<At<Self, A>>)

Op Expr | Expr Op | Expr (Op Expr)+ | Op Expr Expr else Expr

Implementations§

Source§

impl<A: AstTypes> Expr<A>

Source

pub const fn at(self, annotation: A::Annotation) -> At<Expr<A>, A>

Attaches this Expr to an At node with the provided Annotation.

Source

pub fn and_do(self, annotation: A::Annotation, other: At<Expr<A>, A>) -> Self

Attaches another expression to this one, continuing a do chain if possible.

Source

pub fn to_tuple(self, annotation: A::Annotation) -> Self

Turns this expression into a tuple if it isn’t already one.

Source

pub const fn is_place(&self) -> bool

Returns whether self is a “place projection” expression (identifier, index, dot, or deref)

Source

pub const fn is_value(&self) -> bool

Returns whether self is NOT a “place projection” expression

Source

pub const fn as_slice(&self) -> Option<(Op, &[At<Expr<A>, A>])>

If self is an Expr::Op, returns the Op and a slice of its arguments.

Trait Implementations§

Source§

impl<A: Clone + AstTypes> Clone for Expr<A>
where A::Path: Clone, A::MacroId: Clone, A::Literal: Clone,

Source§

fn clone(&self) -> Expr<A>

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<A: Debug + AstTypes> Debug for Expr<A>
where A::Path: Debug, A::MacroId: Debug, A::Literal: Debug,

Source§

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

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

impl<A: AstTypes> Display for Expr<A>

Source§

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

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

impl<A: AstTypes, B: AstTypes> Foldable<A, B> for Expr<A>

Source§

type Out = Expr<B>

The return type of the associated Fold function
Source§

fn fold_in<F: Fold<A, B> + ?Sized>( self, folder: &mut F, ) -> Result<Self::Out, F::Error>

Calls Self’s appropriate Folder function(s)
Source§

fn children<F: Fold<A, B> + ?Sized>( self, folder: &mut F, ) -> Result<Self::Out, F::Error>

Destructures self, calling Foldable::fold_in on all foldable members, and rebuilds a Self out of the results.
Source§

impl<A: Hash + AstTypes> Hash for Expr<A>
where A::Path: Hash, A::MacroId: Hash, A::Literal: Hash,

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<A: AstTypes> Match<A> for Expr<A>

Source§

fn recurse(sub: &mut Subst<A>, pat: &Self, expr: &Self) -> bool

Implements recursive Subst-building for Self
Source§

fn apply(&mut self, sub: &Subst<A>)

With self as the pattern, recursively applies the Subst
Source§

fn apply_rule(&mut self, pat: &Self, template: &Self) -> bool
where Self: Sized + Clone,

Applies a substitution rule from pat to template on self
Source§

fn match_with(&self, pat: &Self) -> Option<Subst<A>>

Matches self against the provided pattern
Source§

impl<A: PartialEq + AstTypes> PartialEq for Expr<A>

Source§

fn eq(&self, other: &Expr<A>) -> 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<'a, A: AstTypes> Walk<'a, A> for Expr<A>

Source§

fn children<V: Visit<'a, A> + ?Sized>( &'a self, v: &mut V, ) -> Result<(), V::Error>

Source§

fn visit_in<V: Visit<'a, A> + ?Sized>( &'a self, v: &mut V, ) -> Result<(), V::Error>

Source§

impl<A: Eq + AstTypes> Eq for Expr<A>
where A::Path: Eq, A::MacroId: Eq, A::Literal: Eq,

Source§

impl<A: AstTypes> StructuralPartialEq for Expr<A>

Auto Trait Implementations§

§

impl<A> Freeze for Expr<A>
where <A as AstTypes>::Path: Freeze, <A as AstTypes>::MacroId: Freeze, <A as AstTypes>::Literal: Freeze, <A as AstTypes>::Symbol: Freeze,

§

impl<A> RefUnwindSafe for Expr<A>

§

impl<A> Send for Expr<A>
where <A as AstTypes>::Path: Send, <A as AstTypes>::MacroId: Send, <A as AstTypes>::Literal: Send, <A as AstTypes>::Symbol: Send, <A as AstTypes>::Annotation: Send,

§

impl<A> Sync for Expr<A>
where <A as AstTypes>::Path: Sync, <A as AstTypes>::MacroId: Sync, <A as AstTypes>::Literal: Sync, <A as AstTypes>::Symbol: Sync, <A as AstTypes>::Annotation: Sync,

§

impl<A> Unpin for Expr<A>
where <A as AstTypes>::Path: Unpin, <A as AstTypes>::MacroId: Unpin, <A as AstTypes>::Literal: Unpin, <A as AstTypes>::Symbol: Unpin, <A as AstTypes>::Annotation: Unpin,

§

impl<A> UnwindSafe for Expr<A>

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.

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.

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
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.
Source§

impl<T> Annotation for T
where T: Clone + Debug + Display + PartialEq + Eq + Hash,