Make variable assignment convert streams to full values

This commit is contained in:
JT 2021-09-07 06:05:46 +12:00
parent cdbd333c9b
commit 4ce9a5c894
3 changed files with 34 additions and 0 deletions

View file

@ -14,12 +14,15 @@
- [x] parsing tables
- [x] Block params
- [x] Ranges
- [ ] Iteration (`each`) over tables
- [ ] ctrl-c support
- [ ] Column path
- [ ] ...rest without calling it rest
- [ ] operator overflow
- [ ] finish operator type-checking
- [ ] Source
- [ ] Autoenv
- [ ] Externals
- [ ] let [first, rest] = [1, 2, 3]
## Maybe:

View file

@ -22,6 +22,29 @@ impl EvaluationContext {
}
pub fn add_var(&self, var_id: VarId, value: Value) {
// We need to make values concreate before we assign them to variables, as stream values
// will drain and remain drained.
//
// TODO: find a good home for this
// TODO: add ctrl-c support
let value = match value {
Value::RowStream {
headers,
stream,
span,
} => Value::Table {
headers,
val: stream.collect(),
span,
},
Value::ValueStream { stream, span } => Value::List {
val: stream.collect(),
span,
},
x => x,
};
self.stack.add_var(var_id, value);
}

View file

@ -228,3 +228,11 @@ fn range_iteration2() -> TestResult {
fn simple_value_iteration() -> TestResult {
run_test("4 | each { $it + 10 }", "14")
}
#[test]
fn concrete_variable_assignment() -> TestResult {
run_test(
"let x = (1..100 | each { |y| $y + 100 }); $x | length; $x | length",
"100",
)
}