about summary refs log tree commit diff
path: root/tvix
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-08-23T17·37+0300
committertazjin <tazjin@tvl.su>2022-09-01T21·41+0000
commitd57366a6c2e6abec77357457b7cfb25fe3491c40 (patch)
tree03009d77a3e85e1b2c980588b9078d12719b4804 /tvix
parent3ed40b4eeafb6c37ab1cc0550e591c4113efd252 (diff)
feat(tvix/eval): introduce initial `Lambda` type r/4574
Change-Id: Ifa9766f5ffeff99e926936bafd697e885e733b78
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6238
Tested-by: BuildkiteCI
Reviewed-by: grfn <grfn@gws.fyi>
Diffstat (limited to 'tvix')
-rw-r--r--tvix/eval/src/value/lambda.rs12
-rw-r--r--tvix/eval/src/value/mod.rs6
2 files changed, 18 insertions, 0 deletions
diff --git a/tvix/eval/src/value/lambda.rs b/tvix/eval/src/value/lambda.rs
new file mode 100644
index 0000000000..2cecb4f537
--- /dev/null
+++ b/tvix/eval/src/value/lambda.rs
@@ -0,0 +1,12 @@
+//! This module implements the runtime representation of functions.
+use std::rc::Rc;
+
+use crate::chunk::Chunk;
+
+use super::NixString;
+
+#[derive(Clone, Debug)]
+pub struct Lambda {
+    name: Option<NixString>,
+    chunk: Rc<Chunk>,
+}
diff --git a/tvix/eval/src/value/mod.rs b/tvix/eval/src/value/mod.rs
index f054191f67..2177ca26d9 100644
--- a/tvix/eval/src/value/mod.rs
+++ b/tvix/eval/src/value/mod.rs
@@ -4,11 +4,13 @@ use std::rc::Rc;
 use std::{fmt::Display, path::PathBuf};
 
 mod attrs;
+mod lambda;
 mod list;
 mod string;
 
 use crate::errors::{ErrorKind, EvalResult};
 pub use attrs::NixAttrs;
+pub use lambda::Lambda;
 pub use list::NixList;
 pub use string::NixString;
 
@@ -23,6 +25,7 @@ pub enum Value {
     Path(PathBuf),
     Attrs(Rc<NixAttrs>),
     List(NixList),
+    Lambda(Lambda),
 
     // Internal values that, while they technically exist at runtime,
     // are never returned to or created directly by users.
@@ -46,6 +49,7 @@ impl Value {
             Value::Path(_) => "path",
             Value::Attrs(_) => "set",
             Value::List(_) => "list",
+            Value::Lambda(_) => "lambda",
 
             // Internal types
             Value::AttrPath(_) | Value::Blackhole | Value::NotFound => "internal",
@@ -123,6 +127,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
 
             // Nix prints floats with a maximum precision of 5 digits
             // only.
@@ -158,6 +163,7 @@ impl PartialEq for Value {
 
             // Everything else is either incomparable (e.g. internal
             // types) or false.
+            // TODO(tazjin): mirror Lambda equality behaviour
             _ => false,
         }
     }