On 18/09/2011 09:50, Philipp Stephani wrote:
> It's probably too late,
I'd hope we are a long way from 'too late'! It's clear that we will
continue to adjust expl3 as issues arise, and it seems pretty clear that
the team are willing to look again at issues as they arise.
> but I'm quite sure that the removal of
> \tl_new:Nn, \ior_new:N and \iow_new:N should be reverted. It is
> universally considered good style to combine declaration and
> initialization of variables, and having two different commands for
> declaration and setting leads to awkward duplication.
Part of the reasoning we had here is that \tl_new:Nn was being used
almost entirely for declaring constants. We have a conceptually-separate
\tl_const:Nn for that job.
The other part to the reasoning was that while we had \tl_new:Nn, we did
not have \int_new:Nn, etc. So we were not exactly consistent in that
regard. I guess based on the underlying TeX concept that registers have
to be allocated separately to assignment, it seemed easier to take a
similar approach to everything. (I also note that we'd have issues with,
for example, property lists as they can't really be created and
fully-assigned in one shot, at least through anything like the
> \io[rw]_new, without them it is is impossible to check for overwriting
> of stream names. Just like with all other variable types, these should
> be declared before usage.
This is a slightly different issue, as streams are not exactly
variables. In the current implementation, streams are undefined when
they are closed, as once TeX closes a write stream we can't simple
re-open it. We could I guess check for an existing file, read the entire
thing to memory, then re-write it and then append. On the other hand,
perhaps this would be overkill and simply overwriting would be the
correct response. With a read stream, I guess we'd need to worry about
whether you'd store the position in the file, so that you'd re-start
from the same line. Again, this might be overkill. I guess an
alternative is to set up the code such that a stream which has been
closed will give a suitable error message if one tries to use it.
> Also a \cs_new:N command is missing which reserves a "function" name
> without assigning it. Both \io[rw]_new:N and \cs_new:N can essentially
> be aliases for \chk_if_free_cs.
Well, they can't simply be \chk_if_free... as there has to be a
'reserve' stage too. With \cs_new:N, the problem was that you don't know
how many arguments there may be, or in what form they could be. So you'd
at the least need \cs_new:Np, and then have to work out how to delimit
the end of the primitive argument specification. That's before you worry
about long and protected status (which apart from a small number of
tmp:w functions should not vary). So for functions I'm not sure I see a
gain over \cs_new(_protected)(_nopar):N(p)n.