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