hlvm_runtime 0.1.6

The Runtime for the HLVM Library
Documentation
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 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)
}