aether/builtins/types.rs
1// src/builtins/types.rs
2//! 类型操作内置函数模块
3//!
4//! 提供类型检查、类型转换和长度计算等功能。
5
6use crate::evaluator::RuntimeError;
7use crate::value::Value;
8
9/// 获取值的类型名称
10///
11/// # 功能
12/// 返回值的类型名称字符串。
13///
14/// # 参数
15/// - `value`: 任意值
16///
17/// # 返回值
18/// 类型名称字符串:"Number", "String", "Boolean", "Null", "Array", "Dict", "Function", "Generator", "Lazy", "BuiltIn"
19///
20/// # 示例
21/// ```aether
22/// Println(TypeOf(42)) # 输出: Number
23/// Println(TypeOf("hello")) # 输出: String
24/// Println(TypeOf([1, 2, 3])) # 输出: Array
25/// Println(TypeOf(True)) # 输出: Boolean
26/// ```
27pub fn type_of(args: &[Value]) -> Result<Value, RuntimeError> {
28 if args.len() != 1 {
29 return Err(RuntimeError::WrongArity {
30 expected: 1,
31 got: args.len(),
32 });
33 }
34
35 let type_name = match &args[0] {
36 Value::Number(_) => "Number",
37 Value::Fraction(_) => "Fraction",
38 Value::String(_) => "String",
39 Value::Boolean(_) => "Boolean",
40 Value::Null => "Null",
41 Value::Array(_) => "Array",
42 Value::Dict(_) => "Dict",
43 Value::Function { .. } => "Function",
44 Value::Generator { .. } => "Generator",
45 Value::Lazy { .. } => "Lazy",
46 Value::BuiltIn { .. } => "BuiltIn",
47 };
48
49 Ok(Value::String(type_name.to_string()))
50}
51
52/// 将值转换为字符串
53///
54/// # 功能
55/// 将任意类型的值转换为其字符串表示形式。
56///
57/// # 参数
58/// - `value`: 要转换的值(任意类型)
59///
60/// # 返回值
61/// 字符串类型的值
62///
63/// # 示例
64/// ```aether
65/// Set NUM 42
66/// Set STR ToString(NUM) # "42"
67/// Println(ToString(True)) # "true"
68/// Println(ToString([1, 2, 3])) # "[1, 2, 3]"
69/// Println(ToString(Null)) # "null"
70/// ```
71pub fn to_string(args: &[Value]) -> Result<Value, RuntimeError> {
72 if args.len() != 1 {
73 return Err(RuntimeError::WrongArity {
74 expected: 1,
75 got: args.len(),
76 });
77 }
78
79 Ok(Value::String(args[0].to_string()))
80}
81
82/// 将值转换为数字
83///
84/// # 功能
85/// 将字符串、布尔值或其他类型转换为数字。
86///
87/// # 参数
88/// - `value`: 要转换的值
89///
90/// # 返回值
91/// 数字类型的值
92///
93/// # 转换规则
94/// - Number → 返回原值
95/// - String → 解析为浮点数(失败则报错)
96/// - Boolean → true=1.0, false=0.0
97/// - Null → 0.0
98/// - 其他类型 → 报错
99///
100/// # 示例
101/// ```aether
102/// Set NUM ToNumber("123") # 123.0
103/// Set VAL ToNumber("3.14") # 3.14
104/// Set B1 ToNumber(True) # 1.0
105/// Set B2 ToNumber(False) # 0.0
106/// Set NULL_NUM ToNumber(Null) # 0.0
107/// ```
108pub fn to_number(args: &[Value]) -> Result<Value, RuntimeError> {
109 if args.len() != 1 {
110 return Err(RuntimeError::WrongArity {
111 expected: 1,
112 got: args.len(),
113 });
114 }
115
116 match &args[0] {
117 Value::Number(n) => Ok(Value::Number(*n)),
118 Value::String(s) => {
119 s.parse::<f64>()
120 .map(Value::Number)
121 .map_err(|_| RuntimeError::TypeErrorDetailed {
122 expected: "parseable string".to_string(),
123 got: format!("\"{}\"", s),
124 })
125 }
126 Value::Boolean(b) => Ok(Value::Number(if *b { 1.0 } else { 0.0 })),
127 Value::Null => Ok(Value::Number(0.0)),
128 other => Err(RuntimeError::TypeErrorDetailed {
129 expected: "Number, String, Boolean or Null".to_string(),
130 got: format!("{:?}", other),
131 }),
132 }
133}
134
135/// 获取集合的长度
136///
137/// # 功能
138/// 返回字符串、数组或字典的元素个数。
139///
140/// # 参数
141/// - `collection`: 字符串、数组或字典
142///
143/// # 返回值
144/// 长度(数字)
145///
146/// # 示例
147/// ```aether
148/// Println(Len("hello")) # 5
149/// Println(Len([1, 2, 3])) # 3
150/// Println(Len({"a": 1, "b": 2})) # 2
151/// Println(Len("")) # 0
152/// Println(Len([])) # 0
153/// ```
154pub fn len(args: &[Value]) -> Result<Value, RuntimeError> {
155 if args.len() != 1 {
156 return Err(RuntimeError::WrongArity {
157 expected: 1,
158 got: args.len(),
159 });
160 }
161
162 match &args[0] {
163 Value::String(s) => Ok(Value::Number(s.len() as f64)),
164 Value::Array(arr) => Ok(Value::Number(arr.len() as f64)),
165 Value::Dict(dict) => Ok(Value::Number(dict.len() as f64)),
166 other => Err(RuntimeError::TypeErrorDetailed {
167 expected: "String, Array or Dict".to_string(),
168 got: format!("{:?}", other),
169 }),
170 }
171}
172
173/// 深拷贝一个值
174///
175/// # 功能
176/// 创建值的深拷贝副本。对于复杂类型(Array、Dict),会递归拷贝所有嵌套内容。
177///
178/// # 参数
179/// - `value`: 要拷贝的值(任意类型)
180///
181/// # 返回值
182/// 原值的深拷贝副本
183///
184/// # 示例
185/// ```aether
186/// Set ORIG [1, 2, [3, 4]]
187/// Set COPY CLONE(ORIG)
188/// # 修改拷贝不影响原值
189/// ```
190pub fn clone(args: &[Value]) -> Result<Value, RuntimeError> {
191 if args.len() != 1 {
192 return Err(RuntimeError::WrongArity {
193 expected: 1,
194 got: args.len(),
195 });
196 }
197
198 // Rust 的 Clone trait 会自动进行深拷贝
199 Ok(args[0].clone())
200}