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
#[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(string_to_number(n.to_string()))
}
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)
}
pub fn foreign_function(fun: fn(Value) -> Value) -> Value {
Value::from_foreign_function(fun)
}