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}