| Karim Belabas on Sun, 20 Nov 2011 18:45:30 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Backward compatibility |
* Bill Allombert [2011-11-20 17:46]:
> On Sun, Nov 20, 2011 at 08:32:53AM -0500, Charles Greathouse wrote:
> > I was trying to write a quick script that would work for both newer
> > (2.4.3 through 2.6.x) and older versions of gp. For example, I would
> > like to use warning() in the new versions and a print statement in old
> > ones. I thought it would be convenient to define
> >
> > if(lex(version(),[2,4,3])<0,{warning(s:str)=print("Warning: "s)});
> >
> > but this breaks in recent versions -- "variable name expected". Is
> > there a better way to do this?
>
> You can do
> if(lex(version(),[2,4,3])<0,eval("warning(s)=print(\"Warning: \"s)"));
> or
> if(lex(version(),[2,4,3])<0,(mywarning(s:str)=print("Warning: "s));alias("warning","mywarning"));
>
> or you can rename warning to mywarning in your code and do
> if(lex(version(),[2,4,3])<0,mywarning(s:str)=print("Warning: "s),alias("mywarning","warning"));
>
> (Note that, if you use alias you must do it before reading any code that use
> warning/mywarning).
The problem is that, although the compatibility code is not executed at
runtime [ in post-2.4.3 versions ], it is still compiled, and checked for
problems at compile time.
And, of course, the construct "f(s) = blah" is forbidden when 'f' is a
built-in function.
In my own code, I use the alias() solution. A simpler possibility is
if (lex(version(), [2,4,3]) < 0, read("compat.gp"))
where the compatibility code is neither loaded nor compiled unless it's
needed.
Cheers,
K.B.
--
Karim Belabas, IMB (UMR 5251) 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-bordeaux1.fr/~belabas/
F-33405 Talence (France) http://pari.math.u-bordeaux1.fr/ [PARI/GP]
`