1extern crate proc_macro;
9
10pub(crate) use self::{error::Error, primitives::*, utils::*};
11
12pub(crate) mod ast;
13pub(crate) mod error;
14pub(crate) mod handle;
15pub(crate) mod ops;
16pub(crate) mod utils;
17
18pub(crate) mod autodiff;
19pub(crate) mod operator;
20
21use proc_macro::TokenStream;
22use syn::parse_macro_input;
23
24#[proc_macro]
61pub fn autodiff(input: TokenStream) -> TokenStream {
62 let expr = parse_macro_input!(input as ast::AutodiffAst);
64
65 let result = autodiff::impl_autodiff(&expr);
67
68 TokenStream::from(result)
70}
71
72#[doc(hidden)]
73#[proc_macro_attribute]
74pub fn operator(args: TokenStream, item: TokenStream) -> TokenStream {
75 let mut attrs = ast::operator::OperatorAttr::new();
76 let op_parser = syn::meta::parser(|meta| attrs.parser(meta));
77 let _ = parse_macro_input!(args with op_parser);
78 let item = parse_macro_input!(item as syn::Item);
79 let ast = ast::OperatorAst::new(Some(attrs), item);
80 let result = operator::impl_operator(&ast);
81 TokenStream::from(result)
82}
83
84pub(crate) mod kw {
85 syn::custom_keyword!(eval);
86 syn::custom_keyword!(grad);
87
88 syn::custom_keyword!(cos);
89 syn::custom_keyword!(exp);
90 syn::custom_keyword!(ln);
91 syn::custom_keyword!(sin);
92 syn::custom_keyword!(tan);
93}
94
95pub(crate) mod primitives {
96 pub type Result<T = ()> = std::result::Result<T, crate::Error>;
97 pub type BoxError = Box<dyn std::error::Error>;
98}