Karim BELABAS on Sat, 16 Nov 2002 12:02:19 +0100 (MET)

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

Re: GP as a programming language

On Fri, 15 Nov 2002, Ilya Zakharevich wrote:
> On Fri, Nov 15, 2002 at 01:21:31PM +0100, Bill Allombert wrote:
>> On Thu, Nov 14, 2002 at 06:28:31PM -0800, Ilya Zakharevich wrote:
>> 2) If do() is to be used in control statement that take an expr
>> instead of a seq, then I believe it is better to fix those control
>> statement instead. This is essentially trivial.
> This is better.  But the last time I raised the issue of some
> functions taking an expr, some taking a seq, it lead to introduction
> of new prototype letter instead of changing the C code...

seq() are slightly slower than expr().

Current code:

(10:48) gp > sum(i=1,1000000,); \\ ERROR
(10:49) gp > sum(i=1,1000000,0);
time = 350 ms.
(10:49) gp > sum(i=1,1000000,1);
time = 460 ms.

Changing C code to use seq():

(10:50) gp > sum(i=1,1000000,)
time = 210 ms.
(10:50) gp > sum(i=1,1000000,0);
time = 390 ms.
(10:50) gp > sum(i=1,1000000,1);
time = 500 ms.

At worst, a 10% penalty. I believe "0" is the fastest parsable expr, also
leading to the fastest processing in 'sum'. And that 1 is the next fastest.
For a non-trivial summand, the penalty is not noticeable:

(11:40) gp > sum(i=1,10000,exp(i));
time = 260 ms. \\ both versions

So, I think using seq() everywhere is the correct thing to do after all.

If nobody protests, I shall make that change in the near future (making the
'E' prototype letter a synonym for 'I' in the process, for backward

>>> 1) One needs lexical variables (a variable is a translator name ==>
>>>    value; lexical variables are those visible from the enclosing
>>>    function, but not from any other function, even when called from
>>>    the enclosing function).  What should be a proper syntax?
>>>    I'm leaning on
>>>      func(dynamic,'lexical) = local(dynamic1,'lexical1); SEQ
>>>    What do you think?
>> I would prefer all local variables must be lexical in GP. The current
>> state is misunderstood and create a lot of confusion. Also GP2C can
>> hardly handle non lexical variable.  This a prolem that is not easy to
>> fix, though.

> Giving backward compatibility, this laudable target is out of the question.

I concur. Argument passing is expensive for large objects (by value, full
copy), so the following is a very frequent construct (in _my_ scripts at

  main() = {
    local(bnf = ...) \\ allocate "global"
    f(); g();
    ... \\ in there, everybody uses "global" variable bnf
  \\ ... but we clean up upon exit

or simply

  main(bnf) = ...

for the same effect using GP1-compatible syntax.

>>> 2) Is it OK to allow identifiers of the form prefix::prefix1::name?
>>>    This would be a first step to namespaces...
>> The ':' is already used:
>> -- in 2.2 for GP2C 'tags' to specify type.
> : and :: have no reason to contradict each other.

Sounds reasonable.

Karim Belabas                    Tel: (+33) (0)1 69 15 57 48
Dép. de Mathématiques, Bât. 425  Fax: (+33) (0)1 69 15 60 19
Université Paris-Sud             Email: Karim.Belabas@math.u-psud.fr
F-91405 Orsay (France)           http://www.math.u-psud.fr/~belabas/
PARI/GP Home Page: http://www.parigp-home.de/