Am 30.04.2013 19:20, schrieb Michiel Helvensteijn:
> On Tue, Apr 30, 2013 at 4:06 PM, Joseph Wright
> <[log in to unmask]> wrote:
>
>> On where '-NoValue-' 'lives', ...etc...
>
> Your problem is that xparse has been trying to cater to two different
> target groups. It's meant to create document-level commands. But it's
> not clear what kind of environment it's meant to create them from.
you hit the nail on its head (or whatever the phrase might be :-)
on one hand xparse has taken a life on its own (because of being very
useful in 2e context) and on the other hand the middle glue didn't got
finished so far and thus the two went of (partly at least) in different
directions.
Conceptually what sits in the middle is what I call typesetting
elements. Those have a type/signature which is a bunch of inputs with
some defined semantics (and such semantics could and should include that
such objects be optional). So that layer should provide a way to say: I
expect some optional input, provide me with data or tell me that nothing
is coming.
The task of the interface layer (of which xparse would be one flavor)
would then be to translate the user interface (e.g., brackets, stars,
what have you) into the syntax of the class design layer.
A big point to note here (for me at least) is that therefore it should
certainly not be
\xparse_if_no_value:nTF
because it is not an xparse concept needed on the lower level, it is a
core concept "from" the lower level.
If somebody writes an xhtml.sty interface that provides html like syntax
for the same typesetting elements those translation would need to result
in the same calls to the class design layer eventually.
What I originally thought was that this class design layer is being
essentially described by the concepts of xtemplate (only that I do
believe that we didn't quite got that right, first time around, so these
days I consider xtemplate only a prototype that needs redoing).
So in a nutshell, the somewhat naive version of the interface was
supposed to look like
\DeclareDocumentcommand \foo {<arg spec> }
{ \UseTemplate... <normalized args> }
Instead what we have now is
\DeclareDocumentcommand \foo {<arg spec> }
{
bunch of low-level expl3 code
and/or 2e code
and possible some xparse parsing control code such as
\IfNoValueTF and the like
}
so ...
> On the one hand, the LaTeX3 methodology recommends the use of xparse
> for document level commands (rather than the LaTeX2 \newcommand or the
> TeX \def). On the other hand, xparse doesn't offer a LaTeX3 syntax! It
> was obviously designed to be used independently from expl3. I do
> understand. The xparse functionality is useful to both LaTeX3
> programmers and other LaTeXers.
it wasn't designed to be independent of LaTeX3 syntax, but it was
designed to be independent of expl3 syntax (and in my opinion still should)
> As I see it, the 'correct' way to go about this is to follow your own
> methodology (I'm a fan of self-reference):
>
> * Create a LaTeX3 library which provides xparse functionality; let's
> call it l3xparse. I'd expect to see functions like
> \xparse_new_document_command:Nnn, \xparse_split_argument:nn,
> \xparse_if_no_value:n(TF). Actually, a lot of potential \xparse_...
> functions probably already exist under a different name, like
> \bool_if:n(TF) for \IfBoolean(TF).
>
> * Expose l3xparse with a thin layer of document-level commands. The
> result will be what you now call xparse. The cool thing is, you can
> actually use l3xparse to create that thin layer around itself.
I agree that there should be an l3UIfoundation library that provides
functions for splitting etc etc as they would be useful not just for
implementing xparse but also for parsing other syntax schemes but it
doesn't resolve the issue that there has to be that middle layer
(eventually) and that middle layer should not be expl3 code
If this middle layer is not provided then in my opinion that would get
us back to mix and match of class design of 2e where a lot of the
"design" got buried into coding rather than cleanly decoupled.
That l3UIfundation would then also be the place that holds
\uif_if_no_value:nTF
that could be used to implement the current xparse \IfNoValueTF (which I
never like to be there really :-) or directly used in expl3 code in the
command body as long as there is not middle layer worth talking about.
And eventually it would be used inside the code that makes up the middle
layer.
My view of the world (in pictures):
Logical view architecture:
https://dl.dropboxusercontent.com/u/55981144/l3architecturepictures/Logical%20View.png
Document class architecture:
https://dl.dropboxusercontent.com/u/55981144/l3architecturepictures/document%20class%20architecture%20%28layers%29.png
list element example:
https://dl.dropboxusercontent.com/u/55981144/l3architecturepictures/list%20example%202.png
regards
frank
|