Am Montag, 30. Januar 2006 03:49 schrieb Beck, Andrew Thomas - BECAT001:
> >> --- text3.C     31 Dec 2005 11:40:32 -0000      1.323
> >> +++ text3.C     27 Jan 2006 02:06:30 -0000
> >> @@ -1254,10 +1254,10 @@
> >>                 else {
> >>                         string s = cmd.argument;
> >>                         string const s1 = token(s, ' ', 1);
> >> -                       int const nargs = s1.empty() ? 0 : 
> >convert<int>(s1);
> >> +//                     int const nargs = s1.empty() ? 0 : 
> >convert<int>(s1);
> >>                         string const s2 = token(s, ' ', 2);
> >>                         string const type = s2.empty() ? 
"newcommand" : 
> >s2;
> >> -                       cur.insert(new MathMacroTemplate(token(s, ' 
', 
> >0), nargs, type));
> >> +                       cur.insert(new MathMacroTemplate(token(s, ' 
', 
> >0), s1, type));
> >
> >I think it is better not to make the internal storage of the number of 
> >arguments visible here. Simply provide an additional constructor with 
an 
> >int argument that does the conversion.
> >
> 
> I'm not certain how passing a string reveals that the value is stored 
> internally in the cells_ member variable,

Sorry, I always tend to think that a cell is equivalent to a string.

> but in any event, this change 
> was made in order to allow macros to be created dynamically with a 
varying
> number of arguments, like this:
> 
> \newcommand{\dynMacro}[3]{\newcommand{#1}[#2]{#3}}
> 
> Passing an integer to the constructor would make this impossible.

I see. It might still be better to keep the int version of the constructor 
for existing code.

> >Here you have one of the broken points that I mentioned in my earlier 
> >mail: asMacro() is already defined in math_inset.h and used elsewere, 
but 
> >always returns 0!
> 
> I'm a little confused on this point. I could only find it used in a 
couple
> of spots that were #if 0'd out. In any event, those usagages (in 
math_macro.C)
> seemed to require that asMacro() returned a pointer to the object in the 
event
> that it was an instance of the MathMacro class and 0 otherwise. This is 
the
> case with all similar functions declared virtual in MathInset and 
overridden in
> the relavant derived class. I thought the fact that asMacro wasn't 
declared
> in MathMacro was an accidental ommission.

You are right. Every math inset that needs to be indetifiable has such a 
method. I simply wanted to point out one place where the existing macro 
stuff is incomplete.

> >The overall approach looks sensible. Provided you get rid of the 
> >const_casts and find a way to update existing macros not in the metrics 
> >function this would be a nice feature for 1.5.
> 
> I will implement this change, but I find it bemusing that people find 
updating 
> the macro instantiation within the metrics() function so objectionable.

The reason is very simple: Keep the overall design clean. The task of 
metrics() is to compute on-screen dimensions and nothing else. Therefore 
it is a const method. If we now start to add arbitrary stuff to it, just 
because it happens to be called often enough, the result will be a design 
that nobody understands anymore.

> Since everybody agreed that this was the best thing to do, I simply
> continued to implement new functions in a consistent way. To me, 
changing
> the number of arguments is no different to changing the expansion
> template (& has been requested several times in bugzilla). I looked in
> bugzilla & couldn't find any mention of this being undesirable and the
> original patch was submitted without comment.

This is not at all undesireable.

> ps for what it's worth, I use macro's a lot and actually like the 
current
> method of entering arguments. I don't see any problem with the box 
expanding
> when you enter the macro usage, except that it's a tad weird when you 
just
> cursor through a document, but this is a minor concern.

And it is no problem to change the UI later if somebody has a better idea.


Georg

Reply via email to