diff options
Diffstat (limited to 'tvix/eval')
-rw-r--r-- | tvix/eval/src/builtins/mod.rs | 2 | ||||
-rw-r--r-- | tvix/eval/src/compiler/mod.rs | 6 | ||||
-rw-r--r-- | tvix/eval/src/value/function.rs (renamed from tvix/eval/src/value/lambda.rs) | 5 | ||||
-rw-r--r-- | tvix/eval/src/value/mod.rs | 10 | ||||
-rw-r--r-- | tvix/eval/src/vm.rs | 4 |
5 files changed, 17 insertions, 10 deletions
diff --git a/tvix/eval/src/builtins/mod.rs b/tvix/eval/src/builtins/mod.rs index 11e0dc8d9fa7..99a63c97998d 100644 --- a/tvix/eval/src/builtins/mod.rs +++ b/tvix/eval/src/builtins/mod.rs @@ -44,7 +44,7 @@ fn pure_builtins() -> Vec<Builtin> { }), Builtin::new("isFunction", 1, |args| { Ok(Value::Bool(match args[0] { - Value::Lambda(_) => true, + Value::Closure(_) => true, Value::Builtin(_) => true, _ => false, })) diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 5cb02a66b96a..3160c68c6e3c 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -23,7 +23,7 @@ use std::rc::Rc; use crate::chunk::Chunk; use crate::errors::{Error, ErrorKind, EvalResult}; use crate::opcode::{CodeIdx, OpCode}; -use crate::value::{Lambda, Value}; +use crate::value::{Closure, Lambda, Value}; use crate::warnings::{EvalWarning, WarningKind}; /// Represents the result of compiling a piece of Nix code. If @@ -822,7 +822,9 @@ impl Compiler { crate::disassembler::disassemble_chunk(&compiled.lambda.chunk); } - self.emit_constant(Value::Lambda(compiled.lambda)); + self.emit_constant(Value::Closure(Closure { + lambda: compiled.lambda, + })); } fn compile_apply(&mut self, node: ast::Apply) { diff --git a/tvix/eval/src/value/lambda.rs b/tvix/eval/src/value/function.rs index d8609f50f367..45efc24f09f8 100644 --- a/tvix/eval/src/value/lambda.rs +++ b/tvix/eval/src/value/function.rs @@ -21,3 +21,8 @@ impl Lambda { &mut self.chunk } } + +#[derive(Clone, Debug)] +pub struct Closure { + pub lambda: Lambda, +} diff --git a/tvix/eval/src/value/mod.rs b/tvix/eval/src/value/mod.rs index bf07c5d326d0..6bd1efde52ff 100644 --- a/tvix/eval/src/value/mod.rs +++ b/tvix/eval/src/value/mod.rs @@ -5,14 +5,14 @@ use std::{fmt::Display, path::PathBuf}; mod attrs; mod builtin; -mod lambda; +mod function; mod list; mod string; use crate::errors::{ErrorKind, EvalResult}; pub use attrs::NixAttrs; pub use builtin::Builtin; -pub use lambda::Lambda; +pub use function::{Closure, Lambda}; pub use list::NixList; pub use string::NixString; @@ -27,7 +27,7 @@ pub enum Value { Path(PathBuf), Attrs(Rc<NixAttrs>), List(NixList), - Lambda(Lambda), + Closure(Closure), Builtin(Builtin), // Internal values that, while they technically exist at runtime, @@ -52,7 +52,7 @@ impl Value { Value::Path(_) => "path", Value::Attrs(_) => "set", Value::List(_) => "list", - Value::Lambda(_) | Value::Builtin(_) => "lambda", + Value::Closure(_) | Value::Builtin(_) => "lambda", // Internal types Value::AttrPath(_) | Value::Blackhole | Value::NotFound => "internal", @@ -130,7 +130,7 @@ impl Display for Value { Value::Path(p) => p.display().fmt(f), Value::Attrs(attrs) => attrs.fmt(f), Value::List(list) => list.fmt(f), - Value::Lambda(_) => f.write_str("lambda"), // TODO: print position + Value::Closure(_) => f.write_str("lambda"), // TODO: print position Value::Builtin(builtin) => builtin.fmt(f), // Nix prints floats with a maximum precision of 5 digits diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index 1e39792cd56f..6a7ebd5e64d2 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -7,7 +7,7 @@ use crate::{ chunk::Chunk, errors::{ErrorKind, EvalResult}, opcode::OpCode, - value::{Lambda, NixAttrs, NixList, Value}, + value::{Closure, Lambda, NixAttrs, NixList, Value}, }; #[cfg(feature = "disassembler")] @@ -357,7 +357,7 @@ impl VM { OpCode::OpCall => { let callable = self.pop(); match callable { - Value::Lambda(lambda) => self.call(lambda, 1), + Value::Closure(Closure { lambda }) => self.call(lambda, 1), Value::Builtin(builtin) => { let arg = self.pop(); let result = builtin.apply(arg)?; |