pub struct ExplicitDef {
pub name: String,
pub left: Option<String>,
pub right: String,
pub dyad_only: bool,
pub result: Option<String>,
pub locals: Vec<String>,
pub body: Vec<Expr>,
pub empty: Option<Array>,
pub labels: Vec<(String, usize)>,
pub pure: bool,
}Expand description
An explicit definition: J’s 3 : '…', 4 : '…' and {{ … }}, APL’s
{…} and ∇-defined functions.
Fields§
§name: StringHow the definition names itself in diagnostics and explain.
left: Option<String>The names the arguments arrive under: (left, right). A definition
with no left name has no dyadic valence.
right: String§dyad_only: boolTrue where a left name is part of the definition’s valence rather
than a name the body may or may not read: J’s 4 : '…' and a {{ }}
that mentions x are dyads and nothing else, while an APL dfn that
names ⍺ still runs monadically and finds ⍺ undefined.
result: Option<String>The name the result is read from when the body does not yield one
(an APL ∇-definition’s Z←); None means the body’s own value.
locals: Vec<String>Names the header declares local (APL’s ;name list).
body: Vec<Expr>§empty: Option<Array>The value a body that ran nothing yields; None makes that an error.
labels: Vec<(String, usize)>APL’s branch labels: each label with the body statement it names.
A label’s value is its line number, which is one more than its
position here, and → takes one of those numbers.
pure: boolTrue when running the body can have no effect beyond its result.
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for ExplicitDef
impl !UnwindSafe for ExplicitDef
impl Freeze for ExplicitDef
impl Send for ExplicitDef
impl Sync for ExplicitDef
impl Unpin for ExplicitDef
impl UnsafeUnpin for ExplicitDef
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more