Bill Allombert on Tue, 5 Dec 2000 16:53:24 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: inequalities


On Tue, Dec 05, 2000 at 09:41:33AM +0100, Karim BELABAS wrote:
> [Fernando Rodriguez Villegas:]
> > We were fooled by the following
> > 
> > ? 2<4<3
> > %108 = 1
> > ? 2<1<0
> > %109 = 0
> > ? 1<2<3
> > %110 = 1
> > ? -1<2<3
> > %111 = 1
> > ? -2<-1<0
> > %112 = 0
> > 
> >  We should write these with &&'s but shouldn't we have been warned by
> >  the GP parser?
> 
> the main interpreter, and only used to check scripts) able to detect such
> pitfalls, e.g:
> 
>   a < b < c
>   Warning: dubious associativity, you probably want to use &&
> 
>   if (a = 1, ....
>   Warning: assignment used as truth value
> 
>   a+1; b ...
>   Warning: statement with no effect
> 
> As a matter of fact, Bill Allombert has written a GP --> C converter [soon to
> be announced...], and gcc -Wall might be able to do just that, at least for
> _some_ potential problems.  He might be willing to complicate the grammar of
> his parser to catch some of the other things, which are valid given the
> current GP grammar, but really shouldn't be allowed in a "clean" programming
> language. Of course, the whole point is to issue Warnings upon user's
> request, not to disallow existing "obfuscated" constructs.

Thanks for this pre-announce. I use a typed intermediate language that can
catch such things. However, I do not consider that a<b<c should trigger a
warning. GCC does not, and in some sense it is a normal C construct. For
example, (a<b) == (c<d) should be read as " a<b iff c<d ". Yes, I 
know, C is not a model. I will try to add this check to the compiler.

I want to advertise the "local" keyword in gp script:

The old PARI style for functions was
{
  function(x1,x2,x3,
   	/*local*/  a,b,c)=
	a=x1*x2;b=x2*x3;c=x3*x1;
	return [a-b,b-c,c-a];
}

The new style is to be prefered

function(x1,x2,x3)=
{
  local(a,b,c);
  a=x1*x2;b=x2*x3;c=x3*x1;
  return [a-b,b-c,c-a];
}

as it will allow the compiler to distinguish between local
variable and arguments.