Skip to main content

kain/
runtime.rs

1//! KAIN Runtime - Interpreter and actor system
2
3use 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    // Fallback string representation
36    Ok(Value::String(format!("{}", obj)))
37}
38
39/// Runtime VDOM Node
40#[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/// Runtime value
51#[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    /// Special value for return flow control
66    Return(Box<Value>),
67    /// Break from loop with optional value
68    Break(Option<Box<Value>>),
69    /// Continue to next loop iteration
70    Continue,
71    /// Result: Ok(true, val) or Err(false, val)
72    Result(bool, Box<Value>),
73    /// Closure: params, body, captured_scopes
74    Closure(Vec<String>, Box<Expr>, Vec<HashMap<String, Value>>),
75    /// Struct Constructor: name, field_names
76    StructConstructor(String, Vec<String>),
77    /// JSX Element
78    JSX(VNode),
79    /// Enum variant: (enum_name, variant_name, fields)
80    EnumVariant(String, String, Vec<Value>),
81    /// Poll result for async: Ready(value) or Pending
82    Poll(bool, Option<Box<Value>>),
83    /// Future state machine: (struct_name, state_struct, poll_fn_name)
84    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/// Reference to an actor
249#[derive(Debug, Clone)]
250pub struct ActorRef {
251    pub id: u64,
252    pub sender: Sender<Message>,
253}
254
255/// Message for actor communication
256#[derive(Debug, Clone)]
257pub struct Message {
258    pub name: String,
259    pub args: Vec<Value>,
260}
261
262/// Interpreter environment
263#[derive(Clone)]
264pub struct Env {
265    scopes: Vec<HashMap<String, Value>>,
266    functions: HashMap<String, Function>,
267    components: HashMap<String, Component>,
268    /// Methods: type_name -> method_name -> function
269    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    /// ID of the current actor if running inside one
276    self_actor_id: Option<u64>,
277    /// Python global scope
278    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        // Initialize Python scope
296        Python::with_gil(|py| {
297            // Use the same dict for both globals and locals to maintain scope
298            let scope = PyDict::new(py);
299            // Import builtins into the scope
300            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        // === HTTP Operations ===
342        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) // Should match
430                        }
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)), // Fallback
485                }
486            }
487
488            Ok(Value::String(to_json(&args[0]).to_string()))
489        });
490    }
491
492    pub fn register_stdlib(&mut self) {
493        // Register built-in constants
494        self.define("None".to_string(), Value::None);
495        self.define("none".to_string(), Value::None); // Also lowercase for convenience
496
497        // Some is just an identity function - returns its argument
498        // This lets code use Some(value) pattern even though we don't have proper Option types
499        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        // Register built-in functions
507        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        // Math functions
523        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        // Random
568        self.define_native("random", |_env, _args| {
569            // Simple LCG for deterministic behavior in prototype
570            // In real impl use rand crate
571            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        // Collections
594        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        // ord: get ASCII/Unicode code of first character
606        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        // chr: convert code to character
623        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        // Range
685        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        // Array Utils
703        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        // === Type checks ===
780        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        // Get the variant name of an enum (e.g., "Int" from Expr::Int(42))
812        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())), // Not an enum variant
819            }
820        });
821
822        // Get a field from an enum variant by index (0-based)
823        // Example: variant_field(Expr::Binary(left, op, right), 0) returns left
824        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                        // Auto-unwrap Box values (Struct "Box" with field "0")
839                        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                        // Auto-unwrap Box::new(...) pattern (EnumVariant "Box" / "new")
848                        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        // === Result / Error Handling ===
911        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        // === Higher-Order Functions ===
951        // Note: These need special handling since they take closures
952        // We'll register them but they need to be called via call_function
953        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        // === File I/O ===
1043        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        // === String Functions ===
1092        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            // Handle empty delimiter specially - split into individual characters
1111            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                    // Support array.contains(element) for various types
1179                    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        // === Actor System ===
1314
1315        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        // === Utility Functions ===
1357        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        // Debug
1417        self.define_native("dbg", |_env, args| {
1418            for arg in args {
1419                println!("[DEBUG] {:?}", arg);
1420            }
1421            Ok(Value::Unit)
1422        });
1423
1424        // Conversion
1425        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        // Alias for str
1464        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        // Legacy helpers
1488        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        // === Math ===
1505        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        // === I/O ===
1550        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        // Python FFI
1559        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                // Use scope as both globals and locals for proper persistence
1573                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                // Use scope as both globals and locals for proper persistence
1595                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                // Add module to locals with its name
1619                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        // === ASYNC RUNTIME ===
1639
1640        // block_on: Run a future to completion, blocking the current thread
1641        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        // spawn_task: Spawn an async task (runs it immediately in this simple executor)
1651        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            // For this simple executor, spawn is just block_on
1659            // A real executor would add to a task queue
1660            let future_val = args[0].clone();
1661            poll_future_to_completion(env, future_val)
1662        });
1663
1664        // poll_once: Poll a future once and return the Poll result
1665        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        // is_ready: Check if a Poll value is Ready
1676        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        // is_pending: Check if a Poll value is Pending
1689        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        // unwrap_ready: Extract the value from Poll::Ready, panic if Pending
1702        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
1764// === Evaluator ===
1765
1766/// Interpret the program
1767pub fn interpret(program: &TypedProgram) -> KainResult<Value> {
1768    let mut env = Env::new();
1769
1770    // Register functions
1771    for item in &program.items {
1772        match item {
1773            crate::types::TypedItem::Use(u) => {
1774                // Handle imports first
1775                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                // Get the type name
1793                let type_name = match &i.ast.target_type {
1794                    Type::Named { name, .. } => name.clone(),
1795                    _ => continue,
1796                };
1797                // Register all methods for this type
1798                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(_) => {} // Already evaluated
1804            _ => {}
1805        }
1806    }
1807
1808    // Find and run main
1809    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    // Check if it's core stdlib (already loaded)
1820    if path == "stdlib" {
1821        return Ok(());
1822    }
1823
1824    // Check for stdlib submodules: std/option, std/hashmap, std/result
1825    let file_path = if path.starts_with("std/") || path.starts_with("stdlib/") {
1826        // Look in the stdlib directory relative to the executable or crate root
1827        let module_name = path
1828            .trim_start_matches("std/")
1829            .trim_start_matches("stdlib/");
1830
1831        // Try multiple locations for stdlib
1832        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        // Regular file path - try multiple locations
1847        let base_path = std::path::Path::new(&path);
1848
1849        // Try various locations in order
1850        let possible_paths = [
1851            base_path.with_extension("kn"), // ./compiler/lexer.kn
1852            std::path::PathBuf::from(format!("src/{}.kn", path)), // src/compiler/lexer.kn
1853            std::path::PathBuf::from(format!("{}.kn", path)), // compiler/lexer.kn
1854            base_path.with_extension("god"), // legacy .god extension
1855        ];
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    // Register items
1882    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                // Register enum variants as constructors
1900                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                    // First, collect lowered function registrations
1918                    let lowered_fns: Vec<(String, Function)> = i
1919                        .methods
1920                        .iter()
1921                        .map(|m| (format!("{}_{}", name, m.name), m.clone()))
1922                        .collect();
1923
1924                    // Register lowered functions
1925                    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                    // Then register methods
1931                    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        // Propagate control flow up
1951        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            // Propagate control flow
1964            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            // Simple binding
1981            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            // Handle method call: obj.method(args)
2145            let obj_val = eval_expr(env, receiver)?;
2146            if let Value::Return(_) = obj_val {
2147                return Ok(obj_val);
2148            }
2149
2150            // Evaluate arguments
2151            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                // Struct methods: StructName_method(obj, args)
2162                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                        // Call function with self as first argument
2167                        env.push_scope();
2168                        env.define("self".to_string(), obj_val);
2169
2170                        // Bind other params
2171                        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                // Native Type Methods (e.g. Array.push, String.len)
2209                Value::Array(_) => {
2210                    // Map common array methods to native functions
2211                    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            // Special case: Handle Type.method() or obj.method() calls
2246            if let Expr::Field { object, field, .. } = callee.as_ref() {
2247                // Check if this is a type-level static method call like RNG.new()
2248                if let Expr::Ident(type_name, _) = object.as_ref() {
2249                    // Check if it's a type with methods - clone to avoid borrow issues
2250                    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                        // Evaluate arguments
2258                        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                        // Call the static method
2268                        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                // Check if this is an instance method call like obj.method()
2283                let obj_val = eval_expr(env, object)?;
2284                if let Value::Return(_) = obj_val {
2285                    return Ok(obj_val);
2286                }
2287
2288                // Get the type name from the value
2289                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                    // Clone method to avoid borrow issues
2296                    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                        // Evaluate arguments
2304                        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                        // Call the instance method with `self` bound
2314                        env.push_scope();
2315                        env.define("self".to_string(), obj_val);
2316
2317                        // Skip 'self' parameter if present in method definition
2318                        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            // Normal function call
2343            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            // Evaluate arguments
2352            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            // If no match, check if it's exhaustive or return unit?
2418            Ok(Value::Unit)
2419        }
2420
2421        Expr::MacroCall { name, args, .. } => {
2422            // Built-in macros
2423            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                    // TODO: proper format
2437                    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        // Structure creation
2594        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        // JSX
2610        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                    // Check if it's the current actor (self)
2628                    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                    // Allow accessing actor fields? For now maybe just id
2637                    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            // Find actor definition
2663            let actor_def = env
2664                .actor_defs
2665                .get(actor)
2666                .cloned()
2667                .ok_or_else(|| KainError::runtime(format!("Unknown actor: {}", actor)))?;
2668
2669            // Evaluate init expressions
2670            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            // Create channel
2680            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            // Spawn thread
2687            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                // Initialize Python scope
2709                Python::with_gil(|py| {
2710                    // Use the same dict for both globals and locals to maintain scope
2711                    let scope = PyDict::new(py);
2712                    // Import builtins into the scope
2713                    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(); // Actor scope
2721
2722                // Define self
2723                let actor_val = Value::ActorRef(ActorRef {
2724                    id,
2725                    sender: self_sender,
2726                });
2727                actor_env.define("self".to_string(), actor_val);
2728
2729                // Initialize state
2730                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                        // Evaluate default value
2735                        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                // Event loop
2746                while let Ok(msg) = rx.recv() {
2747                    // Find handler
2748                    let mut handled = false;
2749                    for handler in &actor_def.handlers {
2750                        if handler.message_type == msg.name {
2751                            // Run handler
2752                            actor_env.push_scope();
2753                            // Bind params by position
2754                            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        // Block expression: { stmts }
2811        Expr::Block(block, _) => eval_block(env, block),
2812
2813        // Return expression in expression context
2814        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        // Await expression: await future_expr
2826        // Uses the async runtime to poll the future to completion
2827        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            // Use the async runtime to poll to completion
2834            poll_future_to_completion(env, future_val)
2835        }
2836
2837        // OR static method call: TypeName::method(args)
2838        Expr::EnumVariant {
2839            enum_name,
2840            variant,
2841            fields,
2842            ..
2843        } => {
2844            // First, check if this is a static method call
2845            // Check if enum_name is a type with methods and variant is a method name
2846            if let Some(type_methods) = env.methods.get(enum_name).cloned() {
2847                if let Some(method) = type_methods.get(variant).cloned() {
2848                    // This is a static method call like Lexer::new(source)
2849                    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                    // Call the static method
2876                    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            // Check for lowered function name: Type_method (from monomorphization)
2891            let lowered_name = format!("{}_{}", enum_name, variant);
2892            if let Some(func) = env.functions.get(&lowered_name).cloned() {
2893                // This is a lowered method call (Type_method from monomorphization)
2894                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                // Call the lowered function
2921                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            // Not a static method call - proceed with enum variant construction
2935            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            // Special case: Poll enum gets native representation
2962            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            // Restore captured scope + new scope
3044            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        // Float comparisons
3103        (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        // Error on mismatch unless one is Any?
3128        _ => 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
3270/// Run all tests in the program
3271pub fn run_tests(program: &TypedProgram) -> KainResult<()> {
3272    println!("\n Running Tests...\n");
3273    let mut passed = 0;
3274    let mut failed = 0;
3275
3276    // Initialize env
3277    let mut env = Env::new();
3278
3279    // Register items first (functions, etc.)
3280    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                // Also define in scope for lookup
3285                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    // Run tests
3315    for item in &program.items {
3316        if let crate::types::TypedItem::Test(test) = item {
3317            print!("test {} ... ", test.ast.name);
3318
3319            // Isolate test scope
3320            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
3352// === ASYNC RUNTIME HELPERS ===
3353
3354/// Poll a future repeatedly until it returns Ready
3355fn poll_future_to_completion(env: &mut Env, future_val: Value) -> KainResult<Value> {
3356    let max_iterations = 100000; // Prevent infinite loops
3357    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                // In a real async runtime, we'd yield to other tasks here
3372                // For now, just continue polling (cooperative busy-wait)
3373                std::thread::sleep(std::time::Duration::from_micros(10));
3374                continue;
3375            }
3376            PollState::NotAPoll => {
3377                // Not a recognizable poll result - return as-is (might be already resolved)
3378                return Ok(poll_result);
3379            }
3380        }
3381    }
3382}
3383
3384/// Poll a future exactly once and return the Poll result
3385fn poll_future_once(env: &mut Env, future_val: Value) -> KainResult<Value> {
3386    match &future_val {
3387        // Handle Future struct (from async fn transformation)
3388        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                // Create a temporary struct value from the state
3393                let struct_val = Value::Struct(struct_name.clone(), state.clone());
3394
3395                // Call poll function with self parameter
3396                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                // Unwrap Value::Return if present
3407                let actual_result = match result {
3408                    Value::Return(v) => *v,
3409                    v => v,
3410                };
3411
3412                // Normalize the result to our Poll representation
3413                Ok(normalize_poll_result(actual_result))
3414            } else {
3415                // No poll function - treat as immediately ready with unit
3416                Ok(Value::Poll(true, Some(Box::new(Value::Unit))))
3417            }
3418        }
3419
3420        // Handle plain struct that might be a future
3421        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                // Call poll with the future as self
3426                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                // Unwrap Value::Return if present
3437                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                // No poll function - might be an already-resolved value
3445                Ok(Value::Poll(true, Some(Box::new(future_val))))
3446            }
3447        }
3448
3449        // Already a Poll value - return as-is
3450        Value::Poll(_, _) => Ok(future_val),
3451
3452        // EnumVariant that might be Poll::Ready or Poll::Pending
3453        Value::EnumVariant(enum_name, _, _) if enum_name == "Poll" => {
3454            Ok(normalize_poll_result(future_val))
3455        }
3456
3457        // Non-future value - treat as immediately ready
3458        _ => Ok(Value::Poll(true, Some(Box::new(future_val)))),
3459    }
3460}
3461
3462/// Internal enum for poll state extraction
3463enum PollState {
3464    Ready(Value),
3465    Pending,
3466    NotAPoll,
3467}
3468
3469/// Extract the poll state from a value
3470fn extract_poll_result(val: &Value) -> PollState {
3471    match val {
3472        // Native Poll value
3473        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        // EnumVariant style Poll::Ready/Poll::Pending
3478        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        // Struct-based Poll (struct Poll_Ready { value: T } or struct Poll_Pending {})
3493        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        // Tuple style: ("Ready", value) or ("Pending",)
3513        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
3530/// Normalize various poll representations to our standard Value::Poll
3531fn 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, // Keep as-is
3536    }
3537}