diff --git a/src/builtins.rs b/src/builtins.rs index e288944..fb1cb9e 100644 --- a/src/builtins.rs +++ b/src/builtins.rs @@ -221,6 +221,32 @@ impl StrInst { StrInst::create(format!("'{}'", escaped)).into() } + pub(crate) fn to_int(vm: &mut Vm, _state: FunctionState) -> FunctionResult { + let parsed: Result = + with_obj_downcast(vm.frame_stack()[0].clone(), |str_inst: &StrInst| { + str_inst.str_value().parse() + }); + match parsed { + Ok(int) => IntInst::create(int).into(), + // TODO StrInst::to_int - throw an exception when we fail to parse an integer + // BLOCKED-ON - exceptions + Err(e) => todo!("error parsing string to an integer: {}", e), + } + } + + pub(crate) fn to_float(vm: &mut Vm, _state: FunctionState) -> FunctionResult { + let parsed: Result = + with_obj_downcast(vm.frame_stack()[0].clone(), |str_inst: &StrInst| { + str_inst.str_value().parse() + }); + match parsed { + Ok(float) => FloatInst::create(float).into(), + // TODO StrInst::to_int - throw an exception when we fail to parse an integer + // BLOCKED-ON - exceptions + Err(e) => todo!("error parsing string to a float: {}", e), + } + } + pub(crate) fn len(vm: &mut Vm, _state: FunctionState) -> FunctionResult { let len = with_obj_downcast(vm.frame_stack()[0].clone(), |str_inst: &StrInst| { str_inst.str_value().len() as i64 @@ -318,6 +344,15 @@ macro_rules! int_bin_op_logical { } impl IntInst { + pub(crate) fn to_int(_vm: &mut Vm, _state: FunctionState) -> FunctionResult { + FunctionResult::Return + } + + pub(crate) fn to_float(vm: &mut Vm, _state: FunctionState) -> FunctionResult { + let int_value = with_obj_downcast(vm.frame_stack()[0].clone(), IntInst::int_value); + FloatInst::create(int_value as f64).into() + } + int_bin_op_math!(add, +); int_bin_op_math!(sub, -); @@ -428,6 +463,15 @@ macro_rules! float_bin_op_logical { } impl FloatInst { + pub(crate) fn to_int(vm: &mut Vm, _state: FunctionState) -> FunctionResult { + let float_value = with_obj_downcast(vm.frame_stack()[0].clone(), FloatInst::float_value); + IntInst::create(float_value as i64).into() + } + + pub(crate) fn to_float(_vm: &mut Vm, _state: FunctionState) -> FunctionResult { + FunctionResult::Return + } + float_bin_op_math!(add, +); float_bin_op_math!(sub, -); float_bin_op_math!(mul, *); diff --git a/src/obj.rs b/src/obj.rs index 543fb28..2d090c5 100644 --- a/src/obj.rs +++ b/src/obj.rs @@ -118,11 +118,14 @@ pub fn init_types() { base_type: Type, // type definitions Type { - // Method conversion + // Conversion methods to_str => BuiltinFunctionInst::create("to_str", BaseObjInst::to_str, 1), to_repr => BuiltinFunctionInst::create("to_repr", BaseObjInst::to_repr, 1), to_bool => BuiltinFunctionInst::create("to_bool", BaseObjInst::to_bool, 1), + to_int => BuiltinFunctionInst::create("to_int", BaseObjInst::not_implemented_un, 1), + to_float => BuiltinFunctionInst::create("to_float", BaseObjInst::not_implemented_un, 1), len => BuiltinFunctionInst::create("len", BaseObjInst::not_implemented_un, 1), + // Operators __add__ => BuiltinFunctionInst::create("__add__", BaseObjInst::not_implemented_bin, 2), __sub__ => BuiltinFunctionInst::create("__sub__", BaseObjInst::not_implemented_bin, 2), @@ -142,15 +145,23 @@ pub fn init_types() { }, Obj { }, Str { + // Conversion methods to_str => BuiltinFunctionInst::create("to_str", StrInst::to_str, 1), to_repr => BuiltinFunctionInst::create("to_repr", StrInst::to_repr, 1), + to_int => BuiltinFunctionInst::create("to_int", StrInst::to_int, 1), + to_float => BuiltinFunctionInst::create("to_float", StrInst::to_float, 1), len => BuiltinFunctionInst::create("len", StrInst::len, 1), + // Operators __add__ => BuiltinFunctionInst::create("__add__", StrInst::add, 2), __mul__ => BuiltinFunctionInst::create("__mul__", StrInst::mul, 2), // .lower, .upper, .slice, etc }, Int { + // Conversion methods + to_int => BuiltinFunctionInst::create("to_int", IntInst::to_int, 1), + to_float => BuiltinFunctionInst::create("to_float", IntInst::to_float, 1), + // Operators __add__ => BuiltinFunctionInst::create("__add__", IntInst::add, 2), __sub__ => BuiltinFunctionInst::create("__sub__", IntInst::sub, 2), @@ -165,11 +176,15 @@ pub fn init_types() { __neg__ => BuiltinFunctionInst::create("__neg__", IntInst::neg, 1), }, Float { + // Conversion methods + to_int => BuiltinFunctionInst::create("to_int", FloatInst::to_int, 1), + to_float => BuiltinFunctionInst::create("to_float", FloatInst::to_float, 1), + + // Operators __add__ => BuiltinFunctionInst::create("__add__", FloatInst::add, 2), __sub__ => BuiltinFunctionInst::create("__sub__", FloatInst::sub, 2), __mul__ => BuiltinFunctionInst::create("__mul__", FloatInst::mul, 2), __div__ => BuiltinFunctionInst::create("__div__", FloatInst::div, 2), - __gt__ => BuiltinFunctionInst::create("__gt__", FloatInst::gt, 2), __ge__ => BuiltinFunctionInst::create("__ge__", FloatInst::ge, 2), __lt__ => BuiltinFunctionInst::create("__lt__", FloatInst::lt, 2),