Karim Belabas on Fri, 16 Jun 2006 18:20:32 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: do {...} while(0) macros |
* Bill Allombert [2006-06-16 16:48]: > On Wed, Jun 14, 2006 at 05:50:37PM +0200, Karim Belabas wrote: > > Hi all, > > > > in order to emulate templates in ANSI C, some of the pari code uses the > > (standard, ugly) macro construct: > > > > #define foo do { A; B; } while (0) > > > This is especially annoying for the (deprecated) addsiz functions which > > one might conceivably find in code such as > > > > GEN i; > > for ( i = N0; cmpii(i, N) < 0; addsiz(i, 1, i) ) > > > > ( Which is inefficient and should be written differently, as all code > > using the <fun>z functions, but this is beside the point. ) > > > > > > The simplest "solution" seems to generate most of paricom.h automatically > > from a template [ see the "OPERATION BY VALUE" part ]. > > How this would fix this problem ? Unless you mean replacing the > macros by functions calls (whic is an option). Yes this is what I meant. Easy, but I don't like this solution :-) > > A seemingly better solution is to kill all (obsolete, inefficient, > > difficult to use) <fun>z functions in pari-2.5. > > Well having a set of function with GMP-style interface and reasonable > speed would be useful. Unfortunately <fun>z are usually terribly slow Not _terribly_ slow, since the overhead is (essentially) linear in the output size. But indeed, a sequence of e.g. single word addiiz (or muliiz) is about 50% slower than the same sequence of addii (or mulii) with a few gerepile (PIV 2.8 GHz, native kernel, pari-2.3.0) >> An intermediate solution would be to simply document the problem (say as >> a FAQ item) and forget about it. > > In my opinion, we _have to_ document the list of function that are > actually macros, because macros always behave differently than functions > (e.g you cannot dlopen() them). On the other hand, the way we implement > macros is perfectly standard and should not cause surprise once they are > documented as macros. Agreed. But I'd like a clean up first. This interface might conceivably be useful in low level routines, e.g. addii [ provided someone eventually provides a sensible implementation, where the 'output' parameter is directly used as pre-allocated storage ( NOT affii(addii(x,y), z) ) ]. But I see no use for gexpz (or even mpexpz !) Cheers, K.B. -- Karim Belabas Tel: (+33) (0)5 40 00 26 17 Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50 351, cours de la Liberation http://www.math.u-bordeaux.fr/~belabas/ F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP]