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
impl Name
Sourcepub fn scan(text: &str) -> Option<(Name, usize)>
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.
Sourcepub fn from_parts(parts: Vec<String>) -> Option<Name>
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.
Sourcepub fn short(&self) -> &str
pub fn short(&self) -> &str
The final component — the short name, with every namespace stripped.
Sourcepub fn enclosing(&self) -> Vec<String>
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.
Sourcepub fn key_reads_back(&self) -> bool
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.
Sourcepub fn is_spelled_by(&self, written: &str) -> bool
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.
Sourcepub fn is_root_escaped(&self) -> bool
pub fn is_root_escaped(&self) -> bool
Is this name spelled with the _root_ escape?
Sourcepub fn after_prefix(&self, prefix: &Name) -> Option<Vec<String>>
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 Ord for Name
impl Ord for Name
Source§impl PartialOrd for Name
impl PartialOrd for Name
impl Eq for Name
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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
impl<T> DowncastSync for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.