Karim Belabas on Fri, 7 Sep 2001 13:34:30 +0000 (GMT)

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

Re: suggestions for two very minor improvements to gp user interface

On Mon, 3 Sep 2001, Kevin Buzzard wrote:
> Hi pari-users. Sorry for a long posting on such minor matters: I am
> suggesting two very minor tweaks to the gp interface which would make my
> life easier, but which I certainly wouldn't be able to program myself,
> so I thought I'd tempt others to do so...

No problem, that's what this list is for...

> The first one: I occasionally use gp to manipulate matrices / power series
> with big coefficients, "big" as in "contains 100,000 digit numbers".
> Occasionally I miss a semi-colon at the end of a line and suddenly get a
> printout of what I don't want to see, namely pages and pages of digits.
> I'm sure I'm not the only person this has happened to.

default(lines, x) does something related: print no more than x lines of
output, then a "[...]" marker to signal overflow.

Of course, you can adopt this as a permanent setting in your .gprc.

> This causes great irritation, because these kinds of printouts inevitably
> completely fill up my scrollback memory and hence I lose by far the most
> efficient method I have for looking at back at what I have just done
> recently.

I have 

  logfile  = "~/tmp/pari/%d.%m-%T"
  log = 1

in my .gprc, which creates a unique logfile for each of my pari sessions
named after the time and date upon startup :

-rw-r--r--   1 pari     users        5538 Sep  5 17:45 05.09-17:43:10
-rw-r--r--   1 pari     users        3789 Sep  5 17:46 05.09-17:46:03
-rw-r--r--   1 pari     users        2069 Sep  5 18:14 05.09-18:13:00

"grep" [if I can't identify the correct logfile, "less" otherwise] is then
much more efficient than my eyes to locate the patterns I'm looking for (esp.
among the 100+ different logfiles corresponding to a given day...)

> It seems to me hence that if gp finds that it wants to print out something
> more than 100K long, there is a chance that the user has made a slip---could
> the user perhaps not really want to look at all of such a long output?  So
> why not have a flag, disabled by default, called something like
> "print_overflow_warning", which, if set to 1, triggers a warning whenever
> a huge output is about to appear: just some kind of "answer seems very long,
> do you really want me to print it (yes/no)?" prompt would be great.
> This would be very easy to do if, when gp is about to print out the
> result of calulation %107, the pari output is all 'collected up' and
> then printed out in one go---I don't know whether this is the case but
> thought that there was a chance that it might be.

It is not. Quite possibly a huge character string might have to be allocated,
which would be a problem on older systems, e.g my DOS-based 486, where the
average modern Linux PC wouldn't care. Each character is printed out as soon
as it is known (meaning mostly 9 by 9 for large integers), the OS is
responsible for the buffering.

It is nevertheless quite easy to do: before any result is printed, its size
(in bytes as a GEN object, not as in strlen(GENtostr())) could be computed,
and it it exceeds a certain threshold, trigger the warning. Of course, it's
not as precise as what you suggested [ which could be implemented by first
computing the exact number of symbols to be printed, then printing, resulting
in twice slower output ]  or what "lines" provides, but as a rough measure,
it's quite tolerable I think.

Hum, how does 

  \\ warn before printig anything larger than 10kB in GEN representation
  default(print_overflow, "10k")

look like ?

> The second thing is two little tweaks to readline that are implemented
> in MAGMA and are a *lovely* feature. I am just amazed how simple and yet
> effective these ideas are. By default, if I am using readline, and I hit
> up-arrow, this takes me to the last line I typed in. In MAGMA I can do
> more: If I type "abc" at the prompt and _then_ hit up-arrow, it takes me
> to the last line I typed that began with "abc". This is very useful if you
> want to find that long series of commands that you typed a while ago and
> is much more natural than using ctrl-R etc. But it gets even better: once
> I've found this line, if I hit return and then down-arrow, it takes me to
> the line after the "abc..." line, so if I am looking to do a multi-line
> set of commands over again, I only have to search once. As a concrete
> example of what I'm trying to explain, take a look at this sample session:
> a=somecomplicatedfunction();
> b=a^4+a^2+1;
> c=log(b)+2;
> print(c^2/2)
> (lots of lines of gp input omitted)
> (now decide to try another value of a)
> a=someothercomplicatedfunction();
> (now I realise that I want to compute c as above, just like before).
> In Pari I would now hit something like Ctrl-R b=(enter) Ctrl-R c=(enter)
> Ctrl-R print Ctrl-R Ctrl-R Ctrl-R... (until I've found the print statement
> I want!) etc etc etc.
> In Magma I would type
> b=(up-arrow) (enter) (down-arrow) (enter) (down-arrow) (enter) and that
> would be the end of it.
> It's perhaps hard to appreciate how nice this feature is until you've seen
> it in action, but having used MAGMA a fair amount, I now realise I really
> miss this feature in pari. Is this kind of thing possible to implement in
> gp or would it involve messing with readline?

It does involve messing with readline, I don't see any bindable command
within readline that would do this. It's certainly doable (involves creating
new bindable commands in gp/gp_rl.c to access routines in libhistory
library), but not entirely trivial.

I can add it to the TODO list.


Karim Belabas                    email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud             Tel: (00 33) 1 69 15 57 48
F-91405 Orsay (France)           Fax: (00 33) 1 69 15 60 19
PARI/GP Home Page: http://www.parigp-home.de/