2020-10-13 14:07:22 -07:00
|
|
|
use crate::{obj::{prelude::*, reserved::*}, vm::{error::*, signal::*}};
|
2020-10-07 17:21:01 -07:00
|
|
|
use maplit::btreemap;
|
|
|
|
|
use once_cell::sync::Lazy;
|
|
|
|
|
use std::collections::BTreeMap;
|
|
|
|
|
|
2020-10-13 14:07:22 -07:00
|
|
|
pub static PRINTLN_BUILTIN_FUN: Lazy<NativeFunRef> = Lazy::new(|| NativeFun::new_obj(1, |_, vm, args| {
|
2020-10-07 17:21:01 -07:00
|
|
|
// 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)
|
2020-10-13 14:07:22 -07:00
|
|
|
.ok_or(Error::MissingAttr { attr: STR_MEMBER_NAME.sym })?
|
2020-10-07 17:21:01 -07:00
|
|
|
};
|
2020-10-13 14:07:22 -07:00
|
|
|
let return_value = vm.call(to_string, vec![])?;
|
2020-10-07 17:21:01 -07:00
|
|
|
{
|
2020-10-08 16:10:10 -07:00
|
|
|
read_obj!(let str_obj = return_value);
|
2020-10-13 14:07:22 -07:00
|
|
|
let str_obj: &Str = str_obj.as_any().downcast_ref()
|
2020-10-19 16:41:57 -07:00
|
|
|
.ok_or_else(|| Error::ValueError { error: "expected str value".to_string(), })?;
|
2020-10-07 17:21:01 -07:00
|
|
|
println!("{}", str_obj.value());
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-08 16:10:10 -07:00
|
|
|
vm.push(NIL_NAME.sym_ref());
|
2020-10-13 14:07:22 -07:00
|
|
|
Ok(Signal::Return)
|
2020-10-07 17:21:01 -07:00
|
|
|
}));
|
|
|
|
|
|
2020-10-13 14:07:22 -07:00
|
|
|
pub static PRINT_BUILTIN_FUN: Lazy<NativeFunRef> = Lazy::new(|| NativeFun::new_obj(1, |_, vm, args| {
|
2020-10-07 17:21:01 -07:00
|
|
|
// 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)
|
2020-10-13 14:07:22 -07:00
|
|
|
.ok_or(Error::MissingAttr { attr: STR_MEMBER_NAME.sym })?
|
2020-10-07 17:21:01 -07:00
|
|
|
};
|
2020-10-13 14:07:22 -07:00
|
|
|
let return_value = vm.call(to_string, vec![])?;
|
2020-10-07 17:21:01 -07:00
|
|
|
{
|
2020-10-08 16:10:10 -07:00
|
|
|
read_obj!(let str_obj = return_value);
|
2020-10-13 14:07:22 -07:00
|
|
|
let str_obj: &Str = str_obj.as_any().downcast_ref()
|
2020-10-19 16:41:57 -07:00
|
|
|
.ok_or_else(|| Error::ValueError { error: "expected str value".to_string(), })?;
|
2020-10-07 17:21:01 -07:00
|
|
|
print!("{}", str_obj.value());
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-13 14:07:22 -07:00
|
|
|
vm.push(NIL_NAME.sym_ref());
|
|
|
|
|
Ok(Signal::Return)
|
2020-10-07 17:21:01 -07:00
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
pub static BUILTIN_OBJS: Lazy<BTreeMap<Sym, ObjRef>> = Lazy::new(|| btreemap! {
|
|
|
|
|
PRINTLN_BUILTIN_NAME.sym => PRINTLN_BUILTIN_FUN.clone() as _,
|
|
|
|
|
PRINT_BUILTIN_NAME.sym => PRINT_BUILTIN_FUN.clone() as _,
|
|
|
|
|
});
|