Suppose you have:

    let c = mkClosureN 0 [| "hello" |]
     in cl [| $(unCl 'c)  ++ " world" |]

`unCl` tags the closure name c as an application `unCl c` in the generated code. So you get something like 

    let c = mkClosureN 0 [| "hello" |]
     in cl [| unCl c  ++ " world" |]

but without requiring a Lift instance for closures which we wouldn't want to use anyways.

cl collects all tagged occurrences of closures in an ExpQ, and it abstracts this occurrences by replacing them with fresh variables. This variables will later hold the result of using `closureApply`:

    let c = mkClosureN 0 [| "hello" |]
     in mkClosureN 0 [| \fresh -> fresh  ++ " world" |] `closureApply` c

I hope that helps a bit. 

I didn't spend a time polishing these definitions because you might reject the entire approach and all the polishing would be done for nothing.