On 07/11/2008, at 2:00 AM, Morten Høgholm wrote: > Question is if you want to have the non-NN variants to be protected. > If you do, then funny things can happen expansion-wise if you have > active characters in the c-argument. Case in question: An active > character appears in the c-argument (say, a colon in a reference > label). If such a character uses the \ifincsname feature to turn > normal in critical places, this will not kick in if \let:cN is > protected and you can wind up with some strange things in place. If > the functions are non-protected, they will perform argument expansion > as usual and then stop once \let:NN is met. Is this actually useful in practise? I'm trying to put some tests together and I'm a bit stumped. I haven't done too much expansion control in restricted contexts, so forgive any trivial cases I'm overlooking. I'm thinking out loud here; some of the following might be rather obvious in hindsight. I'm assuming we've got something like \def\expanded#1{\edef\tmp{#1}\tmp} in which all the "funny stuff" is going on, since it's the only expansion environment I can think of (in my tired state) where we would be worried about the "c" argument being expanded in the wrong context. So if I write something like \def\tmpa{abc} \def\tmpz{xyz} \expanded{ \let:cc{tmpa}{tmpz} } this expands, sort of, to \exp_args:Ncc\let:NN{tmpa}{tmpz} then \let:NN\tmpa\tmpz then \let:NN abc xyz which is obviously bad news. At least any active characters are indeed expanded "correctly" in a csname or whatever. But that seems to be little comfort, when everything else is being expanded when it doesn't make sense. What I'm trying to ask, I guess, is: is there enough expansion control "built-in" to \exp_args: to justify the argument above about \let:cN ? I'm not arguing against not protecting the "c" variants, but at the same time I'm a bit confused how they might be used. Will