#[macro_export]
macro_rules! decl_jl {
{
pub extern "Julia" fn $lib:ident :: $name:ident ( $( $arg:ident : $type:ty ),* ) -> $out:ty;
} => {
concat!(
"function ", stringify!($name), "(", $( stringify!($arg), "::", stringify!($type), ", ", )* ")\n",
" ccall((:", stringify!($name), ", \"", stringify!($lib), "\"), ", stringify!($out),
", (", $( stringify!($type), ",", )* "), ", $( stringify!($arg), ",", )* ")\n",
"end"
)
};
{
$(
pub extern "Julia" fn $lib:ident :: $name:ident ( $( $arg:ident : $type:ty ),* ) -> $out:ty;
)*
} => {
vec![
$(
decl_jl! { pub extern "Julia" fn $lib:ident :: $name:ident ( $( $arg:ident : $type:ty ),* ) -> $out:ty; }
),*
]
}
}
#[macro_export]
macro_rules! extern_jl {
{
extern "Julia" $lib:ident :: $struct:ident {
$(
pub fn $name:ident ( $( $arg:ident : $type:ty ),* ) -> $out:ty $body:block
)*
}
} => {
$(
#[no_mangle]
pub extern "C" fn $name ( $( $arg : $type ),* ) -> $out $body
)*
struct $struct {
$(
pub $name: &'static str,
)*
}
impl $struct {
pub fn new() -> $struct {
$struct {
$(
$name: decl_jl! {
pub extern "Julia" fn $lib :: $name ( $( $arg : $type ),* ) -> $out;
},
)*
}
}
pub fn decl(self, jl: &mut $crate::api::Julia) -> $crate::error::Result<$crate::api::Value> {
let mut decl = String::new();
$(
decl.push_str(self.$name);
)*
jl.load(&mut decl.as_bytes(), Some(concat!( "jl-decl-", stringify!($lib), ".jl" )))
}
}
}
}