use crate::{obj::{prelude::*, reserved::*}, vm::{error::*, signal::*}}; use maplit::btreemap; use once_cell::sync::Lazy; use std::collections::BTreeMap; pub static PRINTLN_BUILTIN_FUN: Lazy = Lazy::new(|| NativeFun::new_obj(1, |_, vm, args| { // TODO : use __get_attr__ when it gets added let to_string = { let obj_ref = &args[0]; read_obj!(let obj = obj_ref); obj.get_attr(STR_MEMBER_NAME.sym) .ok_or(Error::MissingAttr { attr: STR_MEMBER_NAME.sym })? }; let return_value = vm.call(to_string, vec![])?; { read_obj!(let str_obj = return_value); let str_obj: &Str = str_obj.as_any().downcast_ref() .ok_or_else(|| Error::ValueError { error: "expected str value".to_string(), })?; println!("{}", str_obj.value()); } vm.push(NIL_NAME.sym_ref()); Ok(Signal::Return) })); pub static PRINT_BUILTIN_FUN: Lazy = Lazy::new(|| NativeFun::new_obj(1, |_, vm, args| { // TODO : use __get_attr__ when it gets added let to_string = { let obj_ref = &args[0]; read_obj!(let obj = obj_ref); obj.get_attr(STR_MEMBER_NAME.sym) .ok_or(Error::MissingAttr { attr: STR_MEMBER_NAME.sym })? }; let return_value = vm.call(to_string, vec![])?; { read_obj!(let str_obj = return_value); let str_obj: &Str = str_obj.as_any().downcast_ref() .ok_or_else(|| Error::ValueError { error: "expected str value".to_string(), })?; print!("{}", str_obj.value()); } vm.push(NIL_NAME.sym_ref()); Ok(Signal::Return) })); pub static BUILTIN_OBJS: Lazy> = Lazy::new(|| btreemap! { PRINTLN_BUILTIN_NAME.sym => PRINTLN_BUILTIN_FUN.clone() as _, PRINT_BUILTIN_NAME.sym => PRINT_BUILTIN_FUN.clone() as _, });