#[macro_export]
macro_rules! define_semantics {
( $domain:ty;
$($rest:tt)*
// $($string:literal = ($fname:ident, $ty:literal) ),*
) => {
lazy_static::lazy_static! {
static ref DSL_ENTRIES: $crate::DSL<$domain> = {
#[allow(clippy::vec_init_then_push)]
{
let mut entries = vec![];
dsl_entries!{$domain; entries; $($rest)*};
DSL::new(entries)
}
};
static ref LOOKUP_FN_PTR: HashMap<Symbol,$crate::DSLFn<$domain>> = {
let mut entries = HashMap::new();
fn_ptr_entries!{$domain; entries; $($rest)*};
entries
};
}
}
}
#[macro_export]
macro_rules! dsl_entries {
( $domain:ty; $entries:ident; ) => {
};
( $domain:ty; $entries:ident;
$string:literal = ($fname:ident, $ty:literal),
$($rest:tt)*
) => {
$entries.push($crate::DSLEntry::new(
$string.into(), PrimFun(CurriedFn::<$domain>::new($string.into(), $ty.parse::<Type>().unwrap().arity())), $ty.parse().unwrap() ));
dsl_entries!{$domain; $entries; $($rest)*};
};
( $domain:ty; $entries:ident;
$string:literal = $ty:literal,
$($rest:tt)*
) => {
$entries.push($crate::DSLEntry::new(
$string.into(), <$domain>::val_of_prim_fallback($string.into()).unwrap(), $ty.parse().unwrap() ));
dsl_entries!($domain; $entries; $($rest)*);
}
}
#[macro_export]
macro_rules! fn_ptr_entries {
( $domain:ty; $entries:ident; ) => {
};
( $domain:ty; $entries:ident;
$string:literal = ($fname:ident, $ty:literal),
$($rest:tt)*
) => {
$entries.insert(
$string.into(), $fname as $crate::DSLFn<$domain> );
fn_ptr_entries!($domain; $entries; $($rest)*);
};
( $domain:ty; $entries:ident;
$string:literal = $ty:literal,
$($rest:tt)*
) => {
fn_ptr_entries!($domain; $entries; $($rest)*);
}
}
#[macro_export]
macro_rules! dsl_entries_lookup_gen {
(
) => {
fn lookup_fn_ptr(p: Symbol) -> DSLFn {
*LOOKUP_FN_PTR.get(&p).unwrap()
}
fn dsl_entry(p: Symbol) -> Option<&'static DSLEntry<Self>> {
DSL_ENTRIES.entries.get(&p)
}
fn dsl_entries() -> std::collections::hash_map::Values<'static, Symbol, DSLEntry<Self>> {
DSL_ENTRIES.entries.values()
}
}
}
#[macro_export]
macro_rules! load_args {
( $handle: expr,
$args:expr,
$($name:ident : $type:ty ),*
) => {
use $crate::eval::FromVal;
$(let $name:$type = <$type>::from_val($args.remove(0).eval($handle)?)?;)*
}
}
#[macro_export]
macro_rules! load_args_lazy {
( $args:expr,
$($name:ident : $type:ty ),*
) => {
$(let mut $name:$type = $args.remove(0).into();)*
}
}