1use crate::ast::*;
4use crate::error::{KainError, KainResult};
5use crate::lexer::Lexer;
6use crate::parser::Parser;
7use crate::types::TypedProgram;
8use flume::Sender;
9use pyo3::prelude::*;
10use pyo3::types::{PyDict, PyList};
11use std::collections::HashMap;
12use std::fmt;
13use std::sync::{Arc, RwLock};
14
15fn py_to_value(obj: &PyAny) -> PyResult<Value> {
16 if let Ok(s) = obj.extract::<String>() {
17 return Ok(Value::String(s));
18 }
19 if let Ok(b) = obj.extract::<bool>() {
20 return Ok(Value::Bool(b));
21 }
22 if let Ok(i) = obj.extract::<i64>() {
23 return Ok(Value::Int(i));
24 }
25 if let Ok(f) = obj.extract::<f64>() {
26 return Ok(Value::Float(f));
27 }
28 if let Ok(l) = obj.downcast::<PyList>() {
29 let mut vec = Vec::new();
30 for item in l {
31 vec.push(py_to_value(item)?);
32 }
33 return Ok(Value::Array(Arc::new(RwLock::new(vec))));
34 }
35 Ok(Value::String(format!("{}", obj)))
37}
38
39#[derive(Clone, Debug)]
41pub enum VNode {
42 Element {
43 tag: String,
44 attrs: HashMap<String, Value>,
45 children: Vec<VNode>,
46 },
47 Text(String),
48}
49
50#[derive(Clone)]
52pub enum Value {
53 Unit,
54 Bool(bool),
55 Int(i64),
56 Float(f64),
57 String(String),
58 Array(Arc<RwLock<Vec<Value>>>),
59 Tuple(Vec<Value>),
60 Struct(String, Arc<RwLock<HashMap<String, Value>>>),
61 Function(String),
62 NativeFn(String, fn(&mut Env, Vec<Value>) -> KainResult<Value>),
63 ActorRef(ActorRef),
64 None,
65 Return(Box<Value>),
67 Break(Option<Box<Value>>),
69 Continue,
71 Result(bool, Box<Value>),
73 Closure(Vec<String>, Box<Expr>, Vec<HashMap<String, Value>>),
75 StructConstructor(String, Vec<String>),
77 JSX(VNode),
79 EnumVariant(String, String, Vec<Value>),
81 Poll(bool, Option<Box<Value>>),
83 Future(String, Arc<RwLock<HashMap<String, Value>>>),
85}
86
87impl fmt::Debug for Value {
88 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
89 match self {
90 Value::Unit => write!(f, "Unit"),
91 Value::Bool(b) => write!(f, "Bool({})", b),
92 Value::Int(i) => write!(f, "Int({})", i),
93 Value::Float(fl) => write!(f, "Float({})", fl),
94 Value::String(s) => write!(f, "String({:?})", s),
95 Value::Array(arr) => write!(f, "Array({:?})", arr),
96 Value::Tuple(t) => write!(f, "Tuple({:?})", t),
97 Value::Struct(name, fields) => write!(f, "Struct({}, {:?})", name, fields),
98 Value::Function(name) => write!(f, "Function({})", name),
99 Value::NativeFn(name, _) => write!(f, "NativeFn({})", name),
100 Value::StructConstructor(name, _) => write!(f, "StructConstructor({})", name),
101 Value::ActorRef(r) => write!(f, "ActorRef({:?})", r),
102 Value::None => write!(f, "None"),
103 Value::Return(v) => write!(f, "Return({:?})", v),
104 Value::Result(ok, v) => {
105 if *ok {
106 write!(f, "Ok({:?})", v)
107 } else {
108 write!(f, "Err({:?})", v)
109 }
110 }
111 Value::Closure(params, _, _) => write!(f, "Closure({:?})", params),
112 Value::JSX(node) => write!(f, "JSX({:?})", node),
113 Value::EnumVariant(e, v, _) => write!(f, "{}::{}", e, v),
114 Value::Poll(ready, val) => {
115 if *ready {
116 write!(f, "Poll::Ready({:?})", val)
117 } else {
118 write!(f, "Poll::Pending")
119 }
120 }
121 Value::Future(name, _) => write!(f, "Future<{}>", name),
122 Value::Break(v) => write!(f, "Break({:?})", v),
123 Value::Continue => write!(f, "Continue"),
124 }
125 }
126}
127
128impl fmt::Display for VNode {
129 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
130 match self {
131 VNode::Element {
132 tag,
133 attrs,
134 children,
135 } => {
136 write!(f, "<{}", tag)?;
137 for (k, v) in attrs {
138 write!(f, " {}=\"{}\"", k, v)?;
139 }
140 if children.is_empty() {
141 write!(f, " />")
142 } else {
143 write!(f, ">")?;
144 for child in children {
145 write!(f, "{}", child)?;
146 }
147 write!(f, "</{}>", tag)
148 }
149 }
150 VNode::Text(s) => write!(f, "{}", s),
151 }
152 }
153}
154
155impl fmt::Display for Value {
156 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
157 match self {
158 Value::Unit => write!(f, "()"),
159 Value::Bool(b) => write!(f, "{}", b),
160 Value::Int(i) => write!(f, "{}", i),
161 Value::Float(fl) => write!(f, "{}", fl),
162 Value::String(s) => write!(f, "{}", s),
163 Value::Array(arr) => {
164 write!(f, "[")?;
165 let arr = arr.read().unwrap();
166 for (i, v) in arr.iter().enumerate() {
167 if i > 0 {
168 write!(f, ", ")?;
169 }
170 write!(f, "{}", v)?;
171 }
172 write!(f, "]")
173 }
174 Value::Tuple(t) => {
175 write!(f, "(")?;
176 for (i, v) in t.iter().enumerate() {
177 if i > 0 {
178 write!(f, ", ")?;
179 }
180 write!(f, "{}", v)?;
181 }
182 write!(f, ")")
183 }
184 Value::Struct(name, fields) => {
185 write!(f, "{} {{", name)?;
186 let fields = fields.read().unwrap();
187 for (i, (k, v)) in fields.iter().enumerate() {
188 if i > 0 {
189 write!(f, ", ")?;
190 }
191 write!(f, "{}: {}", k, v)?;
192 }
193 write!(f, "}}")
194 }
195 Value::Function(name) => write!(f, "<fn {}>", name),
196 Value::NativeFn(name, _) => write!(f, "<native fn {}>", name),
197 Value::StructConstructor(name, _) => write!(f, "<constructor {}>", name),
198 Value::ActorRef(r) => write!(f, "<actor {}>", r.id),
199 Value::None => write!(f, "none"),
200 Value::Return(v) => write!(f, "{}", v),
201 Value::Result(ok, v) => {
202 if *ok {
203 write!(f, "Ok({})", v)
204 } else {
205 write!(f, "Err({})", v)
206 }
207 }
208 Value::Closure(_, _, _) => write!(f, "<closure>"),
209 Value::JSX(node) => write!(f, "{}", node),
210 Value::EnumVariant(enum_name, variant, fields) => {
211 if fields.is_empty() {
212 write!(f, "{}::{}", enum_name, variant)
213 } else {
214 write!(f, "{}::{}(", enum_name, variant)?;
215 for (i, v) in fields.iter().enumerate() {
216 if i > 0 {
217 write!(f, ", ")?;
218 }
219 write!(f, "{}", v)?;
220 }
221 write!(f, ")")
222 }
223 }
224 Value::Poll(ready, val) => {
225 if *ready {
226 if let Some(v) = val {
227 write!(f, "Poll::Ready({})", v)
228 } else {
229 write!(f, "Poll::Ready(())")
230 }
231 } else {
232 write!(f, "Poll::Pending")
233 }
234 }
235 Value::Future(name, _) => write!(f, "<future {}>", name),
236 Value::Break(v) => {
237 if let Some(val) = v {
238 write!(f, "<break {}>", val)
239 } else {
240 write!(f, "<break>")
241 }
242 }
243 Value::Continue => write!(f, "<continue>"),
244 }
245 }
246}
247
248#[derive(Debug, Clone)]
250pub struct ActorRef {
251 pub id: u64,
252 pub sender: Sender<Message>,
253}
254
255#[derive(Debug, Clone)]
257pub struct Message {
258 pub name: String,
259 pub args: Vec<Value>,
260}
261
262#[derive(Clone)]
264pub struct Env {
265 scopes: Vec<HashMap<String, Value>>,
266 functions: HashMap<String, Function>,
267 components: HashMap<String, Component>,
268 methods: HashMap<String, HashMap<String, Function>>,
270 #[allow(dead_code)]
271 actors: HashMap<u64, Sender<Message>>,
272 #[allow(dead_code)]
273 next_actor_id: u64,
274 actor_defs: HashMap<String, Actor>,
275 self_actor_id: Option<u64>,
277 python_scope: Option<PyObject>,
279}
280
281impl Env {
282 pub fn new() -> Self {
283 let mut env = Self {
284 scopes: vec![HashMap::new()],
285 functions: HashMap::new(),
286 components: HashMap::new(),
287 methods: HashMap::new(),
288 actors: HashMap::new(),
289 next_actor_id: 1,
290 actor_defs: HashMap::new(),
291 self_actor_id: None,
292 python_scope: None,
293 };
294
295 Python::with_gil(|py| {
297 let scope = PyDict::new(py);
299 let builtins = py.import("builtins").unwrap();
301 scope.set_item("__builtins__", builtins).unwrap();
302 env.python_scope = Some(scope.into());
303 });
304
305 env.register_stdlib();
306 env.register_net_stdlib();
307 env.register_stdlib();
308 env.register_net_stdlib();
309 env.register_json_stdlib();
310 env.register_kos_bridge();
311 env
312 }
313
314 pub fn register_kos_bridge(&mut self) {
315 self.define_native("spawn_cube", |_env, args| {
316 if args.len() != 2 {
317 return Err(KainError::runtime(
318 "spawn_cube: expected 2 arguments (x, y)",
319 ));
320 }
321 let x = match args[0] {
322 Value::Int(n) => n as f64,
323 Value::Float(n) => n,
324 _ => return Err(KainError::runtime("spawn_cube: x must be number")),
325 };
326 let y = match args[1] {
327 Value::Int(n) => n as f64,
328 Value::Float(n) => n,
329 _ => return Err(KainError::runtime("spawn_cube: y must be number")),
330 };
331
332 println!(
333 " [KOS Bridge] Spawning Cube at {{ x: {:.2}, y: {:.2} }}",
334 x, y
335 );
336 Ok(Value::Unit)
337 });
338 }
339
340 pub fn register_net_stdlib(&mut self) {
341 self.define_native("http_get", |_env, args| {
343 if args.len() != 1 {
344 return Err(KainError::runtime("http_get: expected 1 argument (url)"));
345 }
346 let url = match &args[0] {
347 Value::String(s) => s.clone(),
348 _ => return Err(KainError::runtime("http_get: argument must be string url")),
349 };
350
351 let res = reqwest::blocking::get(&url);
352
353 match res {
354 Ok(resp) => match resp.text() {
355 Ok(text) => Ok(Value::String(text)),
356 Err(e) => Err(KainError::runtime(format!(
357 "http_get: failed to read body: {}",
358 e
359 ))),
360 },
361 Err(e) => Err(KainError::runtime(format!(
362 "http_get: request failed: {}",
363 e
364 ))),
365 }
366 });
367
368 self.define_native("http_post_json", |_env, args| {
369 if args.len() != 2 {
370 return Err(KainError::runtime(
371 "http_post: expected 2 arguments (url, json_string)",
372 ));
373 }
374 let url = match &args[0] {
375 Value::String(s) => s.clone(),
376 _ => return Err(KainError::runtime("http_post: url must be string")),
377 };
378 let body = match &args[1] {
379 Value::String(s) => s.clone(),
380 _ => return Err(KainError::runtime("http_post: body must be string")),
381 };
382
383 let client = reqwest::blocking::Client::new();
384
385 let res = client
386 .post(&url)
387 .header("Content-Type", "application/json")
388 .body(body)
389 .send();
390
391 match res {
392 Ok(resp) => match resp.text() {
393 Ok(text) => Ok(Value::String(text)),
394 Err(e) => Err(KainError::runtime(format!(
395 "http_post: failed to read response: {}",
396 e
397 ))),
398 },
399 Err(e) => Err(KainError::runtime(format!(
400 "http_post: request failed: {}",
401 e
402 ))),
403 }
404 });
405 }
406
407 pub fn register_json_stdlib(&mut self) {
408 self.define_native("json_parse", |_env, args| {
409 if args.len() != 1 {
410 return Err(KainError::runtime(
411 "json_parse: expected 1 argument (string)",
412 ));
413 }
414 let s = match &args[0] {
415 Value::String(s) => s,
416 _ => return Err(KainError::runtime("json_parse: argument must be string")),
417 };
418
419 fn from_json(v: &serde_json::Value) -> Value {
420 match v {
421 serde_json::Value::Null => Value::None,
422 serde_json::Value::Bool(b) => Value::Bool(*b),
423 serde_json::Value::Number(n) => {
424 if let Some(i) = n.as_i64() {
425 Value::Int(i)
426 } else if let Some(f) = n.as_f64() {
427 Value::Float(f)
428 } else {
429 Value::Int(0) }
431 }
432 serde_json::Value::String(s) => Value::String(s.clone()),
433 serde_json::Value::Array(arr) => {
434 let k_arr = arr.iter().map(from_json).collect();
435 Value::Array(Arc::new(RwLock::new(k_arr)))
436 }
437 serde_json::Value::Object(obj) => {
438 let mut map = HashMap::new();
439 for (k, v) in obj {
440 map.insert(k.clone(), from_json(v));
441 }
442 Value::Struct("Json".to_string(), Arc::new(RwLock::new(map)))
443 }
444 }
445 }
446
447 match serde_json::from_str::<serde_json::Value>(s) {
448 Ok(v) => Ok(from_json(&v)),
449 Err(e) => Err(KainError::runtime(format!(
450 "json_parse: invalid json: {}",
451 e
452 ))),
453 }
454 });
455
456 self.define_native("json_string", |_env, args| {
457 if args.len() != 1 {
458 return Err(KainError::runtime("json_string: expected 1 argument"));
459 }
460
461 fn to_json(v: &Value) -> serde_json::Value {
462 match v {
463 Value::Unit => serde_json::Value::Null,
464 Value::None => serde_json::Value::Null,
465 Value::Bool(b) => serde_json::Value::Bool(*b),
466 Value::Int(i) => serde_json::json!(i),
467 Value::Float(f) => serde_json::json!(f),
468 Value::String(s) => serde_json::Value::String(s.clone()),
469 Value::Array(arr) => {
470 let arr = arr.read().unwrap();
471 serde_json::Value::Array(arr.iter().map(to_json).collect())
472 }
473 Value::Struct(_, fields) => {
474 let fields = fields.read().unwrap();
475 let mut map = serde_json::Map::new();
476 for (k, v) in fields.iter() {
477 map.insert(k.clone(), to_json(v));
478 }
479 serde_json::Value::Object(map)
480 }
481 Value::Tuple(items) => {
482 serde_json::Value::Array(items.iter().map(to_json).collect())
483 }
484 _ => serde_json::Value::String(format!("{}", v)), }
486 }
487
488 Ok(Value::String(to_json(&args[0]).to_string()))
489 });
490 }
491
492 pub fn register_stdlib(&mut self) {
493 self.define("None".to_string(), Value::None);
495 self.define("none".to_string(), Value::None); self.define_native("Some", |_env, args| {
500 if args.len() != 1 {
501 return Err(KainError::runtime("Some: expected 1 argument"));
502 }
503 Ok(args[0].clone())
504 });
505
506 self.define_native("print", |_env, args| {
508 for arg in args {
509 print!("{} ", arg);
510 }
511 Ok(Value::Unit)
512 });
513
514 self.define_native("println", |_env, args| {
515 for arg in args {
516 print!("{} ", arg);
517 }
518 println!("");
519 Ok(Value::Unit)
520 });
521
522 self.define_native("min", |_env, args| {
524 if args.len() != 2 {
525 return Err(KainError::runtime("min: expected 2 arguments"));
526 }
527 match (&args[0], &args[1]) {
528 (Value::Int(a), Value::Int(b)) => Ok(Value::Int(*a.min(b))),
529 (Value::Float(a), Value::Float(b)) => Ok(Value::Float(a.min(*b))),
530 _ => Err(KainError::runtime("min: arguments must be numbers")),
531 }
532 });
533
534 self.define_native("max", |_env, args| {
535 if args.len() != 2 {
536 return Err(KainError::runtime("max: expected 2 arguments"));
537 }
538 match (&args[0], &args[1]) {
539 (Value::Int(a), Value::Int(b)) => Ok(Value::Int(*a.max(b))),
540 (Value::Float(a), Value::Float(b)) => Ok(Value::Float(a.max(*b))),
541 _ => Err(KainError::runtime("max: arguments must be numbers")),
542 }
543 });
544
545 self.define_native("abs", |_env, args| {
546 if args.len() != 1 {
547 return Err(KainError::runtime("abs: expected 1 argument"));
548 }
549 match &args[0] {
550 Value::Int(n) => Ok(Value::Int(n.abs())),
551 Value::Float(n) => Ok(Value::Float(n.abs())),
552 _ => Err(KainError::runtime("abs: argument must be number")),
553 }
554 });
555
556 self.define_native("sqrt", |_env, args| {
557 if args.len() != 1 {
558 return Err(KainError::runtime("sqrt: expected 1 argument"));
559 }
560 match &args[0] {
561 Value::Int(n) => Ok(Value::Float((*n as f64).sqrt())),
562 Value::Float(n) => Ok(Value::Float(n.sqrt())),
563 _ => Err(KainError::runtime("sqrt: argument must be number")),
564 }
565 });
566
567 self.define_native("random", |_env, _args| {
569 use std::time::SystemTime;
572 let seed = SystemTime::now()
573 .duration_since(std::time::UNIX_EPOCH)
574 .unwrap()
575 .as_nanos() as u64;
576 let x = (seed % 1000) as f64 / 1000.0;
577 Ok(Value::Float(x))
578 });
579
580 self.define_native("sleep", |_env, args| {
581 if args.len() != 1 {
582 return Err(KainError::runtime("sleep: expected 1 argument (ms)"));
583 }
584 match args[0] {
585 Value::Int(ms) => {
586 std::thread::sleep(std::time::Duration::from_millis(ms as u64));
587 Ok(Value::Unit)
588 }
589 _ => Err(KainError::runtime("sleep: argument must be int")),
590 }
591 });
592
593 self.define_native("len", |_env, args| {
595 if args.len() != 1 {
596 return Err(KainError::runtime("len: expected 1 argument"));
597 }
598 match &args[0] {
599 Value::String(s) => Ok(Value::Int(s.len() as i64)),
600 Value::Array(arr) => Ok(Value::Int(arr.read().unwrap().len() as i64)),
601 _ => Err(KainError::runtime("len: argument must be string or array")),
602 }
603 });
604
605 self.define_native("ord", |_env, args| {
607 if args.len() != 1 {
608 return Err(KainError::runtime("ord: expected 1 argument"));
609 }
610 match &args[0] {
611 Value::String(s) => {
612 if let Some(c) = s.chars().next() {
613 Ok(Value::Int(c as i64))
614 } else {
615 Err(KainError::runtime("ord: empty string"))
616 }
617 }
618 _ => Err(KainError::runtime("ord: argument must be string")),
619 }
620 });
621
622 self.define_native("chr", |_env, args| {
624 if args.len() != 1 {
625 return Err(KainError::runtime("chr: expected 1 argument"));
626 }
627 match &args[0] {
628 Value::Int(n) => {
629 if let Some(c) = char::from_u32(*n as u32) {
630 Ok(Value::String(c.to_string()))
631 } else {
632 Err(KainError::runtime("chr: invalid code point"))
633 }
634 }
635 _ => Err(KainError::runtime("chr: argument must be int")),
636 }
637 });
638
639 self.define_native("first", |_env, args| {
640 if args.len() != 1 {
641 return Err(KainError::runtime("first: expected 1 argument"));
642 }
643 match &args[0] {
644 Value::Array(arr) => {
645 let arr = arr.read().unwrap();
646 if arr.is_empty() {
647 return Err(KainError::runtime("first: empty array"));
648 }
649 Ok(arr[0].clone())
650 }
651 _ => Err(KainError::runtime("first: argument must be array")),
652 }
653 });
654
655 self.define_native("last", |_env, args| {
656 if args.len() != 1 {
657 return Err(KainError::runtime("last: expected 1 argument"));
658 }
659 match &args[0] {
660 Value::Array(arr) => {
661 let arr = arr.read().unwrap();
662 if arr.is_empty() {
663 return Err(KainError::runtime("last: empty array"));
664 }
665 Ok(arr[arr.len() - 1].clone())
666 }
667 _ => Err(KainError::runtime("last: argument must be array")),
668 }
669 });
670
671 self.define_native("push", |_env, args| {
672 if args.len() != 2 {
673 return Err(KainError::runtime("push: expected 2 arguments"));
674 }
675 match &args[0] {
676 Value::Array(arr) => {
677 arr.write().unwrap().push(args[1].clone());
678 Ok(Value::Unit)
679 }
680 _ => Err(KainError::runtime("push: first argument must be array")),
681 }
682 });
683
684 self.define_native("range", |_env, args| {
686 if args.len() != 2 {
687 return Err(KainError::runtime("range: expected 2 arguments"));
688 }
689 let start = match args[0] {
690 Value::Int(n) => n,
691 _ => return Err(KainError::runtime("range: expected int")),
692 };
693 let end = match args[1] {
694 Value::Int(n) => n,
695 _ => return Err(KainError::runtime("range: expected int")),
696 };
697
698 let arr = (start..end).map(Value::Int).collect();
699 Ok(Value::Array(Arc::new(RwLock::new(arr))))
700 });
701
702 self.define_native("first", |_env, args| {
704 if args.len() != 1 {
705 return Err(KainError::runtime("first: expected 1 argument"));
706 }
707 match &args[0] {
708 Value::Array(arr) => arr
709 .read()
710 .unwrap()
711 .first()
712 .cloned()
713 .ok_or_else(|| KainError::runtime("Array is empty")),
714 Value::String(s) => s
715 .chars()
716 .next()
717 .map(|c| Value::String(c.to_string()))
718 .ok_or_else(|| KainError::runtime("String is empty")),
719 _ => Err(KainError::runtime("first: expected array or string")),
720 }
721 });
722
723 self.define_native("last", |_env, args| {
724 if args.len() != 1 {
725 return Err(KainError::runtime("last: expected 1 argument"));
726 }
727 match &args[0] {
728 Value::Array(arr) => arr
729 .read()
730 .unwrap()
731 .last()
732 .cloned()
733 .ok_or_else(|| KainError::runtime("Array is empty")),
734 Value::String(s) => s
735 .chars()
736 .last()
737 .map(|c| Value::String(c.to_string()))
738 .ok_or_else(|| KainError::runtime("String is empty")),
739 _ => Err(KainError::runtime("last: expected array or string")),
740 }
741 });
742
743 self.define_native("reverse", |_env, args| {
744 if args.len() != 1 {
745 return Err(KainError::runtime("reverse: expected 1 argument"));
746 }
747 match &args[0] {
748 Value::Array(arr) => {
749 let mut reversed = arr.read().unwrap().clone();
750 reversed.reverse();
751 Ok(Value::Array(Arc::new(RwLock::new(reversed))))
752 }
753 Value::String(s) => Ok(Value::String(s.chars().rev().collect())),
754 _ => Err(KainError::runtime("reverse: expected array or string")),
755 }
756 });
757
758 self.define_native("sum", |_env, args| {
759 if args.len() != 1 {
760 return Err(KainError::runtime("sum: expected 1 argument"));
761 }
762 match &args[0] {
763 Value::Array(arr) => {
764 let mut total = 0i64;
765 for v in arr.read().unwrap().iter() {
766 match v {
767 Value::Int(n) => total += n,
768 _ => {
769 return Err(KainError::runtime("sum: array must contain integers"))
770 }
771 }
772 }
773 Ok(Value::Int(total))
774 }
775 _ => Err(KainError::runtime("sum: expected array")),
776 }
777 });
778
779 self.define_native("type_of", |_env, args| {
781 if args.len() != 1 {
782 return Err(KainError::runtime("type_of: expected 1 argument"));
783 }
784 let type_name = match &args[0] {
785 Value::Unit => "unit",
786 Value::Bool(_) => "bool",
787 Value::Int(_) => "int",
788 Value::Float(_) => "float",
789 Value::String(_) => "string",
790 Value::Array(_) => "array",
791 Value::Tuple(_) => "tuple",
792 Value::Struct(name, _) => name.as_str(),
793 Value::Function(_) => "function",
794 Value::NativeFn(_, _) => "native_function",
795 Value::ActorRef(_) => "actor",
796 Value::None => "none",
797 Value::Return(_) => "return_value",
798 Value::Closure(_, _, _) => "function",
799 Value::Result(_, _) => "result",
800 Value::StructConstructor(_, _) => "struct_constructor",
801 Value::JSX(_) => "jsx",
802 Value::EnumVariant(enum_name, _, _) => return Ok(Value::String(enum_name.clone())),
803 Value::Poll(_, _) => "poll",
804 Value::Future(name, _) => return Ok(Value::String(format!("Future<{}>", name))),
805 Value::Break(_) => "break",
806 Value::Continue => "continue",
807 };
808 Ok(Value::String(type_name.to_string()))
809 });
810
811 self.define_native("variant_of", |_env, args| {
813 if args.len() != 1 {
814 return Err(KainError::runtime("variant_of: expected 1 argument"));
815 }
816 match &args[0] {
817 Value::EnumVariant(_, variant, _) => Ok(Value::String(variant.clone())),
818 _ => Ok(Value::String("".to_string())), }
820 });
821
822 self.define_native("variant_field", |_env, args| {
825 if args.len() != 2 {
826 return Err(KainError::runtime(
827 "variant_field: expected 2 arguments (enum, index)",
828 ));
829 }
830 let idx = match &args[1] {
831 Value::Int(n) => *n as usize,
832 _ => return Err(KainError::runtime("variant_field: index must be int")),
833 };
834 match &args[0] {
835 Value::EnumVariant(_, _, fields) => {
836 if idx < fields.len() {
837 let field = fields[idx].clone();
838 if let Value::Struct(name, inner) = &field {
840 if name == "Box" {
841 let inner = inner.read().unwrap();
842 if let Some(boxed) = inner.get("0") {
843 return Ok(boxed.clone());
844 }
845 }
846 }
847 if let Value::EnumVariant(enum_name, variant_name, inner_fields) = &field {
849 if enum_name == "Box"
850 && variant_name == "new"
851 && inner_fields.len() == 1
852 {
853 return Ok(inner_fields[0].clone());
854 }
855 }
856 Ok(field)
857 } else {
858 Err(KainError::runtime(format!(
859 "variant_field: index {} out of bounds (has {} fields)",
860 idx,
861 fields.len()
862 )))
863 }
864 }
865 _ => Err(KainError::runtime(
866 "variant_field: first argument must be enum variant",
867 )),
868 }
869 });
870
871 self.define_native("str", |_env, args| {
872 if args.len() != 1 {
873 return Err(KainError::runtime("str: expected 1 argument"));
874 }
875 Ok(Value::String(format!("{}", args[0])))
876 });
877
878 self.define_native("int", |_env, args| {
879 if args.len() != 1 {
880 return Err(KainError::runtime("int: expected 1 argument"));
881 }
882 match &args[0] {
883 Value::Int(n) => Ok(Value::Int(*n)),
884 Value::Float(n) => Ok(Value::Int(*n as i64)),
885 Value::String(s) => s
886 .parse::<i64>()
887 .map(Value::Int)
888 .map_err(|_| KainError::runtime("Invalid int string")),
889 _ => Err(KainError::runtime("int: argument must be number or string")),
890 }
891 });
892
893 self.define_native("float", |_env, args| {
894 if args.len() != 1 {
895 return Err(KainError::runtime("float: expected 1 argument"));
896 }
897 match &args[0] {
898 Value::Int(n) => Ok(Value::Float(*n as f64)),
899 Value::Float(n) => Ok(Value::Float(*n)),
900 Value::String(s) => s
901 .parse::<f64>()
902 .map(Value::Float)
903 .map_err(|_| KainError::runtime("Invalid float string")),
904 _ => Err(KainError::runtime(
905 "float: argument must be number or string",
906 )),
907 }
908 });
909
910 self.define_native("ok", |_env, args| {
912 if args.len() != 1 {
913 return Err(KainError::runtime("ok: expected 1 argument"));
914 }
915 Ok(Value::Result(true, Box::new(args[0].clone())))
916 });
917
918 self.define_native("err", |_env, args| {
919 if args.len() != 1 {
920 return Err(KainError::runtime("err: expected 1 argument"));
921 }
922 Ok(Value::Result(false, Box::new(args[0].clone())))
923 });
924
925 self.define_native("sleep", |_env, args| {
926 if args.len() != 1 {
927 return Err(KainError::runtime("sleep: expected 1 argument"));
928 }
929 match &args[0] {
930 Value::Int(n) => {
931 std::thread::sleep(std::time::Duration::from_secs(*n as u64));
932 Ok(Value::Unit)
933 }
934 Value::Float(n) => {
935 std::thread::sleep(std::time::Duration::from_secs_f64(*n));
936 Ok(Value::Unit)
937 }
938 _ => Err(KainError::runtime("sleep: expected number")),
939 }
940 });
941
942 self.define_native("now", |_env, _args| {
943 let start = std::time::SystemTime::now();
944 let since_the_epoch = start
945 .duration_since(std::time::UNIX_EPOCH)
946 .map_err(|e| KainError::runtime(&format!("Time error: {}", e)))?;
947 Ok(Value::Float(since_the_epoch.as_secs_f64()))
948 });
949
950 self.define_native("map", |env, args| {
954 if args.len() != 2 {
955 return Err(KainError::runtime(
956 "map: expected 2 arguments (array, function)",
957 ));
958 }
959 let arr = match &args[0] {
960 Value::Array(a) => a.read().unwrap().clone(),
961 _ => return Err(KainError::runtime("map: first argument must be an array")),
962 };
963 let func = args[1].clone();
964 let mut results = Vec::new();
965 for item in arr {
966 let result = call_function(env, func.clone(), vec![item])?;
967 results.push(result);
968 }
969 Ok(Value::Array(Arc::new(RwLock::new(results))))
970 });
971
972 self.define_native("filter", |env, args| {
973 if args.len() != 2 {
974 return Err(KainError::runtime(
975 "filter: expected 2 arguments (array, function)",
976 ));
977 }
978 let arr = match &args[0] {
979 Value::Array(a) => a.read().unwrap().clone(),
980 _ => {
981 return Err(KainError::runtime(
982 "filter: first argument must be an array",
983 ))
984 }
985 };
986 let func = args[1].clone();
987 let mut results = Vec::new();
988 for item in arr {
989 let result = call_function(env, func.clone(), vec![item.clone()])?;
990 match result {
991 Value::Bool(true) => results.push(item),
992 Value::Bool(false) => {}
993 _ => return Err(KainError::runtime("filter: function must return bool")),
994 }
995 }
996 Ok(Value::Array(Arc::new(RwLock::new(results))))
997 });
998
999 self.define_native("reduce", |env, args| {
1000 if args.len() != 3 {
1001 return Err(KainError::runtime(
1002 "reduce: expected 3 arguments (array, initial, function)",
1003 ));
1004 }
1005 let arr = match &args[0] {
1006 Value::Array(a) => a.read().unwrap().clone(),
1007 _ => {
1008 return Err(KainError::runtime(
1009 "reduce: first argument must be an array",
1010 ))
1011 }
1012 };
1013 let mut acc = args[1].clone();
1014 let func = args[2].clone();
1015 for item in arr {
1016 acc = call_function(env, func.clone(), vec![acc, item])?;
1017 }
1018 Ok(acc)
1019 });
1020
1021 self.define_native("foreach", |env, args| {
1022 if args.len() != 2 {
1023 return Err(KainError::runtime(
1024 "foreach: expected 2 arguments (array, function)",
1025 ));
1026 }
1027 let arr = match &args[0] {
1028 Value::Array(a) => a.read().unwrap().clone(),
1029 _ => {
1030 return Err(KainError::runtime(
1031 "foreach: first argument must be an array",
1032 ))
1033 }
1034 };
1035 let func = args[1].clone();
1036 for item in arr {
1037 call_function(env, func.clone(), vec![item])?;
1038 }
1039 Ok(Value::Unit)
1040 });
1041
1042 self.define_native("read_file", |_env, args| {
1044 if args.len() != 1 {
1045 return Err(KainError::runtime("read_file: expected 1 argument"));
1046 }
1047 let path = match &args[0] {
1048 Value::String(s) => s,
1049 _ => return Err(KainError::runtime("read_file: argument must be string")),
1050 };
1051
1052 match std::fs::read_to_string(path) {
1053 Ok(s) => Ok(Value::String(s)),
1054 Err(e) => Ok(Value::Result(
1055 false,
1056 Box::new(Value::String(format!("Failed to read file: {}", e))),
1057 )),
1058 }
1059 });
1060
1061 self.define_native("write_file", |_env, args| {
1062 if args.len() != 2 {
1063 return Err(KainError::runtime("write_file: expected 2 arguments"));
1064 }
1065 let path = match &args[0] {
1066 Value::String(s) => s,
1067 _ => {
1068 return Err(KainError::runtime(
1069 "write_file: first argument must be string",
1070 ))
1071 }
1072 };
1073 let content = match &args[1] {
1074 Value::String(s) => s,
1075 _ => {
1076 return Err(KainError::runtime(
1077 "write_file: second argument must be string",
1078 ))
1079 }
1080 };
1081
1082 match std::fs::write(path, content) {
1083 Ok(_) => Ok(Value::Unit),
1084 Err(e) => Ok(Value::Result(
1085 false,
1086 Box::new(Value::String(format!("Failed to read file: {}", e))),
1087 )),
1088 }
1089 });
1090
1091 self.define_native("split", |_env, args| {
1093 if args.len() != 2 {
1094 return Err(KainError::runtime(
1095 "split: expected 2 arguments (string, delimiter)",
1096 ));
1097 }
1098 let s = match &args[0] {
1099 Value::String(s) => s.clone(),
1100 _ => return Err(KainError::runtime("split: first argument must be a string")),
1101 };
1102 let delim = match &args[1] {
1103 Value::String(s) => s.clone(),
1104 _ => {
1105 return Err(KainError::runtime(
1106 "split: second argument must be a string",
1107 ))
1108 }
1109 };
1110 let parts: Vec<Value> = if delim.is_empty() {
1112 s.chars().map(|c| Value::String(c.to_string())).collect()
1113 } else {
1114 s.split(&delim)
1115 .map(|p| Value::String(p.to_string()))
1116 .collect()
1117 };
1118 Ok(Value::Array(Arc::new(RwLock::new(parts))))
1119 });
1120
1121 self.define_native("join", |_env, args| {
1122 if args.len() != 2 {
1123 return Err(KainError::runtime(
1124 "join: expected 2 arguments (array, delimiter)",
1125 ));
1126 }
1127 let arr = match &args[0] {
1128 Value::Array(a) => a.read().unwrap().clone(),
1129 _ => return Err(KainError::runtime("join: first argument must be an array")),
1130 };
1131 let delim = match &args[1] {
1132 Value::String(s) => s.clone(),
1133 _ => return Err(KainError::runtime("join: second argument must be a string")),
1134 };
1135 let parts: Vec<String> = arr.iter().map(|v| format!("{}", v)).collect();
1136 Ok(Value::String(parts.join(&delim)))
1137 });
1138
1139 self.define_native("trim", |_env, args| {
1140 if args.len() != 1 {
1141 return Err(KainError::runtime("trim: expected 1 argument (string)"));
1142 }
1143 match &args[0] {
1144 Value::String(s) => Ok(Value::String(s.trim().to_string())),
1145 _ => Err(KainError::runtime("trim: argument must be a string")),
1146 }
1147 });
1148
1149 self.define_native("upper", |_env, args| {
1150 if args.len() != 1 {
1151 return Err(KainError::runtime("upper: expected 1 argument (string)"));
1152 }
1153 match &args[0] {
1154 Value::String(s) => Ok(Value::String(s.to_uppercase())),
1155 _ => Err(KainError::runtime("upper: argument must be a string")),
1156 }
1157 });
1158
1159 self.define_native("lower", |_env, args| {
1160 if args.len() != 1 {
1161 return Err(KainError::runtime("lower: expected 1 argument (string)"));
1162 }
1163 match &args[0] {
1164 Value::String(s) => Ok(Value::String(s.to_lowercase())),
1165 _ => Err(KainError::runtime("lower: argument must be a string")),
1166 }
1167 });
1168
1169 self.define_native("contains", |_env, args| {
1170 if args.len() != 2 {
1171 return Err(KainError::runtime(
1172 "contains: expected 2 arguments (string, pattern)",
1173 ));
1174 }
1175 let s = match &args[0] {
1176 Value::String(s) => s.clone(),
1177 Value::Array(arr) => {
1178 let needle = &args[1];
1180 return Ok(Value::Bool(arr.read().unwrap().iter().any(|v| {
1181 match (v, needle) {
1182 (Value::Int(n1), Value::Int(n2)) => n1 == n2,
1183 (Value::String(s1), Value::String(s2)) => s1 == s2,
1184 (Value::Bool(b1), Value::Bool(b2)) => b1 == b2,
1185 _ => false,
1186 }
1187 })));
1188 }
1189 _ => {
1190 return Err(KainError::runtime(
1191 "contains: first argument must be a string or array",
1192 ))
1193 }
1194 };
1195 let sub = match &args[1] {
1196 Value::String(s) => s.clone(),
1197 _ => {
1198 return Err(KainError::runtime(
1199 "contains: second argument must be a string",
1200 ))
1201 }
1202 };
1203 Ok(Value::Bool(s.contains(&sub)))
1204 });
1205
1206 self.define_native("starts_with", |_env, args| {
1207 if args.len() != 2 {
1208 return Err(KainError::runtime("starts_with: expected 2 arguments"));
1209 }
1210 let s = match &args[0] {
1211 Value::String(s) => s,
1212 _ => return Err(KainError::runtime("expected string")),
1213 };
1214 let sub = match &args[1] {
1215 Value::String(s) => s,
1216 _ => return Err(KainError::runtime("expected string")),
1217 };
1218 Ok(Value::Bool(s.starts_with(sub)))
1219 });
1220
1221 self.define_native("ends_with", |_env, args| {
1222 if args.len() != 2 {
1223 return Err(KainError::runtime("ends_with: expected 2 arguments"));
1224 }
1225 let s = match &args[0] {
1226 Value::String(s) => s,
1227 _ => return Err(KainError::runtime("expected string")),
1228 };
1229 let sub = match &args[1] {
1230 Value::String(s) => s,
1231 _ => return Err(KainError::runtime("expected string")),
1232 };
1233 Ok(Value::Bool(s.ends_with(sub)))
1234 });
1235
1236 self.define_native("replace", |_env, args| {
1237 if args.len() != 3 {
1238 return Err(KainError::runtime(
1239 "replace: expected 3 arguments (string, from, to)",
1240 ));
1241 }
1242 let s = match &args[0] {
1243 Value::String(s) => s,
1244 _ => return Err(KainError::runtime("expected string")),
1245 };
1246 let from = match &args[1] {
1247 Value::String(s) => s,
1248 _ => return Err(KainError::runtime("expected string")),
1249 };
1250 let to = match &args[2] {
1251 Value::String(s) => s,
1252 _ => return Err(KainError::runtime("expected string")),
1253 };
1254 Ok(Value::String(s.replace(from, to)))
1255 });
1256
1257 self.define_native("char_at", |_env, args| {
1258 if args.len() != 2 {
1259 return Err(KainError::runtime("char_at: expected 2 arguments"));
1260 }
1261 let s = match &args[0] {
1262 Value::String(s) => s,
1263 _ => return Err(KainError::runtime("expected string")),
1264 };
1265 let idx = match &args[1] {
1266 Value::Int(n) => *n as usize,
1267 _ => return Err(KainError::runtime("expected int")),
1268 };
1269 match s.chars().nth(idx) {
1270 Some(c) => Ok(Value::String(c.to_string())),
1271 None => Ok(Value::None),
1272 }
1273 });
1274
1275 self.define_native("substring", |_env, args| {
1276 if args.len() < 2 || args.len() > 3 {
1277 return Err(KainError::runtime(
1278 "substring: expected 2-3 arguments (string, start, [end])",
1279 ));
1280 }
1281 let s = match &args[0] {
1282 Value::String(s) => s.clone(),
1283 _ => {
1284 return Err(KainError::runtime(
1285 "substring: first argument must be a string",
1286 ))
1287 }
1288 };
1289 let start = match &args[1] {
1290 Value::Int(n) => *n as usize,
1291 _ => {
1292 return Err(KainError::runtime(
1293 "substring: second argument must be an integer",
1294 ))
1295 }
1296 };
1297 let end = if args.len() == 3 {
1298 match &args[2] {
1299 Value::Int(n) => *n as usize,
1300 _ => {
1301 return Err(KainError::runtime(
1302 "substring: third argument must be an integer",
1303 ))
1304 }
1305 }
1306 } else {
1307 s.len()
1308 };
1309 let chars: String = s.chars().skip(start).take(end - start).collect();
1310 Ok(Value::String(chars))
1311 });
1312
1313 self.define_native("send", |_env, args| {
1316 if args.len() < 2 {
1317 return Err(KainError::runtime(
1318 "send: expected at least 2 arguments (actor, msg_name)",
1319 ));
1320 }
1321 let actor_ref = match &args[0] {
1322 Value::ActorRef(r) => r,
1323 _ => return Err(KainError::runtime("send: first argument must be actor ref")),
1324 };
1325 let msg_name = match &args[1] {
1326 Value::String(s) => s.clone(),
1327 _ => {
1328 return Err(KainError::runtime(
1329 "send: second argument must be message name",
1330 ))
1331 }
1332 };
1333
1334 let msg_args = args[2..].to_vec();
1335
1336 let _ = actor_ref.sender.send(Message {
1337 name: msg_name,
1338 args: msg_args,
1339 });
1340
1341 Ok(Value::Unit)
1342 });
1343
1344 self.define_native("sleep", |_env, args| {
1345 if args.len() != 1 {
1346 return Err(KainError::runtime("sleep: expected 1 argument (ms)"));
1347 }
1348 let ms = match args[0] {
1349 Value::Int(i) => i as u64,
1350 _ => return Err(KainError::runtime("sleep: expected int")),
1351 };
1352 std::thread::sleep(std::time::Duration::from_millis(ms));
1353 Ok(Value::Unit)
1354 });
1355
1356 self.define_native("time", |_env, _args| {
1358 use std::time::{SystemTime, UNIX_EPOCH};
1359 let now = SystemTime::now()
1360 .duration_since(UNIX_EPOCH)
1361 .unwrap_or_default();
1362 Ok(Value::Float(now.as_secs_f64()))
1363 });
1364
1365 self.define_native("exit", |_env, args| {
1366 let code = if args.len() > 0 {
1367 match args[0] {
1368 Value::Int(n) => n as i32,
1369 _ => 0,
1370 }
1371 } else {
1372 0
1373 };
1374 std::process::exit(code);
1375 });
1376
1377 self.define_native("env", |_env, args| {
1378 if args.len() != 1 {
1379 return Err(KainError::runtime("env: expected 1 argument"));
1380 }
1381 match &args[0] {
1382 Value::String(key) => match std::env::var(key) {
1383 Ok(v) => Ok(Value::String(v)),
1384 Err(_) => Ok(Value::None),
1385 },
1386 _ => Err(KainError::runtime("env: expected string key")),
1387 }
1388 });
1389
1390 self.define_native("assert", |_env, args| {
1391 if args.len() < 1 {
1392 return Err(KainError::runtime("assert: expected condition"));
1393 }
1394 match &args[0] {
1395 Value::Bool(true) => Ok(Value::Unit),
1396 _ => {
1397 let msg = if args.len() > 1 {
1398 format!("{}", args[1])
1399 } else {
1400 "Assertion failed".to_string()
1401 };
1402 Err(KainError::runtime(msg))
1403 }
1404 }
1405 });
1406
1407 self.define_native("panic", |_env, args| {
1408 let msg = if args.len() > 0 {
1409 format!("{}", args[0])
1410 } else {
1411 "Panic".to_string()
1412 };
1413 Err(KainError::runtime(msg))
1414 });
1415
1416 self.define_native("dbg", |_env, args| {
1418 for arg in args {
1419 println!("[DEBUG] {:?}", arg);
1420 }
1421 Ok(Value::Unit)
1422 });
1423
1424 self.define_native("int", |_env, args| {
1426 if args.len() != 1 {
1427 return Err(KainError::runtime("int: expected 1 argument"));
1428 }
1429 match &args[0] {
1430 Value::Int(n) => Ok(Value::Int(*n)),
1431 Value::Float(n) => Ok(Value::Int(*n as i64)),
1432 Value::String(s) => s
1433 .parse::<i64>()
1434 .map(Value::Int)
1435 .map_err(|_| KainError::runtime(format!("Cannot parse '{}' as int", s))),
1436 Value::Bool(b) => Ok(Value::Int(if *b { 1 } else { 0 })),
1437 _ => Err(KainError::runtime("int: cannot convert this type")),
1438 }
1439 });
1440
1441 self.define_native("float", |_env, args| {
1442 if args.len() != 1 {
1443 return Err(KainError::runtime("float: expected 1 argument"));
1444 }
1445 match &args[0] {
1446 Value::Int(n) => Ok(Value::Float(*n as f64)),
1447 Value::Float(n) => Ok(Value::Float(*n)),
1448 Value::String(s) => s
1449 .parse::<f64>()
1450 .map(Value::Float)
1451 .map_err(|_| KainError::runtime(format!("Cannot parse '{}' as float", s))),
1452 _ => Err(KainError::runtime("float: cannot convert this type")),
1453 }
1454 });
1455
1456 self.define_native("str", |_env, args| {
1457 if args.len() != 1 {
1458 return Err(KainError::runtime("str: expected 1 argument"));
1459 }
1460 Ok(Value::String(format!("{}", &args[0])))
1461 });
1462
1463 self.define_native("to_string", |_env, args| {
1465 if args.len() != 1 {
1466 return Err(KainError::runtime("to_string: expected 1 argument"));
1467 }
1468 Ok(Value::String(format!("{}", &args[0])))
1469 });
1470
1471 self.define_native("bool", |_env, args| {
1472 if args.len() != 1 {
1473 return Err(KainError::runtime("bool: expected 1 argument"));
1474 }
1475 let result = match &args[0] {
1476 Value::Bool(b) => *b,
1477 Value::Int(n) => *n != 0,
1478 Value::Float(n) => *n != 0.0,
1479 Value::String(s) => !s.is_empty(),
1480 Value::None => false,
1481 Value::Unit => false,
1482 _ => true,
1483 };
1484 Ok(Value::Bool(result))
1485 });
1486
1487 self.define_native("to_int", |_env, args| {
1489 if args.len() != 1 {
1490 return Err(KainError::runtime("to_int: expected 1 argument"));
1491 }
1492 match &args[0] {
1493 Value::Int(n) => Ok(Value::Int(*n)),
1494 Value::Float(n) => Ok(Value::Int(*n as i64)),
1495 Value::String(s) => s
1496 .parse::<i64>()
1497 .map(Value::Int)
1498 .map_err(|_| KainError::runtime(format!("Cannot parse '{}' as int", s))),
1499 Value::Bool(b) => Ok(Value::Int(if *b { 1 } else { 0 })),
1500 _ => Err(KainError::runtime("to_int: cannot convert this type")),
1501 }
1502 });
1503
1504 self.define_native("sqrt", |_env, args| {
1506 if args.len() != 1 {
1507 return Err(KainError::runtime("sqrt: expected 1 argument"));
1508 }
1509 match args[0] {
1510 Value::Int(n) => Ok(Value::Float((n as f64).sqrt())),
1511 Value::Float(n) => Ok(Value::Float(n.sqrt())),
1512 _ => Err(KainError::runtime("sqrt: expected number")),
1513 }
1514 });
1515
1516 self.define_native("sin", |_env, args| {
1517 if args.len() != 1 {
1518 return Err(KainError::runtime("sin: expected 1 argument"));
1519 }
1520 match args[0] {
1521 Value::Int(n) => Ok(Value::Float((n as f64).sin())),
1522 Value::Float(n) => Ok(Value::Float(n.sin())),
1523 _ => Err(KainError::runtime("sin: expected number")),
1524 }
1525 });
1526
1527 self.define_native("cos", |_env, args| {
1528 if args.len() != 1 {
1529 return Err(KainError::runtime("cos: expected 1 argument"));
1530 }
1531 match args[0] {
1532 Value::Int(n) => Ok(Value::Float((n as f64).cos())),
1533 Value::Float(n) => Ok(Value::Float(n.cos())),
1534 _ => Err(KainError::runtime("cos: expected number")),
1535 }
1536 });
1537
1538 self.define_native("tan", |_env, args| {
1539 if args.len() != 1 {
1540 return Err(KainError::runtime("tan: expected 1 argument"));
1541 }
1542 match args[0] {
1543 Value::Int(n) => Ok(Value::Float((n as f64).tan())),
1544 Value::Float(n) => Ok(Value::Float(n.tan())),
1545 _ => Err(KainError::runtime("tan: expected number")),
1546 }
1547 });
1548
1549 self.define_native("read_line", |_env, _args| {
1551 use std::io::{self, BufRead};
1552 let stdin = io::stdin();
1553 let mut line = String::new();
1554 stdin.lock().read_line(&mut line).ok();
1555 Ok(Value::String(line.trim_end().to_string()))
1556 });
1557
1558 self.define_native("py_eval", |env, args| {
1560 if args.len() != 1 {
1561 return Err(KainError::runtime("py_eval: expected 1 argument (code)"));
1562 }
1563 let code = match &args[0] {
1564 Value::String(s) => s,
1565 _ => return Err(KainError::runtime("py_eval: expected string")),
1566 };
1567
1568 let scope = env.python_scope.as_ref().unwrap();
1569
1570 Python::with_gil(|py| {
1571 let scope_dict = scope.as_ref(py).downcast::<PyDict>().unwrap();
1572 let result = py
1574 .eval(code, Some(scope_dict), Some(scope_dict))
1575 .map_err(|e| KainError::runtime(format!("Python Error: {}", e)))?;
1576 py_to_value(result)
1577 .map_err(|e| KainError::runtime(format!("Conversion Error: {}", e)))
1578 })
1579 });
1580
1581 self.define_native("py_exec", |env, args| {
1582 if args.len() != 1 {
1583 return Err(KainError::runtime("py_exec: expected 1 argument"));
1584 }
1585 let code = match &args[0] {
1586 Value::String(s) => s,
1587 _ => return Err(KainError::runtime("py_exec: expected string")),
1588 };
1589
1590 let scope = env.python_scope.as_ref().unwrap();
1591
1592 Python::with_gil(|py| {
1593 let scope_dict = scope.as_ref(py).downcast::<PyDict>().unwrap();
1594 py.run(code, Some(scope_dict), Some(scope_dict))
1596 .map_err(|e| KainError::runtime(format!("Python Error: {}", e)))?;
1597 Ok(Value::Unit)
1598 })
1599 });
1600
1601 self.define_native("py_import", |env, args| {
1602 if args.len() != 1 {
1603 return Err(KainError::runtime("py_import: expected 1 argument"));
1604 }
1605 let module_name = match &args[0] {
1606 Value::String(s) => s,
1607 _ => return Err(KainError::runtime("py_import: argument must be string")),
1608 };
1609
1610 let scope = env.python_scope.as_ref().unwrap();
1611
1612 Python::with_gil(|py| {
1613 let locals = scope.as_ref(py).downcast::<PyDict>().unwrap();
1614 let module = py
1615 .import(module_name.as_str())
1616 .map_err(|e| KainError::runtime(format!("Python error: {}", e)))?;
1617
1618 locals
1620 .set_item(module_name, module)
1621 .map_err(|e| KainError::runtime(format!("Failed to set module: {}", e)))?;
1622
1623 py_to_value(module)
1624 .map_err(|e| KainError::runtime(format!("Conversion Error: {}", e)))
1625 })
1626 });
1627
1628 self.define_native("file_exists", |_env, args| {
1629 if args.len() != 1 {
1630 return Err(KainError::runtime("file_exists: expected 1 argument"));
1631 }
1632 match &args[0] {
1633 Value::String(path) => Ok(Value::Bool(std::path::Path::new(path).exists())),
1634 _ => Err(KainError::runtime("file_exists: path must be string")),
1635 }
1636 });
1637
1638 self.define_native("block_on", |env, args| {
1642 if args.len() != 1 {
1643 return Err(KainError::runtime("block_on: expected 1 argument (future)"));
1644 }
1645
1646 let future_val = args[0].clone();
1647 poll_future_to_completion(env, future_val)
1648 });
1649
1650 self.define_native("spawn_task", |env, args| {
1652 if args.len() != 1 {
1653 return Err(KainError::runtime(
1654 "spawn_task: expected 1 argument (future)",
1655 ));
1656 }
1657
1658 let future_val = args[0].clone();
1661 poll_future_to_completion(env, future_val)
1662 });
1663
1664 self.define_native("poll_once", |env, args| {
1666 if args.len() != 1 {
1667 return Err(KainError::runtime(
1668 "poll_once: expected 1 argument (future)",
1669 ));
1670 }
1671
1672 poll_future_once(env, args[0].clone())
1673 });
1674
1675 self.define_native("is_ready", |_env, args| {
1677 if args.len() != 1 {
1678 return Err(KainError::runtime("is_ready: expected 1 argument"));
1679 }
1680
1681 match &args[0] {
1682 Value::Poll(ready, _) => Ok(Value::Bool(*ready)),
1683 Value::EnumVariant(_, variant, _) => Ok(Value::Bool(variant == "Ready")),
1684 _ => Ok(Value::Bool(false)),
1685 }
1686 });
1687
1688 self.define_native("is_pending", |_env, args| {
1690 if args.len() != 1 {
1691 return Err(KainError::runtime("is_pending: expected 1 argument"));
1692 }
1693
1694 match &args[0] {
1695 Value::Poll(ready, _) => Ok(Value::Bool(!*ready)),
1696 Value::EnumVariant(_, variant, _) => Ok(Value::Bool(variant == "Pending")),
1697 _ => Ok(Value::Bool(false)),
1698 }
1699 });
1700
1701 self.define_native("unwrap_ready", |_env, args| {
1703 if args.len() != 1 {
1704 return Err(KainError::runtime("unwrap_ready: expected 1 argument"));
1705 }
1706
1707 match &args[0] {
1708 Value::Poll(true, Some(val)) => Ok(*val.clone()),
1709 Value::Poll(true, None) => Ok(Value::Unit),
1710 Value::Poll(false, _) => {
1711 Err(KainError::runtime("unwrap_ready: called on Poll::Pending"))
1712 }
1713 Value::EnumVariant(_, variant, fields) if variant == "Ready" => {
1714 if fields.is_empty() {
1715 Ok(Value::Unit)
1716 } else {
1717 Ok(fields[0].clone())
1718 }
1719 }
1720 Value::EnumVariant(_, variant, _) if variant == "Pending" => {
1721 Err(KainError::runtime("unwrap_ready: called on Poll::Pending"))
1722 }
1723 _ => Err(KainError::runtime("unwrap_ready: expected Poll value")),
1724 }
1725 });
1726 }
1727
1728 fn define_native(&mut self, name: &str, func: fn(&mut Env, Vec<Value>) -> KainResult<Value>) {
1729 self.scopes[0].insert(name.to_string(), Value::NativeFn(name.to_string(), func));
1730 }
1731
1732 fn define(&mut self, name: String, value: Value) {
1733 self.scopes.last_mut().unwrap().insert(name, value);
1734 }
1735
1736 fn assign(&mut self, name: &str, value: Value) -> KainResult<()> {
1737 for scope in self.scopes.iter_mut().rev() {
1738 if scope.contains_key(name) {
1739 scope.insert(name.to_string(), value);
1740 return Ok(());
1741 }
1742 }
1743 Err(KainError::runtime(format!("Undefined variable '{}'", name)))
1744 }
1745
1746 fn lookup(&self, name: &str) -> Option<&Value> {
1747 for scope in self.scopes.iter().rev() {
1748 if let Some(v) = scope.get(name) {
1749 return Some(v);
1750 }
1751 }
1752 None
1753 }
1754
1755 fn push_scope(&mut self) {
1756 self.scopes.push(HashMap::new());
1757 }
1758
1759 fn pop_scope(&mut self) {
1760 self.scopes.pop();
1761 }
1762}
1763
1764pub fn interpret(program: &TypedProgram) -> KainResult<Value> {
1768 let mut env = Env::new();
1769
1770 for item in &program.items {
1772 match item {
1773 crate::types::TypedItem::Use(u) => {
1774 load_module(&mut env, &u.ast)?;
1776 }
1777 crate::types::TypedItem::Function(f) => {
1778 env.functions.insert(f.ast.name.clone(), f.ast.clone());
1779 env.define(f.ast.name.clone(), Value::Function(f.ast.name.clone()));
1780 }
1781 crate::types::TypedItem::Actor(a) => {
1782 env.actor_defs.insert(a.ast.name.clone(), a.ast.clone());
1783 }
1784 crate::types::TypedItem::Component(c) => {
1785 env.components.insert(c.ast.name.clone(), c.ast.clone());
1786 }
1787 crate::types::TypedItem::Const(c) => {
1788 let val = eval_expr(&mut env, &c.ast.value)?;
1789 env.define(c.ast.name.clone(), val);
1790 }
1791 crate::types::TypedItem::Impl(i) => {
1792 let type_name = match &i.ast.target_type {
1794 Type::Named { name, .. } => name.clone(),
1795 _ => continue,
1796 };
1797 let type_methods = env.methods.entry(type_name).or_insert_with(HashMap::new);
1799 for method in &i.ast.methods {
1800 type_methods.insert(method.name.clone(), method.clone());
1801 }
1802 }
1803 crate::types::TypedItem::Comptime(_) => {} _ => {}
1805 }
1806 }
1807
1808 if let Some(main_fn) = env.functions.get("main").cloned() {
1810 eval_block(&mut env, &main_fn.body)
1811 } else {
1812 Ok(Value::Unit)
1813 }
1814}
1815
1816fn load_module(env: &mut Env, u: &Use) -> KainResult<()> {
1817 let path = u.path.join("/");
1818
1819 if path == "stdlib" {
1821 return Ok(());
1822 }
1823
1824 let file_path = if path.starts_with("std/") || path.starts_with("stdlib/") {
1826 let module_name = path
1828 .trim_start_matches("std/")
1829 .trim_start_matches("stdlib/");
1830
1831 let possible_paths = [
1833 format!("stdlib/{}.kn", module_name),
1834 format!("../stdlib/{}.kn", module_name),
1835 format!("examples/../stdlib/{}.kn", module_name),
1836 ];
1837
1838 possible_paths
1839 .into_iter()
1840 .map(|p| std::path::PathBuf::from(p))
1841 .find(|p| p.exists())
1842 .ok_or_else(|| {
1843 KainError::runtime(format!("Stdlib module not found: {}", module_name))
1844 })?
1845 } else {
1846 let base_path = std::path::Path::new(&path);
1848
1849 let possible_paths = [
1851 base_path.with_extension("kn"), std::path::PathBuf::from(format!("src/{}.kn", path)), std::path::PathBuf::from(format!("{}.kn", path)), base_path.with_extension("god"), ];
1856
1857 possible_paths
1858 .iter()
1859 .find(|p| p.exists())
1860 .cloned()
1861 .ok_or_else(|| {
1862 KainError::runtime(format!(
1863 "Module not found: {} (tried: {:?})",
1864 path,
1865 possible_paths
1866 .iter()
1867 .map(|p| p.display().to_string())
1868 .collect::<Vec<_>>()
1869 ))
1870 })?
1871 };
1872
1873 let source = std::fs::read_to_string(&file_path)
1874 .map_err(|e| KainError::runtime(format!("Failed to read module {}: {}", path, e)))?;
1875
1876 let lexer = Lexer::new(&source);
1877 let tokens = lexer.tokenize()?;
1878 let mut parser = Parser::new(&tokens);
1879 let program = parser.parse()?;
1880
1881 for item in program.items {
1883 match item {
1884 Item::Function(f) => {
1885 env.functions.insert(f.name.clone(), f.clone());
1886 env.define(f.name.clone(), Value::Function(f.name.clone()));
1887 }
1888 Item::Component(c) => {
1889 env.components.insert(c.name.clone(), c);
1890 }
1891 Item::Struct(s) => {
1892 let field_names = s.fields.iter().map(|f| f.name.clone()).collect();
1893 env.define(
1894 s.name.clone(),
1895 Value::StructConstructor(s.name.clone(), field_names),
1896 );
1897 }
1898 Item::Enum(e) => {
1899 for variant in &e.variants {
1901 let variant_name = format!("{}::{}", e.name, variant.name);
1902 env.define(
1903 variant_name,
1904 Value::Function(format!("{}::{}", e.name, variant.name)),
1905 );
1906 }
1907 }
1908 Item::Actor(a) => {
1909 env.actor_defs.insert(a.name.clone(), a);
1910 }
1911 Item::Const(c) => {
1912 let val = eval_expr(env, &c.value)?;
1913 env.define(c.name.clone(), val);
1914 }
1915 Item::Impl(i) => {
1916 if let Type::Named { name, .. } = &i.target_type {
1917 let lowered_fns: Vec<(String, Function)> = i
1919 .methods
1920 .iter()
1921 .map(|m| (format!("{}_{}", name, m.name), m.clone()))
1922 .collect();
1923
1924 for (lowered_name, method) in lowered_fns {
1926 env.functions.insert(lowered_name.clone(), method);
1927 env.define(lowered_name.clone(), Value::Function(lowered_name));
1928 }
1929
1930 let type_methods = env.methods.entry(name.clone()).or_insert_with(HashMap::new);
1932 for method in &i.methods {
1933 type_methods.insert(method.name.clone(), method.clone());
1934 }
1935 }
1936 }
1937 Item::Use(u) => {
1938 load_module(env, &u)?;
1939 }
1940 _ => {}
1941 }
1942 }
1943
1944 Ok(())
1945}
1946
1947pub fn eval_block(env: &mut Env, block: &Block) -> KainResult<Value> {
1948 for stmt in &block.stmts {
1949 let result = eval_stmt(env, stmt)?;
1950 match &result {
1952 Value::Return(_) | Value::Break(_) | Value::Continue => return Ok(result),
1953 _ => {}
1954 }
1955 }
1956 Ok(Value::Unit)
1957}
1958
1959fn eval_stmt(env: &mut Env, stmt: &Stmt) -> KainResult<Value> {
1960 match stmt {
1961 Stmt::Expr(expr) => {
1962 let val = eval_expr(env, expr)?;
1963 match &val {
1965 Value::Return(_) | Value::Break(_) | Value::Continue => return Ok(val),
1966 _ => {}
1967 }
1968 Ok(Value::Unit)
1969 }
1970 Stmt::Let { pattern, value, .. } => {
1971 let val = if let Some(expr) = value {
1972 eval_expr(env, expr)?
1973 } else {
1974 Value::None
1975 };
1976 if let Value::Return(_) = val {
1977 return Ok(val);
1978 }
1979
1980 if let Pattern::Binding { name, .. } = pattern {
1982 env.define(name.clone(), val);
1983 }
1984 Ok(Value::Unit)
1985 }
1986 Stmt::Return(expr, _) => {
1987 let val = if let Some(e) = expr {
1988 eval_expr(env, e)?
1989 } else {
1990 Value::Unit
1991 };
1992 if let Value::Return(_) = val {
1993 return Ok(val);
1994 }
1995 Ok(Value::Return(Box::new(val)))
1996 }
1997 Stmt::For {
1998 binding,
1999 iter,
2000 body,
2001 ..
2002 } => {
2003 let iter_val = eval_expr(env, iter)?;
2004 if let Value::Return(_) = iter_val {
2005 return Ok(iter_val);
2006 }
2007
2008 if let Value::Array(arr) = iter_val {
2009 let arr = arr.read().unwrap().clone();
2010 for val in arr.iter() {
2011 env.push_scope();
2012 if let Pattern::Binding { name, .. } = binding {
2013 env.define(name.clone(), val.clone());
2014 }
2015 let res = eval_block(env, body)?;
2016 env.pop_scope();
2017
2018 match res {
2019 Value::Return(_) => return Ok(res),
2020 Value::Break(_) => break,
2021 Value::Continue => continue,
2022 _ => {}
2023 }
2024 }
2025 } else if let Value::String(s) = iter_val {
2026 for c in s.chars() {
2027 env.push_scope();
2028 if let Pattern::Binding { name, .. } = binding {
2029 env.define(name.clone(), Value::String(c.to_string()));
2030 }
2031 let res = eval_block(env, body)?;
2032 env.pop_scope();
2033
2034 match res {
2035 Value::Return(_) => return Ok(res),
2036 Value::Break(_) => break,
2037 Value::Continue => continue,
2038 _ => {}
2039 }
2040 }
2041 }
2042 Ok(Value::Unit)
2043 }
2044 Stmt::While {
2045 condition, body, ..
2046 } => {
2047 loop {
2048 let cond = eval_expr(env, condition)?;
2049 if let Value::Return(_) = cond {
2050 return Ok(cond);
2051 }
2052 if let Value::Bool(false) = cond {
2053 break;
2054 }
2055
2056 let res = eval_block(env, body)?;
2057 match res {
2058 Value::Return(_) => return Ok(res),
2059 Value::Break(_) => break,
2060 Value::Continue => continue,
2061 _ => {}
2062 }
2063 }
2064 Ok(Value::Unit)
2065 }
2066 Stmt::Loop { body, .. } => loop {
2067 let res = eval_block(env, body)?;
2068 match res {
2069 Value::Return(_) => return Ok(res),
2070 Value::Break(val) => {
2071 return Ok(val.map(|v| *v).unwrap_or(Value::Unit));
2072 }
2073 Value::Continue => continue,
2074 _ => {}
2075 }
2076 },
2077 Stmt::Break(expr, _) => {
2078 let val = if let Some(e) = expr {
2079 Some(Box::new(eval_expr(env, e)?))
2080 } else {
2081 None
2082 };
2083 Ok(Value::Break(val))
2084 }
2085 Stmt::Continue(_) => Ok(Value::Continue),
2086 _ => Ok(Value::Unit),
2087 }
2088}
2089
2090fn eval_assignment(env: &mut Env, target: &Expr, value: Value) -> KainResult<()> {
2091 match target {
2092 Expr::Ident(name, _) => env.assign(name, value),
2093 Expr::Field { object, field, .. } => {
2094 let obj_val = eval_expr(env, object)?;
2095 if let Value::Struct(_, fields) = obj_val {
2096 fields.write().unwrap().insert(field.clone(), value);
2097 } else if let Value::ActorRef(r) = obj_val {
2098 if let Some(self_id) = env.self_actor_id {
2099 if self_id == r.id {
2100 return env.assign(field, value);
2101 }
2102 }
2103 return Err(KainError::runtime("Cannot assign to remote actor fields"));
2104 } else {
2105 return Err(KainError::runtime(
2106 "Field assignment only supported on structs",
2107 ));
2108 }
2109 Ok(())
2110 }
2111 Expr::Index { object, index, .. } => {
2112 let obj_val = eval_expr(env, object)?;
2113 let idx_val = eval_expr(env, index)?;
2114 match (obj_val, idx_val) {
2115 (Value::Array(arr), Value::Int(i)) => {
2116 let i = i as usize;
2117 let mut arr = arr.write().unwrap();
2118 if i < arr.len() {
2119 arr[i] = value;
2120 } else {
2121 return Err(KainError::runtime("Index out of bounds"));
2122 }
2123 }
2124 _ => {
2125 return Err(KainError::runtime(
2126 "Index assignment only supported on arrays with int index",
2127 ))
2128 }
2129 }
2130 Ok(())
2131 }
2132 _ => Err(KainError::runtime("Invalid assignment target")),
2133 }
2134}
2135
2136pub fn eval_expr(env: &mut Env, expr: &Expr) -> KainResult<Value> {
2137 match expr {
2138 Expr::MethodCall {
2139 receiver,
2140 method,
2141 args,
2142 span: _,
2143 } => {
2144 let obj_val = eval_expr(env, receiver)?;
2146 if let Value::Return(_) = obj_val {
2147 return Ok(obj_val);
2148 }
2149
2150 let mut arg_vals = Vec::new();
2152 for arg in args {
2153 let v = eval_expr(env, &arg.value)?;
2154 if let Value::Return(_) = v {
2155 return Ok(v);
2156 }
2157 arg_vals.push(v);
2158 }
2159
2160 match obj_val {
2161 Value::Struct(ref name, _) | Value::Future(ref name, _) => {
2163 let func_name = format!("{}_{}", name, method);
2164
2165 if let Some(func) = env.functions.get(&func_name).cloned() {
2166 env.push_scope();
2168 env.define("self".to_string(), obj_val);
2169
2170 let param_iter = if func
2172 .params
2173 .first()
2174 .map(|p| p.name == "self")
2175 .unwrap_or(false)
2176 {
2177 func.params.iter().skip(1)
2178 } else {
2179 func.params.iter().skip(0)
2180 };
2181
2182 if param_iter.len() != arg_vals.len() {
2183 return Err(KainError::runtime(format!(
2184 "Method {} arg mismatch",
2185 func_name
2186 )));
2187 }
2188
2189 for (param, arg) in param_iter.zip(arg_vals.into_iter()) {
2190 env.define(param.name.clone(), arg);
2191 }
2192
2193 let result = eval_block(env, &func.body)?;
2194 env.pop_scope();
2195
2196 match result {
2197 Value::Return(v) => Ok(*v),
2198 v => Ok(v),
2199 }
2200 } else {
2201 Err(KainError::runtime(format!(
2202 "Method {} not found for type {}",
2203 method, name
2204 )))
2205 }
2206 }
2207
2208 Value::Array(_) => {
2210 match method.as_str() {
2212 "push" => {
2213 if arg_vals.len() != 1 {
2214 return Err(KainError::runtime("push expects 1 argument"));
2215 }
2216 if let Value::Array(arr) = obj_val {
2217 arr.write().unwrap().push(arg_vals[0].clone());
2218 Ok(Value::Unit)
2219 } else {
2220 unreachable!()
2221 }
2222 }
2223 "len" => {
2224 if let Value::Array(arr) = obj_val {
2225 Ok(Value::Int(arr.read().unwrap().len() as i64))
2226 } else {
2227 unreachable!()
2228 }
2229 }
2230 _ => Err(KainError::runtime(format!(
2231 "Method {} not found on Array",
2232 method
2233 ))),
2234 }
2235 }
2236
2237 _ => Err(KainError::runtime(format!(
2238 "Method calls not supported on this type: {:?}",
2239 obj_val
2240 ))),
2241 }
2242 }
2243
2244 Expr::Call { callee, args, .. } => {
2245 if let Expr::Field { object, field, .. } = callee.as_ref() {
2247 if let Expr::Ident(type_name, _) = object.as_ref() {
2249 let method = env
2251 .methods
2252 .get(type_name)
2253 .and_then(|m| m.get(field))
2254 .cloned();
2255
2256 if let Some(method) = method {
2257 let mut arg_vals = Vec::new();
2259 for arg in args {
2260 let v = eval_expr(env, &arg.value)?;
2261 if let Value::Return(_) = v {
2262 return Ok(v);
2263 }
2264 arg_vals.push(v);
2265 }
2266
2267 env.push_scope();
2269 for (param, arg) in method.params.iter().zip(arg_vals.into_iter()) {
2270 env.define(param.name.clone(), arg);
2271 }
2272 let result = eval_block(env, &method.body);
2273 env.pop_scope();
2274
2275 return match result? {
2276 Value::Return(v) => Ok(*v),
2277 v => Ok(v),
2278 };
2279 }
2280 }
2281
2282 let obj_val = eval_expr(env, object)?;
2284 if let Value::Return(_) = obj_val {
2285 return Ok(obj_val);
2286 }
2287
2288 let type_name = match &obj_val {
2290 Value::Struct(name, _) => Some(name.clone()),
2291 _ => None,
2292 };
2293
2294 if let Some(type_name) = type_name {
2295 let method = env
2297 .methods
2298 .get(&type_name)
2299 .and_then(|m| m.get(field))
2300 .cloned();
2301
2302 if let Some(method) = method {
2303 let mut arg_vals = Vec::new();
2305 for arg in args {
2306 let v = eval_expr(env, &arg.value)?;
2307 if let Value::Return(_) = v {
2308 return Ok(v);
2309 }
2310 arg_vals.push(v);
2311 }
2312
2313 env.push_scope();
2315 env.define("self".to_string(), obj_val);
2316
2317 let params_iter = if let Some(first) = method.params.first() {
2319 if first.name == "self" {
2320 method.params.iter().skip(1)
2321 } else {
2322 method.params.iter().skip(0)
2323 }
2324 } else {
2325 method.params.iter().skip(0)
2326 };
2327
2328 for (param, arg) in params_iter.zip(arg_vals.into_iter()) {
2329 env.define(param.name.clone(), arg);
2330 }
2331 let result = eval_block(env, &method.body);
2332 env.pop_scope();
2333
2334 return match result? {
2335 Value::Return(v) => Ok(*v),
2336 v => Ok(v),
2337 };
2338 }
2339 }
2340 }
2341
2342 let func_val = {
2344 let v = eval_expr(env, callee)?;
2345 if let Value::Return(_) = v {
2346 return Ok(v);
2347 }
2348 v
2349 };
2350
2351 let mut arg_vals = Vec::new();
2353 for arg in args {
2354 let v = eval_expr(env, &arg.value)?;
2355 if let Value::Return(_) = v {
2356 return Ok(v);
2357 }
2358 arg_vals.push(v);
2359 }
2360
2361 call_function(env, func_val, arg_vals)
2362 }
2363
2364 Expr::Try(inner, _) => {
2365 let val = eval_expr(env, inner)?;
2366 if let Value::Return(_) = val {
2367 return Ok(val);
2368 }
2369 match val {
2370 Value::Result(true, v) => Ok(*v),
2371 Value::Result(false, e) => Ok(Value::Return(Box::new(Value::Result(false, e)))),
2372 _ => Err(KainError::runtime(
2373 "Type error: expected Result for ? operator",
2374 )),
2375 }
2376 }
2377
2378 Expr::If {
2379 condition,
2380 then_branch,
2381 else_branch,
2382 ..
2383 } => {
2384 let cond = eval_expr(env, condition)?;
2385 if let Value::Return(_) = cond {
2386 return Ok(cond);
2387 }
2388 if let Value::Bool(true) = cond {
2389 eval_block(env, then_branch)
2390 } else if let Some(eb) = else_branch {
2391 match eb.as_ref() {
2392 ElseBranch::Else(block) => eval_block(env, block),
2393 _ => Ok(Value::Unit),
2394 }
2395 } else {
2396 Ok(Value::Unit)
2397 }
2398 }
2399
2400 Expr::Match {
2401 scrutinee, arms, ..
2402 } => {
2403 let val = eval_expr(env, scrutinee)?;
2404 if let Value::Return(_) = val {
2405 return Ok(val);
2406 }
2407
2408 for arm in arms {
2409 if pattern_matches(&arm.pattern, &val) {
2410 env.push_scope();
2411 bind_pattern(env, &arm.pattern, &val);
2412 let res = eval_expr(env, &arm.body)?;
2413 env.pop_scope();
2414 return Ok(res);
2415 }
2416 }
2417 Ok(Value::Unit)
2419 }
2420
2421 Expr::MacroCall { name, args, .. } => {
2422 match name.as_str() {
2424 "vec" => {
2425 let mut vals = Vec::new();
2426 for arg in args {
2427 let v = eval_expr(env, arg)?;
2428 if let Value::Return(_) = v {
2429 return Ok(v);
2430 }
2431 vals.push(v);
2432 }
2433 Ok(Value::Array(Arc::new(RwLock::new(vals))))
2434 }
2435 "format" => {
2436 let mut res = String::new();
2438 for arg in args {
2439 let v = eval_expr(env, arg)?;
2440 res.push_str(&format!("{}", v));
2441 }
2442 Ok(Value::String(res))
2443 }
2444 "type_name" => {
2445 if let Some(arg) = args.first() {
2446 let v = eval_expr(env, arg)?;
2447 let type_name = match v {
2448 Value::Unit => "unit",
2449 Value::Bool(_) => "bool",
2450 Value::Int(_) => "int",
2451 Value::Float(_) => "float",
2452 Value::String(_) => "string",
2453 Value::Array(_) => "array",
2454 Value::Tuple(_) => "tuple",
2455 Value::Struct(name, _) => return Ok(Value::String(name.clone())),
2456 Value::Function(_) => "function",
2457 Value::NativeFn(_, _) => "native_fn",
2458 Value::StructConstructor(_, _) => "struct_constructor",
2459 Value::ActorRef(_) => "actor",
2460 Value::None => "none",
2461 Value::Return(_) => "return",
2462 Value::Result(_, _) => "result",
2463 Value::Closure(_, _, _) => "closure",
2464 Value::JSX(_) => "jsx",
2465 Value::EnumVariant(enum_name, _, _) => {
2466 return Ok(Value::String(enum_name.clone()))
2467 }
2468 Value::Poll(_, _) => "poll",
2469 Value::Future(name, _) => {
2470 return Ok(Value::String(format!("Future<{}>", name)))
2471 }
2472 Value::Break(_) => "break",
2473 Value::Continue => "continue",
2474 };
2475 Ok(Value::String(type_name.to_string()))
2476 } else {
2477 Err(KainError::runtime("type_name! requires an argument"))
2478 }
2479 }
2480 _ => Err(KainError::runtime(format!("Unknown macro: {}!", name))),
2481 }
2482 }
2483 Expr::Assign { target, value, .. } => {
2484 let v = eval_expr(env, value)?;
2485 if let Value::Return(_) = v {
2486 return Ok(v);
2487 }
2488 eval_assignment(env, target, v)?;
2489 Ok(Value::Unit)
2490 }
2491 Expr::Int(n, _) => Ok(Value::Int(*n)),
2492 Expr::Float(n, _) => Ok(Value::Float(*n)),
2493 Expr::String(s, _) => Ok(Value::String(s.clone())),
2494 Expr::FString(parts, _) => {
2495 let mut result = String::new();
2496 for part in parts {
2497 let val = eval_expr(env, part)?;
2498 if let Value::Return(_) = val {
2499 return Ok(val);
2500 }
2501 result.push_str(&format!("{}", val));
2502 }
2503 Ok(Value::String(result))
2504 }
2505 Expr::Bool(b, _) => Ok(Value::Bool(*b)),
2506 Expr::None(_) => Ok(Value::None),
2507 Expr::Lambda { params, body, .. } => {
2508 let param_names = params.iter().map(|p| p.name.clone()).collect();
2509 Ok(Value::Closure(
2510 param_names,
2511 body.clone(),
2512 env.scopes.clone(),
2513 ))
2514 }
2515 Expr::Ident(name, _span) => env
2516 .lookup(name)
2517 .cloned()
2518 .ok_or_else(|| KainError::runtime(format!("Undefined: {}", name))),
2519
2520 Expr::Binary {
2521 left, op, right, ..
2522 } => {
2523 let l = eval_expr(env, left)?;
2524 if let Value::Return(_) = l {
2525 return Ok(l);
2526 }
2527 let r = eval_expr(env, right)?;
2528 if let Value::Return(_) = r {
2529 return Ok(r);
2530 }
2531 eval_binop(*op, l, r)
2532 }
2533
2534 Expr::Unary { op, operand, .. } => {
2535 let v = eval_expr(env, operand)?;
2536 if let Value::Return(_) = v {
2537 return Ok(v);
2538 }
2539 match (op, v) {
2540 (UnaryOp::Neg, Value::Int(n)) => Ok(Value::Int(-n)),
2541 (UnaryOp::Neg, Value::Float(n)) => Ok(Value::Float(-n)),
2542 (UnaryOp::Not, Value::Bool(b)) => Ok(Value::Bool(!b)),
2543 _ => Err(KainError::runtime("Invalid unary operation")),
2544 }
2545 }
2546
2547 Expr::Array(elements, _) => {
2548 let mut vals = Vec::new();
2549 for elem in elements {
2550 let v = eval_expr(env, elem)?;
2551 if let Value::Return(_) = v {
2552 return Ok(v);
2553 }
2554 vals.push(v);
2555 }
2556 Ok(Value::Array(Arc::new(RwLock::new(vals))))
2557 }
2558
2559 Expr::Index { object, index, .. } => {
2560 let obj = eval_expr(env, object)?;
2561 if let Value::Return(_) = obj {
2562 return Ok(obj);
2563 }
2564 let idx = eval_expr(env, index)?;
2565 if let Value::Return(_) = idx {
2566 return Ok(idx);
2567 }
2568
2569 match (obj, idx) {
2570 (Value::Array(arr), Value::Int(i)) => {
2571 let i = i as usize;
2572 let arr = arr.read().unwrap();
2573 if i < arr.len() {
2574 Ok(arr[i].clone())
2575 } else {
2576 Err(KainError::runtime(format!("Index out of bounds: {}", i)))
2577 }
2578 }
2579 (Value::String(s), Value::Int(i)) => {
2580 let i = i as usize;
2581 if i < s.len() {
2582 Ok(Value::String(s.chars().nth(i).unwrap().to_string()))
2583 } else {
2584 Err(KainError::runtime(format!("Index out of bounds: {}", i)))
2585 }
2586 }
2587 _ => Err(KainError::runtime(
2588 "Index operator requires array/string and int",
2589 )),
2590 }
2591 }
2592
2593 Expr::Struct { name, fields, .. } => {
2595 let mut field_vals = HashMap::new();
2596 for (k, expr) in fields {
2597 let v = eval_expr(env, expr)?;
2598 if let Value::Return(_) = v {
2599 return Ok(v);
2600 }
2601 field_vals.insert(k.clone(), v);
2602 }
2603 Ok(Value::Struct(
2604 name.clone(),
2605 Arc::new(RwLock::new(field_vals)),
2606 ))
2607 }
2608
2609 Expr::JSX(node, _) => eval_jsx(env, node),
2611
2612 Expr::Field { object, field, .. } => {
2613 let obj_val = eval_expr(env, object)?;
2614 if let Value::Return(_) = obj_val {
2615 return Ok(obj_val);
2616 }
2617
2618 match obj_val {
2619 Value::Struct(_, fields) => {
2620 let fields = fields.read().unwrap();
2621 fields
2622 .get(field)
2623 .cloned()
2624 .ok_or_else(|| KainError::runtime(format!("Field not found: {}", field)))
2625 }
2626 Value::ActorRef(r) => {
2627 if let Some(self_id) = env.self_actor_id {
2629 if self_id == r.id {
2630 return env.lookup(field).cloned().ok_or_else(|| {
2631 KainError::runtime(format!("Actor field not found: {}", field))
2632 });
2633 }
2634 }
2635
2636 if field == "id" {
2638 return Ok(Value::Int(r.id as i64));
2639 }
2640 Err(KainError::runtime("Actor fields not accessible"))
2641 }
2642 _ => Err(KainError::runtime(format!(
2643 "Field access on non-struct value: {:?}",
2644 obj_val
2645 ))),
2646 }
2647 }
2648
2649 Expr::Tuple(elements, _) => {
2650 let mut vals = Vec::new();
2651 for elem in elements {
2652 let v = eval_expr(env, elem)?;
2653 if let Value::Return(_) = v {
2654 return Ok(v);
2655 }
2656 vals.push(v);
2657 }
2658 Ok(Value::Tuple(vals))
2659 }
2660
2661 Expr::Spawn { actor, init, .. } => {
2662 let actor_def = env
2664 .actor_defs
2665 .get(actor)
2666 .cloned()
2667 .ok_or_else(|| KainError::runtime(format!("Unknown actor: {}", actor)))?;
2668
2669 let mut init_vals = HashMap::new();
2671 for (field, expr) in init {
2672 let v = eval_expr(env, expr)?;
2673 if let Value::Return(_) = v {
2674 return Ok(v);
2675 }
2676 init_vals.insert(field.clone(), v);
2677 }
2678
2679 let (tx, rx) = flume::unbounded();
2681 let id = env.next_actor_id;
2682 env.next_actor_id += 1;
2683 let sender = tx.clone();
2684 env.actors.insert(id, sender.clone());
2685
2686 let functions = env.functions.clone();
2688 let components = env.components.clone();
2689 let actor_defs = env.actor_defs.clone();
2690 let methods = env.methods.clone();
2691 let global_scope = env.scopes.first().cloned().unwrap_or_default();
2692 let actor_name = actor.clone();
2693 let self_sender = tx.clone();
2694
2695 std::thread::spawn(move || {
2696 let mut actor_env = Env {
2697 scopes: vec![global_scope],
2698 functions,
2699 components,
2700 methods,
2701 actors: HashMap::new(),
2702 next_actor_id: 0,
2703 actor_defs,
2704 self_actor_id: Some(id),
2705 python_scope: None,
2706 };
2707
2708 Python::with_gil(|py| {
2710 let scope = PyDict::new(py);
2712 let builtins = py.import("builtins").unwrap();
2714 scope.set_item("__builtins__", builtins).unwrap();
2715 actor_env.python_scope = Some(scope.into());
2716 });
2717
2718 actor_env.register_stdlib();
2719
2720 actor_env.push_scope(); let actor_val = Value::ActorRef(ActorRef {
2724 id,
2725 sender: self_sender,
2726 });
2727 actor_env.define("self".to_string(), actor_val);
2728
2729 for state_decl in &actor_def.state {
2731 if let Some(val) = init_vals.get(&state_decl.name) {
2732 actor_env.define(state_decl.name.clone(), val.clone());
2733 } else {
2734 match eval_expr(&mut actor_env, &state_decl.initial) {
2736 Ok(val) => actor_env.define(state_decl.name.clone(), val),
2737 Err(e) => {
2738 eprintln!("Actor initialization error: {}", e);
2739 return;
2740 }
2741 }
2742 }
2743 }
2744
2745 while let Ok(msg) = rx.recv() {
2747 let mut handled = false;
2749 for handler in &actor_def.handlers {
2750 if handler.message_type == msg.name {
2751 actor_env.push_scope();
2753 for (i, param) in handler.params.iter().enumerate() {
2755 if let Some(val) = msg.args.get(i) {
2756 actor_env.define(param.name.clone(), val.clone());
2757 }
2758 }
2759
2760 if let Err(e) = eval_block(&mut actor_env, &handler.body) {
2761 println!("Error in actor handler {}: {}", handler.message_type, e);
2762 }
2763 actor_env.pop_scope();
2764 handled = true;
2765 break;
2766 }
2767 }
2768 if !handled {
2769 println!(
2770 "Actor {} received unknown message: {}",
2771 actor_name, msg.name
2772 );
2773 }
2774 }
2775 });
2776
2777 Ok(Value::ActorRef(ActorRef { id, sender }))
2778 }
2779
2780 Expr::SendMsg {
2781 target,
2782 message,
2783 data,
2784 ..
2785 } => {
2786 let actor_val = eval_expr(env, target)?;
2787 if let Value::Return(_) = actor_val {
2788 return Ok(actor_val);
2789 }
2790
2791 if let Value::ActorRef(r) = actor_val {
2792 let mut msg_args = Vec::new();
2793 for (_name, expr) in data {
2794 let v = eval_expr(env, expr)?;
2795 msg_args.push(v);
2796 }
2797
2798 let msg = Message {
2799 name: message.clone(),
2800 args: msg_args,
2801 };
2802
2803 let _ = r.sender.send(msg);
2804 Ok(Value::Unit)
2805 } else {
2806 Err(KainError::runtime("send target must be an actor"))
2807 }
2808 }
2809
2810 Expr::Block(block, _) => eval_block(env, block),
2812
2813 Expr::Return(expr, _) => {
2815 let val = if let Some(e) = expr {
2816 eval_expr(env, e)?
2817 } else {
2818 Value::Unit
2819 };
2820 Ok(Value::Return(Box::new(val)))
2821 }
2822
2823 Expr::Paren(inner, _) => eval_expr(env, inner),
2824
2825 Expr::Await(future_expr, _span) => {
2828 let future_val = eval_expr(env, future_expr)?;
2829 if let Value::Return(_) = future_val {
2830 return Ok(future_val);
2831 }
2832
2833 poll_future_to_completion(env, future_val)
2835 }
2836
2837 Expr::EnumVariant {
2839 enum_name,
2840 variant,
2841 fields,
2842 ..
2843 } => {
2844 if let Some(type_methods) = env.methods.get(enum_name).cloned() {
2847 if let Some(method) = type_methods.get(variant).cloned() {
2848 let arg_vals: Vec<Value> = match fields {
2850 EnumVariantFields::Unit => Vec::new(),
2851 EnumVariantFields::Tuple(exprs) => {
2852 let mut vals = Vec::new();
2853 for e in exprs {
2854 let v = eval_expr(env, e)?;
2855 if let Value::Return(_) = v {
2856 return Ok(v);
2857 }
2858 vals.push(v);
2859 }
2860 vals
2861 }
2862 EnumVariantFields::Struct(named_fields) => {
2863 let mut vals = Vec::new();
2864 for (_, e) in named_fields {
2865 let v = eval_expr(env, e)?;
2866 if let Value::Return(_) = v {
2867 return Ok(v);
2868 }
2869 vals.push(v);
2870 }
2871 vals
2872 }
2873 };
2874
2875 env.push_scope();
2877 for (param, arg) in method.params.iter().zip(arg_vals.into_iter()) {
2878 env.define(param.name.clone(), arg);
2879 }
2880 let result = eval_block(env, &method.body)?;
2881 env.pop_scope();
2882
2883 return match result {
2884 Value::Return(v) => Ok(*v),
2885 v => Ok(v),
2886 };
2887 }
2888 }
2889
2890 let lowered_name = format!("{}_{}", enum_name, variant);
2892 if let Some(func) = env.functions.get(&lowered_name).cloned() {
2893 let arg_vals: Vec<Value> = match fields {
2895 EnumVariantFields::Unit => Vec::new(),
2896 EnumVariantFields::Tuple(exprs) => {
2897 let mut vals = Vec::new();
2898 for e in exprs {
2899 let v = eval_expr(env, e)?;
2900 if let Value::Return(_) = v {
2901 return Ok(v);
2902 }
2903 vals.push(v);
2904 }
2905 vals
2906 }
2907 EnumVariantFields::Struct(named_fields) => {
2908 let mut vals = Vec::new();
2909 for (_, e) in named_fields {
2910 let v = eval_expr(env, e)?;
2911 if let Value::Return(_) = v {
2912 return Ok(v);
2913 }
2914 vals.push(v);
2915 }
2916 vals
2917 }
2918 };
2919
2920 env.push_scope();
2922 for (param, arg) in func.params.iter().zip(arg_vals.into_iter()) {
2923 env.define(param.name.clone(), arg);
2924 }
2925 let result = eval_block(env, &func.body)?;
2926 env.pop_scope();
2927
2928 return match result {
2929 Value::Return(v) => Ok(*v),
2930 v => Ok(v),
2931 };
2932 }
2933
2934 let field_vals = match fields {
2936 EnumVariantFields::Unit => Vec::new(),
2937 EnumVariantFields::Tuple(exprs) => {
2938 let mut vals = Vec::new();
2939 for e in exprs {
2940 let v = eval_expr(env, e)?;
2941 if let Value::Return(_) = v {
2942 return Ok(v);
2943 }
2944 vals.push(v);
2945 }
2946 vals
2947 }
2948 EnumVariantFields::Struct(named_fields) => {
2949 let mut vals = Vec::new();
2950 for (_, e) in named_fields {
2951 let v = eval_expr(env, e)?;
2952 if let Value::Return(_) = v {
2953 return Ok(v);
2954 }
2955 vals.push(v);
2956 }
2957 vals
2958 }
2959 };
2960
2961 if enum_name == "Poll" {
2963 match variant.as_str() {
2964 "Ready" => {
2965 let inner = if field_vals.is_empty() {
2966 None
2967 } else {
2968 Some(Box::new(
2969 field_vals.into_iter().next().unwrap_or(Value::Unit),
2970 ))
2971 };
2972 Ok(Value::Poll(true, inner))
2973 }
2974 "Pending" => Ok(Value::Poll(false, None)),
2975 _ => Ok(Value::EnumVariant(
2976 enum_name.clone(),
2977 variant.clone(),
2978 field_vals,
2979 )),
2980 }
2981 } else {
2982 Ok(Value::EnumVariant(
2983 enum_name.clone(),
2984 variant.clone(),
2985 field_vals,
2986 ))
2987 }
2988 }
2989
2990 Expr::Break(expr, _) => {
2991 let val = if let Some(e) = expr {
2992 Some(Box::new(eval_expr(env, e)?))
2993 } else {
2994 None
2995 };
2996 Ok(Value::Break(val))
2997 }
2998
2999 Expr::Continue(_) => Ok(Value::Continue),
3000
3001 _ => Err(KainError::runtime(format!(
3002 "Expression not supported in runtime: {:?}",
3003 expr
3004 ))),
3005 }
3006}
3007
3008fn call_function(env: &mut Env, func: Value, args: Vec<Value>) -> KainResult<Value> {
3009 match func {
3010 Value::Function(name) => {
3011 let f = env
3012 .functions
3013 .get(&name)
3014 .cloned()
3015 .ok_or_else(|| KainError::runtime(format!("Function not found: {}", name)))?;
3016 if f.params.len() != args.len() {
3017 return Err(KainError::runtime(format!(
3018 "Argument mismatch: expected {}, got {}",
3019 f.params.len(),
3020 args.len()
3021 )));
3022 }
3023
3024 env.push_scope();
3025 for (param, arg) in f.params.iter().zip(args.into_iter()) {
3026 env.define(param.name.clone(), arg);
3027 }
3028
3029 let result = eval_block(env, &f.body)?;
3030 env.pop_scope();
3031
3032 match result {
3033 Value::Return(v) => Ok(*v),
3034 v => Ok(v),
3035 }
3036 }
3037 Value::NativeFn(_, f) => f(env, args),
3038 Value::Closure(params, body, captured) => {
3039 if params.len() != args.len() {
3040 return Err(KainError::runtime(format!("Closure arg mismatch")));
3041 }
3042
3043 let old_scopes = env.scopes.clone();
3045 env.scopes = captured;
3046 env.push_scope();
3047
3048 for (name, arg) in params.iter().zip(args.into_iter()) {
3049 env.define(name.clone(), arg);
3050 }
3051
3052 let result = eval_expr(env, &body)?;
3053
3054 env.pop_scope();
3055 env.scopes = old_scopes;
3056
3057 match result {
3058 Value::Return(v) => Ok(*v),
3059 v => Ok(v),
3060 }
3061 }
3062 Value::StructConstructor(name, fields) => {
3063 if fields.len() != args.len() {
3064 return Err(KainError::runtime(format!(
3065 "Struct constructor for {} expected {} arguments, got {}",
3066 name,
3067 fields.len(),
3068 args.len()
3069 )));
3070 }
3071
3072 let mut field_vals = HashMap::new();
3073 for (i, val) in args.into_iter().enumerate() {
3074 field_vals.insert(fields[i].clone(), val);
3075 }
3076
3077 Ok(Value::Struct(name, Arc::new(RwLock::new(field_vals))))
3078 }
3079 _ => Err(KainError::runtime("Not a function")),
3080 }
3081}
3082
3083fn eval_binop(op: BinaryOp, left: Value, right: Value) -> KainResult<Value> {
3084 match (op, &left, &right) {
3085 (BinaryOp::Add, Value::Int(a), Value::Int(b)) => Ok(Value::Int(a + b)),
3086 (BinaryOp::Sub, Value::Int(a), Value::Int(b)) => Ok(Value::Int(a - b)),
3087 (BinaryOp::Mul, Value::Int(a), Value::Int(b)) => Ok(Value::Int(a * b)),
3088 (BinaryOp::Div, Value::Int(a), Value::Int(b)) => Ok(Value::Int(a / b)),
3089 (BinaryOp::Mod, Value::Int(a), Value::Int(b)) => Ok(Value::Int(a % b)),
3090 (BinaryOp::Add, Value::Float(a), Value::Float(b)) => Ok(Value::Float(a + b)),
3091 (BinaryOp::Sub, Value::Float(a), Value::Float(b)) => Ok(Value::Float(a - b)),
3092 (BinaryOp::Mul, Value::Float(a), Value::Float(b)) => Ok(Value::Float(a * b)),
3093 (BinaryOp::Div, Value::Float(a), Value::Float(b)) => Ok(Value::Float(a / b)),
3094 (BinaryOp::Add, Value::String(a), Value::String(b)) => Ok(Value::String(a.to_owned() + b)),
3095 (BinaryOp::Eq, Value::Int(a), Value::Int(b)) => Ok(Value::Bool(a == b)),
3096 (BinaryOp::Ne, Value::Int(a), Value::Int(b)) => Ok(Value::Bool(a != b)),
3097 (BinaryOp::Eq, Value::String(a), Value::String(b)) => Ok(Value::Bool(a == b)),
3098 (BinaryOp::Ne, Value::String(a), Value::String(b)) => Ok(Value::Bool(a != b)),
3099 (BinaryOp::Eq, Value::Bool(a), Value::Bool(b)) => Ok(Value::Bool(a == b)),
3100 (BinaryOp::Ne, Value::Bool(a), Value::Bool(b)) => Ok(Value::Bool(a != b)),
3101
3102 (BinaryOp::Lt, Value::Float(a), Value::Float(b)) => Ok(Value::Bool(a < b)),
3104 (BinaryOp::Gt, Value::Float(a), Value::Float(b)) => Ok(Value::Bool(a > b)),
3105 (BinaryOp::Le, Value::Float(a), Value::Float(b)) => Ok(Value::Bool(a <= b)),
3106 (BinaryOp::Ge, Value::Float(a), Value::Float(b)) => Ok(Value::Bool(a >= b)),
3107 (BinaryOp::Eq, Value::Float(a), Value::Float(b)) => {
3108 Ok(Value::Bool((a - b).abs() < f64::EPSILON))
3109 }
3110 (BinaryOp::Ne, Value::Float(a), Value::Float(b)) => {
3111 Ok(Value::Bool((a - b).abs() >= f64::EPSILON))
3112 }
3113
3114 (BinaryOp::Lt, Value::Int(a), Value::Int(b)) => Ok(Value::Bool(a < b)),
3115 (BinaryOp::Gt, Value::Int(a), Value::Int(b)) => Ok(Value::Bool(a > b)),
3116 (BinaryOp::Le, Value::Int(a), Value::Int(b)) => Ok(Value::Bool(a <= b)),
3117 (BinaryOp::Ge, Value::Int(a), Value::Int(b)) => Ok(Value::Bool(a >= b)),
3118 (BinaryOp::And, Value::Bool(a), Value::Bool(b)) => Ok(Value::Bool(*a && *b)),
3119 (BinaryOp::Or, Value::Bool(a), Value::Bool(b)) => Ok(Value::Bool(*a || *b)),
3120 (BinaryOp::Eq, Value::None, Value::None) => Ok(Value::Bool(true)),
3121 (BinaryOp::Ne, Value::None, Value::None) => Ok(Value::Bool(false)),
3122 (BinaryOp::Eq, Value::Unit, Value::Unit) => Ok(Value::Bool(true)),
3123 (BinaryOp::Ne, Value::Unit, Value::Unit) => Ok(Value::Bool(false)),
3124 (BinaryOp::Eq, _, _) => Ok(Value::Bool(false)),
3125 (BinaryOp::Ne, _, _) => Ok(Value::Bool(true)),
3126
3127 _ => Err(KainError::runtime(format!(
3129 "Type mismatch in binary operation: {:?} {:?} {:?}",
3130 left, op, right
3131 ))),
3132 }
3133}
3134
3135fn pattern_matches(pattern: &Pattern, value: &Value) -> bool {
3136 match pattern {
3137 Pattern::Wildcard(_) => true,
3138 Pattern::Binding { .. } => true,
3139 Pattern::Literal(Expr::Int(n, _)) => matches!(value, Value::Int(v) if *v == *n),
3140 Pattern::Literal(Expr::String(s, _)) => matches!(value, Value::String(v) if v == s),
3141 Pattern::Literal(Expr::Bool(b, _)) => matches!(value, Value::Bool(v) if *v == *b),
3142 Pattern::Variant {
3143 variant, fields, ..
3144 } => {
3145 if let Value::Poll(ready, val) = value {
3146 if *variant == "Ready" {
3147 if !ready {
3148 return false;
3149 }
3150 if let VariantPatternFields::Tuple(pats) = fields {
3151 if pats.len() == 1 {
3152 return if let Some(v) = val {
3153 pattern_matches(&pats[0], v)
3154 } else {
3155 false
3156 };
3157 }
3158 }
3159 return false;
3160 } else if *variant == "Pending" {
3161 return !ready;
3162 }
3163 return false;
3164 }
3165 if let Value::EnumVariant(_, v_name, v_fields) = value {
3166 if variant != v_name {
3167 return false;
3168 }
3169 match fields {
3170 VariantPatternFields::Unit => v_fields.is_empty(),
3171 VariantPatternFields::Tuple(pats) => {
3172 if pats.len() != v_fields.len() {
3173 return false;
3174 }
3175 pats.iter()
3176 .zip(v_fields.iter())
3177 .all(|(p, v)| pattern_matches(p, v))
3178 }
3179 _ => false,
3180 }
3181 } else {
3182 false
3183 }
3184 }
3185 _ => false,
3186 }
3187}
3188
3189fn bind_pattern(env: &mut Env, pattern: &Pattern, value: &Value) {
3190 match pattern {
3191 Pattern::Binding { name, .. } => {
3192 env.define(name.clone(), value.clone());
3193 }
3194 Pattern::Variant {
3195 variant, fields, ..
3196 } => {
3197 if let Value::Poll(ready, val) = value {
3198 if *variant == "Ready" && *ready {
3199 if let VariantPatternFields::Tuple(pats) = fields {
3200 if pats.len() == 1 {
3201 if let Some(v) = val {
3202 bind_pattern(env, &pats[0], v);
3203 }
3204 }
3205 }
3206 }
3207 } else if let Value::EnumVariant(_, _, v_fields) = value {
3208 match fields {
3209 VariantPatternFields::Tuple(pats) => {
3210 for (p, v) in pats.iter().zip(v_fields.iter()) {
3211 bind_pattern(env, p, v);
3212 }
3213 }
3214 _ => {}
3215 }
3216 }
3217 }
3218 _ => {}
3219 }
3220}
3221
3222fn eval_jsx(env: &mut Env, node: &JSXNode) -> KainResult<Value> {
3223 match node {
3224 JSXNode::Element {
3225 tag,
3226 attributes,
3227 children,
3228 ..
3229 } => {
3230 let mut attr_vals = HashMap::new();
3231 for attr in attributes {
3232 let v = match &attr.value {
3233 JSXAttrValue::String(s) => Value::String(s.clone()),
3234 JSXAttrValue::Bool(b) => Value::Bool(*b),
3235 JSXAttrValue::Expr(e) => eval_expr(env, e)?,
3236 };
3237 if let Value::Return(_) = v {
3238 return Ok(v);
3239 }
3240 attr_vals.insert(attr.name.clone(), v);
3241 }
3242
3243 let mut child_vals = Vec::new();
3244 for child in children {
3245 let v = eval_jsx(env, child)?;
3246 if let Value::Return(_) = v {
3247 return Ok(v);
3248 }
3249 match v {
3250 Value::JSX(node) => child_vals.push(node),
3251 Value::String(s) => child_vals.push(VNode::Text(s)),
3252 Value::Int(n) => child_vals.push(VNode::Text(n.to_string())),
3253 Value::Float(n) => child_vals.push(VNode::Text(n.to_string())),
3254 _ => {}
3255 }
3256 }
3257
3258 Ok(Value::JSX(VNode::Element {
3259 tag: tag.clone(),
3260 attrs: attr_vals,
3261 children: child_vals,
3262 }))
3263 }
3264 JSXNode::Text(s, _) => Ok(Value::String(s.clone())),
3265 JSXNode::Expression(expr) => eval_expr(env, expr),
3266 _ => Ok(Value::Unit),
3267 }
3268}
3269
3270pub fn run_tests(program: &TypedProgram) -> KainResult<()> {
3272 println!("\n Running Tests...\n");
3273 let mut passed = 0;
3274 let mut failed = 0;
3275
3276 let mut env = Env::new();
3278
3279 for item in &program.items {
3281 match item {
3282 crate::types::TypedItem::Function(f) => {
3283 env.functions.insert(f.ast.name.clone(), f.ast.clone());
3284 env.define(f.ast.name.clone(), Value::Function(f.ast.name.clone()));
3286 }
3287 crate::types::TypedItem::Actor(a) => {
3288 env.actor_defs.insert(a.ast.name.clone(), a.ast.clone());
3289 }
3290 crate::types::TypedItem::Component(c) => {
3291 env.components.insert(c.ast.name.clone(), c.ast.clone());
3292 }
3293 crate::types::TypedItem::Const(c) => {
3294 let val = eval_expr(&mut env, &c.ast.value)?;
3295 env.define(c.ast.name.clone(), val);
3296 }
3297 crate::types::TypedItem::Impl(i) => {
3298 let type_name = match &i.ast.target_type {
3299 Type::Named { name, .. } => name.clone(),
3300 _ => continue,
3301 };
3302 let type_methods = env.methods.entry(type_name).or_insert_with(HashMap::new);
3303 for method in &i.ast.methods {
3304 type_methods.insert(method.name.clone(), method.clone());
3305 }
3306 }
3307 crate::types::TypedItem::Use(u) => {
3308 load_module(&mut env, &u.ast)?;
3309 }
3310 _ => {}
3311 }
3312 }
3313
3314 for item in &program.items {
3316 if let crate::types::TypedItem::Test(test) = item {
3317 print!("test {} ... ", test.ast.name);
3318
3319 env.push_scope();
3321
3322 match eval_block(&mut env, &test.ast.body) {
3323 Ok(_) => {
3324 println!("ok");
3325 passed += 1;
3326 }
3327 Err(e) => {
3328 println!("FAILED");
3329 println!(" Error: {}", e);
3330 failed += 1;
3331 }
3332 }
3333
3334 env.pop_scope();
3335 }
3336 }
3337
3338 println!(
3339 "\nTest result: {}. {} passed; {} failed",
3340 if failed == 0 { "ok" } else { "FAILED" },
3341 passed,
3342 failed
3343 );
3344
3345 if failed > 0 {
3346 Err(KainError::runtime("Some tests failed"))
3347 } else {
3348 Ok(())
3349 }
3350}
3351
3352fn poll_future_to_completion(env: &mut Env, future_val: Value) -> KainResult<Value> {
3356 let max_iterations = 100000; let mut iterations = 0;
3358 let current_future = future_val;
3359
3360 loop {
3361 iterations += 1;
3362 if iterations > max_iterations {
3363 return Err(KainError::runtime("Async timeout: future did not complete"));
3364 }
3365
3366 let poll_result = poll_future_once(env, current_future.clone())?;
3367
3368 match extract_poll_result(&poll_result) {
3369 PollState::Ready(val) => return Ok(val),
3370 PollState::Pending => {
3371 std::thread::sleep(std::time::Duration::from_micros(10));
3374 continue;
3375 }
3376 PollState::NotAPoll => {
3377 return Ok(poll_result);
3379 }
3380 }
3381 }
3382}
3383
3384fn poll_future_once(env: &mut Env, future_val: Value) -> KainResult<Value> {
3386 match &future_val {
3387 Value::Future(struct_name, state) => {
3389 let poll_fn_name = format!("{}_poll", struct_name);
3390
3391 if let Some(poll_fn) = env.functions.get(&poll_fn_name).cloned() {
3392 let struct_val = Value::Struct(struct_name.clone(), state.clone());
3394
3395 env.push_scope();
3397 env.define("self".to_string(), struct_val.clone());
3398
3399 if let Some(first_param) = poll_fn.params.first() {
3400 env.define(first_param.name.clone(), struct_val);
3401 }
3402
3403 let result = eval_block(env, &poll_fn.body)?;
3404 env.pop_scope();
3405
3406 let actual_result = match result {
3408 Value::Return(v) => *v,
3409 v => v,
3410 };
3411
3412 Ok(normalize_poll_result(actual_result))
3414 } else {
3415 Ok(Value::Poll(true, Some(Box::new(Value::Unit))))
3417 }
3418 }
3419
3420 Value::Struct(struct_name, _) => {
3422 let poll_fn_name = format!("{}_poll", struct_name);
3423
3424 if let Some(poll_fn) = env.functions.get(&poll_fn_name).cloned() {
3425 env.push_scope();
3427 env.define("self".to_string(), future_val.clone());
3428
3429 if let Some(first_param) = poll_fn.params.first() {
3430 env.define(first_param.name.clone(), future_val.clone());
3431 }
3432
3433 let result = eval_block(env, &poll_fn.body)?;
3434 env.pop_scope();
3435
3436 let actual_result = match result {
3438 Value::Return(v) => *v,
3439 v => v,
3440 };
3441
3442 Ok(normalize_poll_result(actual_result))
3443 } else {
3444 Ok(Value::Poll(true, Some(Box::new(future_val))))
3446 }
3447 }
3448
3449 Value::Poll(_, _) => Ok(future_val),
3451
3452 Value::EnumVariant(enum_name, _, _) if enum_name == "Poll" => {
3454 Ok(normalize_poll_result(future_val))
3455 }
3456
3457 _ => Ok(Value::Poll(true, Some(Box::new(future_val)))),
3459 }
3460}
3461
3462enum PollState {
3464 Ready(Value),
3465 Pending,
3466 NotAPoll,
3467}
3468
3469fn extract_poll_result(val: &Value) -> PollState {
3471 match val {
3472 Value::Poll(true, Some(inner)) => PollState::Ready(*inner.clone()),
3474 Value::Poll(true, None) => PollState::Ready(Value::Unit),
3475 Value::Poll(false, _) => PollState::Pending,
3476
3477 Value::EnumVariant(enum_name, variant, fields) if enum_name == "Poll" => {
3479 match variant.as_str() {
3480 "Ready" => {
3481 if fields.is_empty() {
3482 PollState::Ready(Value::Unit)
3483 } else {
3484 PollState::Ready(fields[0].clone())
3485 }
3486 }
3487 "Pending" => PollState::Pending,
3488 _ => PollState::NotAPoll,
3489 }
3490 }
3491
3492 Value::Struct(name, fields) => {
3494 if name.contains("Ready") {
3495 let fields_guard = fields.read().unwrap();
3496 if let Some(val) = fields_guard
3497 .get("0")
3498 .or(fields_guard.get("value"))
3499 .or(fields_guard.values().next())
3500 {
3501 PollState::Ready(val.clone())
3502 } else {
3503 PollState::Ready(Value::Unit)
3504 }
3505 } else if name.contains("Pending") {
3506 PollState::Pending
3507 } else {
3508 PollState::NotAPoll
3509 }
3510 }
3511
3512 Value::Tuple(elems) if elems.len() >= 1 => {
3514 if let Value::String(tag) = &elems[0] {
3515 match tag.as_str() {
3516 "Ready" if elems.len() >= 2 => PollState::Ready(elems[1].clone()),
3517 "Ready" => PollState::Ready(Value::Unit),
3518 "Pending" => PollState::Pending,
3519 _ => PollState::NotAPoll,
3520 }
3521 } else {
3522 PollState::NotAPoll
3523 }
3524 }
3525
3526 _ => PollState::NotAPoll,
3527 }
3528}
3529
3530fn normalize_poll_result(val: Value) -> Value {
3532 match extract_poll_result(&val) {
3533 PollState::Ready(inner) => Value::Poll(true, Some(Box::new(inner))),
3534 PollState::Pending => Value::Poll(false, None),
3535 PollState::NotAPoll => val, }
3537}