pub struct Stack {
    pub vars: HashMap<VarId, Value>,
    pub env_vars: Vec<HashMap<String, Value>>,
    pub env_hidden: HashSet<String>,
}
Expand description

A runtime value stack used during evaluation

A note on implementation:

We previously set up the stack in a traditional way, where stack frames had parents which would represent other frames that you might return to when exiting a function.

While experimenting with blocks, we found that we needed to have closure captures of variables seen outside of the blocks, so that they blocks could be run in a way that was both thread-safe and followed the restrictions for closures applied to iterators. The end result left us with closure-captured single stack frames that blocks could see.

Blocks make up the only scope and stack definition abstraction in Nushell. As a result, we were creating closure captures at any point we wanted to have a Block value we could safely evaluate in any context. This meant that the parents were going largely unused, with captured variables taking their place. The end result is this, where we no longer have separate frames, but instead use the Stack as a way of representing the local and closure-captured state.

Fields

vars: HashMap<VarId, Value>

Variables

env_vars: Vec<HashMap<String, Value>>

Environment variables arranged as a stack to be able to recover values from parent scopes

env_hidden: HashSet<String>

Tells which environment variables from engine state are hidden. We don’t need to track the env vars in the stack since we can just delete them.

Implementations

Flatten the env var scope frames into one frame

Same as get_env_vars, but returns only the names as a HashSet

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Returns the “default value” for a type. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.