use orchid_base::sym; use orchid_extension::gen_expr::{call, new_atom}; use orchid_extension::tree::{GenMember, fun, prefix}; use orchid_extension::{TAtom, exec}; use crate::macros::mactree::MacTree; use crate::macros::resolve::resolve; use crate::macros::utils::{build_macro, mactree, mactreev}; use crate::{HomoTpl, UntypedTuple}; pub async fn gen_macro_lib() -> Vec { prefix("macros", [ fun(true, "resolve", async |tpl: TAtom| resolve(tpl.own().await).await), prefix("common", [ build_macro(None, ["..", "_", "="]).finish(), build_macro(Some(1), ["+"]) .rule(mactreev!("...$" lhs 1 macros::common::+ "...$" rhs 0), [async |[lhs, rhs]| { call(sym!(std::ops::add::resolve), (resolve(lhs).await, resolve(rhs).await)).await }]) .finish(), build_macro(Some(1), ["-"]) .rule(mactreev!("...$" lhs 1 macros::common::- "...$" rhs 0), [async |[lhs, rhs]| { call(sym!(std::ops::sub::resolve), (resolve(lhs).await, resolve(rhs).await)).await }]) .finish(), build_macro(Some(2), ["*"]) .rule(mactreev!("...$" lhs 1 macros::common::* "...$" rhs 0), [async |[lhs, rhs]| { call(sym!(std::ops::mul::resolve), (resolve(lhs).await, resolve(rhs).await)).await }]) .finish(), build_macro(Some(2), ["/"]) .rule(mactreev!("...$" lhs 1 macros::common::/ "...$" rhs 0), [async |[lhs, rhs]| { call(sym!(std::ops::div::resolve), (resolve(lhs).await, resolve(rhs).await)).await }]) .finish(), build_macro(Some(2), ["%"]) .rule(mactreev!("...$" lhs 1 macros::common::% "...$" rhs 0), [async |[lhs, rhs]| { call(sym!(std::ops::mod::resolve), (resolve(lhs).await, resolve(rhs).await)).await }]) .finish(), build_macro(Some(3), ["."]) .rule(mactreev!("...$" lhs 1 macros::common::. "...$" rhs 0), [async |[lhs, rhs]| { call(sym!(std::ops::get::resolve), (resolve(lhs).await, resolve(rhs).await)).await }]) .finish(), build_macro(None, ["comma_list", ","]) .rule( mactreev!(macros::common::comma_list ( "...$" head 0 macros::common::, "...$" tail 1)), [async |[head, tail]| { exec(async |mut h| { let recur = resolve(mactree!(macros::common::comma_list "push" tail ;)).await; let mut tail = h.exec::>>(recur).await?; tail.0.insert(0, h.exec(new_atom(head)).await?); Ok(tail) }) .await }], ) .rule(mactreev!(macros::common::comma_list ( "...$" final_tail 0 )), [async |[tail]| { HomoTpl(vec![new_atom(tail)]) }]) .rule(mactreev!(macros::common::comma_list()), [async |[]| UntypedTuple(Vec::new())]) .finish(), build_macro(None, ["semi_list", ";"]) .rule( mactreev!(macros::common::semi_list ( "...$" head 0 macros::common::; "...$" tail 1)), [async |[head, tail]| { exec(async |mut h| { let recur = resolve(mactree!(macros::common::semi_list "push" tail ;)).await; let mut tail = h.exec::>>(recur).await?; tail.0.insert(0, h.exec(new_atom(head)).await?); Ok(tail) }) .await }], ) .rule(mactreev!(macros::common::semi_list ( "...$" final_tail 0 )), [async |[tail]| { HomoTpl(vec![new_atom(tail)]) }]) .rule(mactreev!(macros::common::semi_list()), [async |[]| UntypedTuple(Vec::new())]) .finish(), ]), ]) }