Enum libunseemly::beta::Beta[][src]

pub enum Beta {
    Basic(NameName),
    SameAs(NameBox<Ast>),
    BoundButNotUsable(Name),
    Underspecified(Name),
    Protected(Name),
    Shadow(Box<Beta>, Box<Beta>),
    ShadowAll(Box<Beta>, Vec<Name>),
    Nothing,
}
Expand description

Betas are always tied to a particular Form, and they have names that refer to the parts of that Form. They are generally used to talk about environmental operations, and they are most useful for typechecking (the evaluation process ignores them, because it needs to do more complex operations to calculate extended environments).

Betas are trees that determine how variables shadow each other, if multiple variables are being handled at once. The leaf nodes, Basic and SameAs, indicate (a) where the name comes from (b) where to get the type annotation (Basic) or an expression producing the type (SameAs) for that name. The more exotic leaf nodes, Underspecified, Protected, and BoundButNotUsable do various weird things.

I have no idea where the name “β” came from, and whether it has any connection to α-equivalence.

There’s probably a very elegant way to make Beta just another kind of Ast. Finding it might require some time in the math mines, though.

Variants

Basic(NameName)

Tuple Fields

0: Name
1: Name

Both of these Names refer to named terms in the current Scope (or ResEnv, for Asts). The first is the identifier to import, and the second the syntax for its type.

SameAs(NameBox<Ast>)

Tuple Fields

0: Name
1: Box<Ast>

Like Basic, but here the second part is another expression which should be typechecked, and whose type the new name gets. (This can be used write to let without requiring a type annotation.)

BoundButNotUsable(Name)

Tuple Fields

0: Name

Names are introduced here, but bound to Trivial. Needed to avoid an infinite regress where the syntax for Scope does a self-import to expose the names it introduces to the (syntax for) betas that need them.

Underspecified(Name)

Tuple Fields

0: Name

Name is introduced here (must be a single Atom), and its meaning is figured out from usage.

Protected(Name)

Tuple Fields

0: Name

Name is left alone (must be a single VarRef, and already bound)

Shadow(Box<Beta>, Box<Beta>)

Tuple Fields

0: Box<Beta>
1: Box<Beta>

Shadow the names from two Betas.

ShadowAll(Box<Beta>, Vec<Name>)

Tuple Fields

0: Box<Beta>
1: Vec<Name>

Shadow the names from a Beta, repeated. The Vec should always be equal to names_mentioned(...) of the Beta.

Nothing

No names

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

The Unseemly type that corresponds to to the Reifiable type. This leaves abstract the type parameters of Self; invoke like Self::<Irr,Irr>::ty(). e.g. ∀ A. Pair<A int> TODO: rename to generic_ty Read more

A name for that type, so that recursive types are okay. Ignore the type parameters of Self; invoke like Self::<Irr,Irr>::ty_name(). e.g. WithInteger Read more

The Unseemly value that corresponds to a value.

Get a value from an Unseemly value

How to refer to this type, given an environment in which ty_name() is defined to be ty(). Parameters will be concrete. e.g. WithInteger<Float> (Types using this type will use this, rather than ty) Don’t override this. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Converts self into T using Into<T>. Read more

Performs the conversion.

Performs the conversion.

Pipes by value. This is generally the method you want to use. Read more

Borrows self and passes that borrow into the pipe function. Read more

Mutably borrows self and passes that borrow into the pipe function. Read more

Borrows self, then passes self.borrow() into the pipe function. Read more

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more

Borrows self, then passes self.as_ref() into the pipe function.

Mutably borrows self, then passes self.as_mut() into the pipe function. Read more

Borrows self, then passes self.deref() into the pipe function.

Mutably borrows self, then passes self.deref_mut() into the pipe function. Read more

Should always be Self

Immutable access to a value. Read more

Mutable access to a value. Read more

Immutable access to the Borrow<B> of a value. Read more

Mutable access to the BorrowMut<B> of a value. Read more

Immutable access to the AsRef<R> view of a value. Read more

Mutable access to the AsMut<R> view of a value. Read more

Immutable access to the Deref::Target of a value. Read more

Mutable access to the Deref::Target of a value. Read more

Calls .tap() only in debug builds, and is erased in release builds.

Calls .tap_mut() only in debug builds, and is erased in release builds. Read more

Calls .tap_borrow() only in debug builds, and is erased in release builds. Read more

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds. Read more

Calls .tap_ref() only in debug builds, and is erased in release builds. Read more

Calls .tap_ref_mut() only in debug builds, and is erased in release builds. Read more

Calls .tap_deref() only in debug builds, and is erased in release builds. Read more

Calls .tap_deref_mut() only in debug builds, and is erased in release builds. Read more

The resulting type after obtaining ownership.

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

🔬 This is a nightly-only experimental API. (toowned_clone_into)

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

Attempts to convert self into T using TryInto<T>. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.