#![allow(clippy::module_inception, clippy::needless_doctest_main)]
extern crate proc_macro;
pub(crate) use self::{error::Error, primitives::*, utils::*};
pub(crate) mod ast;
pub(crate) mod error;
pub(crate) mod handle;
pub(crate) mod ops;
pub(crate) mod utils;
pub(crate) mod autodiff;
pub(crate) mod operator;
use proc_macro::TokenStream;
use syn::parse_macro_input;
#[proc_macro]
pub fn autodiff(input: TokenStream) -> TokenStream {
let expr = parse_macro_input!(input as ast::AutodiffAst);
let result = autodiff::impl_autodiff(&expr);
TokenStream::from(result)
}
#[doc(hidden)]
#[proc_macro_attribute]
pub fn operator(args: TokenStream, item: TokenStream) -> TokenStream {
let mut attrs = ast::operator::OperatorAttr::new();
let op_parser = syn::meta::parser(|meta| attrs.parser(meta));
let _ = parse_macro_input!(args with op_parser);
let item = parse_macro_input!(item as syn::Item);
let ast = ast::OperatorAst::new(Some(dbg!(attrs)), item);
let result = operator::impl_operator(&ast);
TokenStream::from(result)
}
pub(crate) mod kw {
syn::custom_keyword!(eval);
syn::custom_keyword!(grad);
syn::custom_keyword!(cos);
syn::custom_keyword!(exp);
syn::custom_keyword!(ln);
syn::custom_keyword!(sin);
syn::custom_keyword!(tan);
}
#[allow(unused)]
pub(crate) mod primitives {
pub type Result<T = ()> = std::result::Result<T, crate::Error>;
}