wlambda/vval_user_obj.rs
1// Copyright (c) 2020-2022 Weird Constructor <weirdconstructor@gmail.com>
2// This is a part of WLambda. See README.md and COPYING for details.
3
4/*!
5
6 Provides a convenience macro for creating OO interfaces from
7 Rust. See `set_vval_method` macro.
8
9*/
10
11/// This macro helps with exporting something with a more OO interface
12/// instead of using a VValUserData trait implementation.
13///
14///```
15/// use wlambda::*;
16/// use wlambda::set_vval_method;
17///
18/// let mut ctx = EvalContext::new_default();
19///
20/// let some_ref = std::rc::Rc::new(std::cell::RefCell::new(10));
21/// let obj = VVal::map();
22///
23/// set_vval_method!(obj, some_ref, get_it, None, None, _env, _argc, {
24/// Ok(VVal::Int(*some_ref.borrow()))
25/// });
26///
27/// ctx.set_global_var("I", &obj);
28///
29/// assert_eq!(ctx.eval("I.get_it[]").unwrap().s(), "10");
30/// *some_ref.borrow_mut() += 11;
31/// assert_eq!(ctx.eval("I.get_it[]").unwrap().s(), "21");
32///```
33#[macro_export]
34macro_rules! set_vval_method {
35 ($vv: expr, $obj: ident, $method: tt, $min: expr, $max: expr, $env: ident, $argc: ident, $b: block) => {
36 {
37 let $obj = $obj.clone();
38 $vv.set_map_key_fun(&stringify!($method).to_string(),
39 move |$env: &mut $crate::Env, $argc: usize| $b, $min, $max, false);
40 }
41 }
42}