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));