1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
extern crate proc_macro;
use proc_macro::TokenStream;
use proc_macro_hack::proc_macro_hack;
use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};

use quote::quote;
use syn;

#[proc_macro_hack]
pub fn a(input: TokenStream) -> TokenStream {
    let name = syn::parse_macro_input!(input as syn::Ident).to_string();

    let hash: u64 = {
        let mut hasher = DefaultHasher::new();
        name.hash(&mut hasher);
        hasher.finish()
    };

    TokenStream::from(quote! {
        Atom::from(#hash)
    })
}