use never::Never; use orchid_base::name::Sym; use orchid_base::reqnot::Receipt; use orchid_base::sym; use orchid_extension::atom::{AtomDynfo, AtomicFeatures}; use orchid_extension::context::i; use orchid_extension::entrypoint::ExtReq; use orchid_extension::lexer::LexerObj; use orchid_extension::other_system::SystemHandle; use orchid_extension::parser::ParserObj; use orchid_extension::system::{System, SystemCard}; use orchid_extension::system_ctor::SystemCtor; use orchid_extension::tree::{GenMember, merge_trivial}; use crate::macros::instantiate_tpl::InstantiateTplCall; use crate::macros::let_line::LetLine; use crate::macros::macro_lib::gen_macro_lib; use crate::macros::macro_line::MacroLine; use crate::macros::macro_value::Macro; use crate::macros::mactree_lexer::MacTreeLexer; use crate::macros::match_macros::{MatcherAtom, gen_match_macro_lib}; use crate::macros::ph_lexer::{PhAtom, PhLexer}; use crate::macros::std_macros::gen_std_macro_lib; use crate::macros::utils::MacroBodyArgCollector; use crate::{MacTree, StdSystem}; #[derive(Default)] pub struct MacroSystem; impl SystemCtor for MacroSystem { type Deps = StdSystem; type Instance = Self; const NAME: &'static str = "orchid::macros"; const VERSION: f64 = 0.00_01; fn inst(_: SystemHandle) -> Self::Instance { Self } } impl SystemCard for MacroSystem { type Ctor = Self; type Req = Never; fn atoms() -> impl IntoIterator>> { [ Some(InstantiateTplCall::dynfo()), Some(MacTree::dynfo()), Some(Macro::dynfo()), Some(PhAtom::dynfo()), Some(MacroBodyArgCollector::dynfo()), Some(MatcherAtom::dynfo()), ] } } impl System for MacroSystem { async fn request(_: ExtReq<'_>, req: Never) -> Receipt<'_> { match req {} } async fn prelude() -> Vec { vec![ sym!(macros::common::+; i()), sym!(macros::common::*; i()), sym!(macros::common::,; i()), sym!(macros::common::;; i()), sym!(macros::common::..; i()), sym!(macros::common::_; i()), sym!(std::tuple::t; i()), sym!(pattern::match; i()), sym!(pattern::ref; i()), sym!(pattern::=>; i()), ] } fn lexers() -> Vec { vec![&MacTreeLexer, &PhLexer] } fn parsers() -> Vec { vec![&LetLine, &MacroLine] } async fn env() -> Vec { merge_trivial([gen_macro_lib().await, gen_std_macro_lib().await, gen_match_macro_lib().await]) } }