pub struct Let {
pub span: SourceSpan,
pub name: Identifier,
pub value: Expr,
pub body: Vec<Statement>,
}Expand description
A let statement binds name to the value of expr in body.
Fields§
§span: SourceSpan§name: IdentifierThe identifier to be bound
value: ExprThe expression to bind
body: Vec<Statement>The statements for which this binding will be visible.
For example, given the following:
integrity_constraints {
let x = 2
let y = x^2
enf clk = x
enf clk' = clk + y
}When parsed, the syntax tree for the integrity_constraints block
would have a single Statement, the Let corresponding to let x = 2.
The body of that let would also contain a single Statement, another
Let corresponding to let y = x^2, which in turn would contain the
two constraint statements in its body.
In other words, when present, a Let introduces a new block/lexical scope,
and all subsequent statements are included in that block. The body of a Let
is that block. A Let will always be the final statement in its containing block,
e.g. integrity_constraints, but may be preceded by any number of non-Let statements.
Implementations§
Source§impl Let
impl Let
pub fn new( span: SourceSpan, name: Identifier, value: Expr, body: Vec<Statement>, ) -> Self
Sourcepub fn ty(&self) -> Option<Type>
pub fn ty(&self) -> Option<Type>
Return the type of the overall let expression.
A let with an empty body, or with a body that terminates with a non-expression statement
has no type (or rather, one could consider the type it returns to be of “void” or “unit” type).
For let statements with a non-empty body that terminates with an expression, the let can
be used in expression position, producing the value of the terminating expression in its body,
and having the same type as that value.
Trait Implementations§
impl Eq for Let
Auto Trait Implementations§
impl Freeze for Let
impl RefUnwindSafe for Let
impl Send for Let
impl Sync for Let
impl Unpin for Let
impl UnwindSafe for Let
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,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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