Skip to main content

Name

Struct Name 

Source
pub struct Name { /* private fields */ }
Expand description

A hierarchical name — Lean’s Name, which is a LIST of components and not a string with dots.

The distinction is not cosmetic. To resolve a short name against an enclosing namespace at all you must be able to walk the PREFIXES of the current namespace, and to store the answer you must be able to re-compose one flat absolute key. A String with dots in it can do the second and not the first.

A component is whatever scan_name accepts — ONE grammar for both doors, so every name the declaration door takes is a name a term can spell. A «guillemet name» is ONE component even when it contains a ., which is how a name with a dot in it stays writable.

Implementations§

Source§

impl Name

Source

pub fn scan(text: &str) -> Option<(Name, usize)>

Read a name off the FRONT of text, returning it with the bytes consumed. Components are separated by . with no surrounding space — Outer.Inner.value is three components, and Outer. Inner is one component followed by a sentence terminator.

Source

pub fn parse(text: &str) -> Option<Name>

Read a name that is the WHOLE of text.

Source

pub fn from_parts(parts: Vec<String>) -> Option<Name>

A name from components already in hand. None for the empty list — there is no such name.

Source

pub fn key(&self) -> String

The flat absolute key the kernel context is indexed by.

Source

pub fn parts(&self) -> &[String]

The components, outermost first.

Source

pub fn short(&self) -> &str

The final component — the short name, with every namespace stripped.

Source

pub fn enclosing(&self) -> Vec<String>

Everything but the final component: the namespace a DECLARATION name itself names. For Foo.Bar.baz that is Foo.Bar, and Lean elaborates such a declaration with Foo.Bar current — which is where a short name inside it finds its siblings.

Source

pub fn key_reads_back(&self) -> bool

Does this name’s flat key read back as this same name?

The kernel Context is keyed by a flat String, so a name is only HOLDABLE if its key identifies it. «a.b» is ONE component and keys at a.b, which reads back as the TWO-component a.b — two different names, one key, and whichever is declared second answers to the other’s spelling with nothing reported. That is this lane’s own defect class (a short name quietly denoting a constant nobody wrote) arriving through the guillemet escape instead of through an open.

A key that reads back as NOTHING AT ALL (a name with spaces, weird?!name) is holdable: no term-level spelling produces that string either, so there is nothing for it to collide with, and the quoted form stays the escape it was built to be.

Source

pub fn is_spelled_by(&self, written: &str) -> bool

Can the TERM door spell this name, written exactly as written?

★ THE INVARIANT, CHECKED RATHER THAN RESTATED. “Every name the declaration door accepts, a term can spell” is the rule this whole grammar exists for, and scan_name gives both doors one COMPONENT grammar — but the term door joins components with its own dot-postfix rule and reserves its own keywords, so two doors that agree about components can still disagree about whole names. Definition end : Nat := Zero. and Definition Outer.«a b» : Nat := Zero. both scanned clean and both produced a global no Check could ever name: write-only names, by a route the component grammar cannot see.

So rather than restate the term door’s rule here — two grammars again, one step removed — the declaration door hands the spelling to the term door and requires this same name back. The check reads the grammar it is checking against, so it cannot drift from it.

The surface is deliberately EMPTY: a name must be spellable with no notation in force, or it is a name whose readability depends on a macro that a later End can take away.

Source

pub fn is_root_escaped(&self) -> bool

Is this name spelled with the _root_ escape?

Source

pub fn after_prefix(&self, prefix: &Name) -> Option<Vec<String>>

The components of self that follow prefix, or None when prefix is not one.

Lean’s Name.isPrefixOf (Lean/Data/Name.lean:46-49) plus the replacePrefix that always follows it: resolveOpenDecls (Lean/ResolveName.lean:146-151) resolves an explicit open Foo (x) for x.y by testing that x is a PREFIX of x.y and swapping it for Foo.x. An equal name gives the EMPTY remainder, which is that rule’s other half (openedId == id, line 144) falling out of the same test.

Trait Implementations§

Source§

impl Clone for Name

Source§

fn clone(&self) -> Name

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 Name

Source§

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

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

impl Display for Name

Source§

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

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

impl Hash for Name

Source§

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

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 Ord for Name

Source§

fn cmp(&self, other: &Name) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Name

Source§

fn eq(&self, other: &Name) -> 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 PartialOrd for Name

Source§

fn partial_cmp(&self, other: &Name) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

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

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

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

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

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

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

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

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl Eq for Name

Source§

impl StructuralPartialEq for Name

Auto Trait Implementations§

§

impl Freeze for Name

§

impl RefUnwindSafe for Name

§

impl Send for Name

§

impl Sync for Name

§

impl Unpin for Name

§

impl UnsafeUnpin for Name

§

impl UnwindSafe for Name

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
§

impl<Q, K> Comparable<K> for Q
where Q: Ord + ?Sized, K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
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> Same for T

Source§

type Output = T

Should always be Self
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.
§

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

§

fn vzip(self) -> V

§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,