Ilya Zakharevich on Thu, 27 Jun 2002 09:30:26 -0400 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [PATCH 2.2.2] mnemonics for flags |
On Thu, Jun 27, 2002 at 01:34:52PM +0200, Bill Allombert wrote: > > The diffence is that in the former case no change to gp2c is needed > > when a new flag-capable function is coded. > > It makes no difference. In both case you have to update the gp2c functions > description file to let gp2c knows about the new definition. > > This file is automatically build from the PARI/GP source. If we add a way to > specify symbolic flags in PARI, gp2c should be able to read it and add it > to its functions description file. As I said: *this* is the difference. With "M Pattern", there is way for the external program to precompile the mneumonic flags. With "G", one needs some additional way to allow this. > Anyway if flag names are t_STRING, using G or M does not make a real > difference. Of course it does. E.g., Math::Pari converts an argument of type "String" to G via lisexpr(). Doing this over a mneumonic flag would be a disaster. Thus a special flag is needed anyway (call it "M" for the sake of discussion). Three intertwined questions remain: a) Should the "pattern" for the flags be exposed via the struct entree; b) Should the corresponding C function take a long or a GEN; c) Should the pattern be embedded into the argument signature string, or be available elsewhere? If a==NO, then b==GEN, and "c" is N/A. As I already discussed it, this requires the compiler to be changed each time the pattern is changed. So I assume a=YES. Then there is no *need* to change the signature of the libPARI function each time a particular numeric flag is upgraded to a mneumonic flag. Thus Occam razor says b==LONG. "c" is the hard one. It is irrelevant for the compile-to-C solutions, but gp (and the current implementation of Math::Pari, which processes "rare" signatures at run time) will need to skip the pattern (until the next ',') when the actual argument is "numeric". In my implementation c==embedded. This leads to the overhead above; on the other hand, AFAIU, this overhead must be negligible: I assume that flags are needed only in the case when the actual work done by the function is not-trivial; thus skipping even over a long pattern would not slow things noticeably. > There are some ambiguity in the parser code system. > DGD0,L, is parsed as (GEN x1 /*default NULL*/ , long x2 /*default 0*/ ) > but it can also be understood as (GEN long x1 /*default to GD0*/). No ambiguity: a default for a long should be a long, and GD0 isn't. [But I also look at "DG" with suspicion; note that it was not in the initial implementation I did; I would prever it to be denoted as "D,G" or some such. There may be other examples with a *legitimate* ambiguity.] > > How do you perform operations over enums with a check of validity of > > the operation? > That's a good point for you. What kind of check do you want to perform ? See my initial message. There are two safeguards: "Set to a value" should be done first (may be followed by |-type and &~-type modifiers; "Set to a value and that's it" may be used standalone only. AFAIU, this is all what is needed with the current PARI API, and with other flag-taking API I had seen in my life. > Can you do it with the current numeric flag interface ? > Using sufficiently explicit enum value name, we should be able to avoid > most mistakes (but not to *check* them, agreed). Enum do not even come close. You need to remember which flags require ORing, which ANDing. Ilya