Enum libunseemly::beta::Beta [−][src]
pub enum Beta {
Basic(Name, Name),
SameAs(Name, Box<Ast>),
BoundButNotUsable(Name),
Underspecified(Name),
Protected(Name),
Shadow(Box<Beta>, Box<Beta>),
ShadowAll(Box<Beta>, Vec<Name>),
Nothing,
}
Expand description
Beta
s 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).
Beta
s 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(Name, Name)
Both of these Name
s refer to named terms in the current Scope
(or ResEnv
, for Ast
s).
The first is the identifier to import, and the second the syntax for its type.
SameAs(Name, 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>)
Shadow the names from two Beta
s.
ShadowAll(Box<Beta>, 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
pub fn names_mentioned(&self) -> Vec<Name>ⓘ
pub fn names_mentioned_and_bound(&self) -> Vec<Name>ⓘ
Trait Implementations
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
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
impl !RefUnwindSafe for Beta
impl !UnwindSafe for Beta
Blanket Implementations
Mutably borrows from an owned value. Read more
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.
type Output = T
type Output = T
Should always be Self
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