Macro moonlander_gp::impl_astnode
[−]
[src]
macro_rules! impl_astnode { (@asref $i:ident) => { ... }; (@retcap (data $i:ident $($gen:expr)*)) => { ... }; (@retcap $i:ident) => { ... }; (@mkvec () ($($acc:expr)*)) => { ... }; (@mkvec ((data $field:ident $($gen:expr)*) $($fields:tt)*) ($($acc:tt)*)) => { ... }; (@mkvec ($field:ident $($fields:tt)*) ($($acc:tt)*)) => { ... }; (@retpat $enum_name:ident $case_name:ident ()) => { ... }; (@retpat $enum_name:ident $case_name:ident ($($fields:tt),+)) => { ... }; (@retcrea $enum_name:ident $case_name:ident ($($fields:tt),*)) => { ... }; (@repcap (data $i:ident $($gen:expr)*)) => { ... }; (@repcap $i:ident) => { ... }; (@repret $old_child:ident $new_child:ident (data $i:ident $($gen:expr)*)) => { ... }; (@repret $old_child:ident $new_child:ident $i:ident) => { ... }; (@reppat $enum_name:ident $case_name:ident ()) => { ... }; (@reppat $enum_name:ident $case_name:ident ($($fields:tt),+)) => { ... }; (@repcrea $old_child:ident $new_child:ident $enum_name:ident $case_name:ident ()) => { ... }; (@repcrea $old_child:ident $new_child:ident $enum_name:ident $case_name:ident ($($fields:tt),+)) => { ... }; (@randcrea $weights:ident $rng:ident $enum_name:ident $case_name:ident ()) => { ... }; (@randcrea $weights:ident $rng:ident $enum_name:ident $case_name:ident ($($fields:tt),+)) => { ... }; (@callgen $rng:ident) => { ... }; (@callgen $rng:ident $gen:expr) => { ... }; (@randchild $weights:ident $rng:ident (data $field:ident $($gen:expr)*)) => { ... }; (@randchild $weights:ident $rng:ident $field:ident) => { ... }; (@weight leaf $weights:expr) => { ... }; (@weight int $weights:expr) => { ... }; ($enum_name:ident, $type_id:expr, $( $case_type:ident $case_name:ident ($($fields:tt),*) ),* ) => { ... }; }
Implement AstNode and RandNode trait for a node type.
Implementing this code for the various variants of an enum is a bit of a bother and quite repetitive, so this macro implements them for you.
Example
#[derive(Clone,PartialEq,Eq,Debug)] enum Tree { Leaf(i32), Node(Box<Tree>, Box<Tree>) } // Notice sub-trees are indicated by a name, but data fields are // indicated by (data name). impl_astnode!(Tree, 666, leaf Leaf((data value |rng: &mut ::rand::Rng| (rng.next_u32() % 100) as i32)), int Node(left, right));