Refactor Tuple and Record to share ValueList

Introduce `ValueList` type alias for `Rc<Vec<Value>>` to reduce
boilerplate and improve readability.
Add `as_slice()` method to `Value` to provide a unified way to access
the underlying values of Tuples and Records.
Update `flatten_value` and `unpack` in `VM` to utilize the new
`as_slice()` method, simplifying logic and improving consistency.
This commit is contained in:
Michael Schimmel
2026-02-21 15:16:04 +01:00
parent 26f0ed9531
commit dc81b7d616
2 changed files with 28 additions and 27 deletions
+19 -3
View File
@@ -55,12 +55,16 @@ pub trait Object: fmt::Debug {
fn as_any(&self) -> &dyn Any;
}
/// A shared sequence of values, used by both Tuples and Records.
pub type ValueList = Rc<Vec<Value>>;
/// Internal storage for Records to allow sharing schema (keys) between instances.
#[derive(Debug, Clone)]
pub struct RecordData {
/// Names for slots.
pub keys: Rc<Vec<Keyword>>,
pub values: Vec<Value>,
/// The actual values, potentially shared with a Tuple.
pub values: ValueList,
}
/// Core data value in Myc Script (similar to TDataValue)
@@ -73,7 +77,7 @@ pub enum Value {
DateTime(i64),
Text(Rc<str>),
Keyword(Keyword),
Tuple(Rc<Vec<Value>>),
Tuple(ValueList),
Record(Rc<RecordData>),
Function(Rc<dyn Fn(Vec<Value>) -> Value>),
Object(Rc<dyn Object>), // For compiled Closures and other opaque types
@@ -225,12 +229,24 @@ impl Value {
}
}
/// Returns the underlying values as a slice if this is a Tuple or Record.
pub fn as_slice(&self) -> Option<&[Value]> {
match self {
Value::Tuple(v) => Some(v),
Value::Record(r) => Some(&r.values),
_ => None,
}
}
pub fn make_tuple(values: Vec<Value>) -> Self {
Value::Tuple(Rc::new(values))
}
pub fn make_record(keys: Vec<Keyword>, values: Vec<Value>) -> Self {
Value::Record(Rc::new(RecordData { keys: Rc::new(keys), values }))
Value::Record(Rc::new(RecordData {
keys: Rc::new(keys),
values: Rc::new(values)
}))
}
pub fn static_type(&self) -> StaticType {