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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
use bigdecimal::*;
#[allow(unused_imports)]
use std::str::FromStr;
use crate::value::*;
use crate::object::*;

#[allow(unused_macros)]
#[macro_export] macro_rules! inline_foreign_function {
    ($input:ident, $body:block) => (
        Value::from_foreign_function(
            |$input| $body
        )
    )
}

#[allow(unused_macros)]
#[macro_export] macro_rules! wrap_foreign_function {
    ($function:expr) => (
        Value::from_foreign_function(
            |input: Value| {$function(input)}
        )
    )
}

#[allow(unused_macros)]
#[macro_export] macro_rules! __obj {
    ($object:ident, $name:meta~$value:expr) => (
        $object.set_attr(stringify!($name).to_string(), $value)
    );

    ($object:ident, $name:meta~$value:expr, $($pass_name:meta~$pass_value:expr),+) => (
        $object.set_attr(stringify!($name).to_string(), $value);
        __obj!($object, $($pass_name~$pass_value),+)
    )
}

#[allow(unused_macros)]
#[macro_export]
macro_rules! obj {
    ($($name:meta~$value:expr),+) => (
        (|| {
            let mut value = Value::new(Type::Instance, NOTHING.to_vec());
            __obj!(
                value, $($name~$value),+
            );
            return value
        })()
    )
}

pub fn empty_obj() -> Value {
    Value::new(Type::Instance, NOTHING.to_vec())
}

pub fn string(s: &str) -> Value {
    Value::from_str(s)
}

pub fn num(n: &str) -> Value {
    Value::from_number(BigDecimal::from_str(n).unwrap())
}

pub fn none() -> Value {
    Value::from_nothing()
}

pub fn list(arr: &[Value]) -> Value {
    Value::from_vector(arr.to_vec())
}

pub fn fun(arr: &[Value]) -> Value {
    Value::from_function(arr.to_vec())
}

pub fn ins(i: Instruction) -> Value {
    Value::from_instruction(i)
}


// #[allow(unused_macros)]
// #[macro_export] macro_rules! wrap_foreign_function {
//     ($function:expr) => (
//         Value::from_foreign_function(
//             |input: Value| {$function(input)}
//         )
//     )
// }

pub fn foreign_function(fun: fn(Value) -> Value) -> Value {
    Value::from_foreign_function(fun)
}