On Fri, 12 Sep 2008 12:57:04 +0200, Frank Mittelbach wrote:

> some history, perhaps Morten can say more because I think he did some of  
> the updates ...

Yes, I changed this part of the code.

> very early definition:
>
>   \def_long_new:Npn \tlp_put_right:Nn #1#2{\tlp_set:No #1{#1#2}}
>
> current documentation says
>
> % A word of warning is appropriate here: Token list pointers are
> % implemented as macros and as such currently inherit some of the
> % peculiarities of how \TeX\ handles "#"s in the argument of
> % macros. In particular, the following actions are legal
> % \begin{verbatim}
> % \tlp_set:Nn \l_tmpa_tlp{##1}
> % \tlp_put_right:Nn \l_tmpa_tlp{##2}
> % \tlp_set:No \l_tmpb_tlp{\l_tmpa_tlp ##3}
> % \end{verbatim}
> % |x| type expansions where macros being expanded contain |#|s do not
> % work and will not work until there is an |\expanded| primitive in
> % the engine. If you want them to work you must double |#|s another
> % level.
> %
>
>
> from which I infer that the
>
>   \tlp_set:Nn \l_exp_tlp{#2}
>
> was actually added to raise the error when setting / adding to the tlp  
> and not
> during some later expansion deep down.

Yes, that was why. This was the only way I could find where I'd at least  
get uniform behavior from the functions doing the same kind of expansions.  
As I recall it, that was not the case in the earlier versions. I am pretty  
sure the example from the documentation would not work with the original  
definitions.

> However, we could do better now I guess given that we assume for expl3  
> that eTeX is the underlying engine nowadays

Even with that, I at least could not get it to work better than that. In  
desparation I cried out for an \expanded primitive on this list in  
December last year.

But if someone can fix it all nicely with current tools, then I am happy  
to fold it in.

-- 
Morten