1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
use crate::eval::Env; use crate::objects::{Eval, Object, Vtable}; pub fn class_vtable() -> Vtable { Vtable::new("class Time") } pub fn instance_vtable() -> Vtable { let vt = Vtable::new("Time"); vt.add_primitive_method_or_panic("addTime:", time_add_time); vt.add_primitive_method_or_panic("subTime:", time_sub_time); vt.add_primitive_method_or_panic("real", time_real); vt.add_primitive_method_or_panic("system", time_system); vt.add_primitive_method_or_panic("user", time_user); vt } fn time_sub_time(receiver: &Object, args: &[Object], env: &Env) -> Eval { let res = **args[0].time() - **receiver.time(); Ok(env.foo.make_time(res)) } fn time_add_time(receiver: &Object, args: &[Object], env: &Env) -> Eval { let res = **args[0].time() + **receiver.time(); Ok(env.foo.make_time(res)) } fn time_real(receiver: &Object, _args: &[Object], env: &Env) -> Eval { Ok(env.foo.make_float(receiver.time().real)) } fn time_system(receiver: &Object, _args: &[Object], env: &Env) -> Eval { Ok(env.foo.make_float(receiver.time().system)) } fn time_user(receiver: &Object, _args: &[Object], env: &Env) -> Eval { Ok(env.foo.make_float(receiver.time().user)) }