fn qquoter<'cx>(cx: &'cx mut ExtCtxt, ts: TokenStream) -> TokenStream {
    if ts.is_empty() {
        return lex("TokenStream::mk_empty()");
    }
    let qq_res = qquote_iter(cx, 0, ts);
    let mut bindings = qq_res.0;
    let body = qq_res.1;
    let mut cct_res = convert_complex_tts(cx, body);

    bindings.append(&mut cct_res.0);

    if bindings.is_empty() {
        cct_res.1
    } else {
        debug!("BINDINGS");
        for b in bindings.clone() {
            debug!("{:?} = {}", b.0, pprust::tts_to_string(&b.1.to_tts()[..]));
        }
        TokenStream::concat(unravel(bindings), cct_res.1)
   }
}
// ____________________________________________________________________________________________
// Quasiquoter Algorithm
// This algorithm works as follows:
// Input: TokenStream
// 1. Walk the TokenStream, gathering up the unquoted expressions and marking them separately.
// 2. Hoist any unquoted term into its own let-binding via a gensym'd identifier
// 3. Convert the body from a `complex expression` into a simplified one via `convert_complex_tts
// 4. Stitch everything together with `concat`.
Quasiquoter Algorithm
This algorithm works as follows:
Input: TokenStream
1. Walk the TokenStream, gathering up the unquoted expressions and marking them separately.
2. Hoist any unquoted term into its own let-binding via a gensym'd identifier
3. Convert the body from a `complex expression` into a simplified one via `convert_complex_tts
4. Stitch everything together with `concat`.
Quasiquoter Algorithm This algorithm works as follows : Input : TokenStream 1 . Walk the TokenStream gathering up the unquoted expressions and marking them separately . 2 . Hoist any unquoted term into its own let - binding via a gensym ' d identifier 3 . Convert the body from a ` complex expression ` into a simplified one via ` convert_complex_tts 4 . Stitch everything together with ` concat ` .
fn qquoter<'cx>(cx: &'cx mut ExtCtxt, ts: TokenStream) -> TokenStream {
    if ts.is_empty() {
        return lex("TokenStream::mk_empty()");
    }
    let qq_res = qquote_iter(cx, 0, ts);
    let mut bindings = qq_res.0;
    let body = qq_res.1;
    let mut cct_res = convert_complex_tts(cx, body);
    bindings.append(&mut cct_res.0);
    if bindings.is_empty() {
        cct_res.1
    } else {
        debug!("BINDINGS");
        for b in bindings.clone() {
            debug!("{:?} = {}", b.0, pprust::tts_to_string(&b.1.to_tts()[..]));
        }
        TokenStream::concat(unravel(bindings), cct_res.1)
   }
}
fn qquoter < ' cx > ( cx : & ' cx mut ExtCtxt , ts : TokenStream ) -> TokenStream { if ts . is_empty ( ) { return lex ( " " ) ; } let qq_res = qquote_iter ( cx , 0 , ts ) ; let mut bindings = qq_res . 0 ; let body = qq_res . 1 ; let mut cct_res = convert_complex_tts ( cx , body ) ; bindings . append ( & mut cct_res . 0 ) ; if bindings . is_empty ( ) { cct_res . 1 } else { debug ! ( " " ) ; for b in bindings . clone ( ) { debug ! ( " " b 0 pprust tts_to_string ( b 1 to_tts ( ) [ ] ) ) ; } TokenStream :: concat ( unravel ( bindings ) , cct_res . 1 ) } }
____________________________________________________________________________________________
Quasiquoter Algorithm
This algorithm works as follows:
Input: TokenStream
1.
____________________________________________________________________________________________ Quasiquoter Algorithm This algorithm works as follows : Input : TokenStream 1 .
cx
&'cx mut ExtCtxt
ts
TokenStream
cx
&'cx mut ExtCtxt
ts
TokenStream