1#[allow(unused_imports)]
2use std::str::FromStr;
3use crate::value::*;
4use crate::object::*;
5
6#[allow(unused_macros)]
7#[macro_export] macro_rules! inline_foreign_function {
8 ($input:ident, $body:block) => (
9 Value::from_foreign_function(
10 |$input| $body
11 )
12 )
13}
14
15#[allow(unused_macros)]
16#[macro_export] macro_rules! wrap_foreign_function {
17 ($function:expr) => (
18 Value::from_foreign_function(
19 |input: Value| {$function(input)}
20 )
21 )
22}
23
24#[allow(unused_macros)]
25#[macro_export] macro_rules! __obj {
26 ($object:ident, $name:meta~$value:expr) => (
27 $object.set_attr(stringify!($name).to_string(), $value)
28 );
29
30 ($object:ident, $name:meta~$value:expr, $($pass_name:meta~$pass_value:expr),+) => (
31 $object.set_attr(stringify!($name).to_string(), $value);
32 __obj!($object, $($pass_name~$pass_value),+)
33 )
34}
35
36#[allow(unused_macros)]
37#[macro_export]
38macro_rules! obj {
39 ($($name:meta~$value:expr),+) => (
40 (|| {
41 let mut value = Value::new(Type::Instance, NOTHING.to_vec());
42 __obj!(
43 value, $($name~$value),+
44 );
45 return value
46 })()
47 )
48}
49
50pub fn empty_obj() -> Value {
51 Value::new(Type::Instance, NOTHING.to_vec())
52}
53
54pub fn string(s: &str) -> Value {
55 Value::from_str(s)
56}
57
58pub fn num(n: &str) -> Value {
59 Value::from_number(string_to_number(n.to_string()))
60}
61
62pub fn none() -> Value {
63 Value::from_nothing()
64}
65
66pub fn list(arr: &[Value]) -> Value {
67 Value::from_vector(arr.to_vec())
68}
69
70pub fn fun(arr: &[Value]) -> Value {
71 Value::from_function(arr.to_vec())
72}
73
74pub fn ins(i: Instruction) -> Value {
75 Value::from_instruction(i)
76}
77
78
79pub fn foreign_function(fun: fn(Value) -> Value) -> Value {
89 Value::from_foreign_function(fun)
90}