Frank Mittelbach wrote: | > > \prop_new:N \g_foo_prop | > > | > > \tlp_set:Nn \l_tmp_tlp {\g_foo_prop} | > > | > > \prop_gput:Ooo \l_tmp_tlp ... | > | > | > Hmm... But this could be done with \prop_gput:Noo as well. | | that could only be done if you know that \prop_gput:Noo expand its argument | internally due to its implementation and you use this fact. so you use a | feature of the implementation which may not be there tomorrow I see. So I skimmed through my code and realised that I was using implementation details quite often, e.g. using \my_tlp instead of \tlp_use:N\my_tlp. And I tried to change that. Here is an example that actually does what I want it to, but might not be considered clean code since it depends on implementation details: \RequirePackage{l3prop} \ExplSyntaxOn \tlp_new:Nn \a_tlp {aaa} \tlp_new:Nn \b_tlp {bbb\a_tlp} \prop_new:N \a_plist \prop_gput:Nno \a_plist {key} {\b_tlp} \showthe\a_plist \stop To get rid of implementation details I changed the put command to \prop_gput:Nno \a_plist {key} {\tlp_use:N\b_tlp} But that's worse. Now \b_tlp doesn't get expanded, because -- in contrast to \toks_use:N, \int_use:N etc -- \tlp_use:N cannot expand to a "\the for macros". So I wonder if \tlp_use:N should be considered harmful. It seems to be equal to \toks_use:N or \int_use:N, but definitely isn't. And then: What's the error message in \tlp_use:N for? It looks so arbitrarily. Probably it's not? Ciao Andreas