Michael Stoll on Tue, 21 Apr 1998 11:16:04 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: quote |
I wrote: > Hi all -- > > by now I've had a look at the source and it seems to me that there > is no straightforward way to obtain the variable number of an identifier > once it has got some value. > (a) Is this true? > (b) Do you agree that this is a design flaw? > (c) Why not put the variable number into the entree structure? > (d) Introducing quote won't be necessary if we make the following > change to the semantics of gp. Whenever a variable number is required, > simply use the identifier's variable number as given in its entree > (assuming (c)) (unless it's the name of a function, of course). > This seems to me the better solution; it is also (at least to my > taste) nearer to mathematical intuition. As to (a), I had a more thorough look, and it seems that you can find the polx of the variable at initial_value(ep), when ep is the corresponding entree. (Not that this is documented somewhere...) So (b) and (c) are probably obsolete. As to (d), thinking again, I see that you do want to have both possibilities. So dump (d) and go back to quote. I did some hacking, so here is a patch (pre-alpha :) ). (BTW, this also groups the things belonging to sumiter.c together in paridecl.h .) It now works like this. lordly:/Users/micha/UnixProjects/pari/pari-2.0.7.alpha> ./gp GP/PARI CALCULATOR Version 2.0.7 (alpha) i486 running nextstep (ix86 kernel) 32-bit version (readline enabled, extended help available) Copyright 1989-1998 by C. Batut, K. Belabas, D. Bernardi, H. Cohen and M. Olivier. Type ? for help. realprecision = 28 significant digits seriesprecision = 16 significant terms format = g0.28 parisize = 8000000, primelimit = 1000000, buffersize = 30000 gp (11:14)> a=x %1 = x gp (11:14)> a %2 = x gp (11:14)> 'a %3 = a gp (11:14)> quote(a) %4 = a gp (11:14)> 'thue *** variable name expected: 'thue ^--- gp (11:14)> quote(thue) *** variable name expected: quote(thue) ^---- gp (11:14)> quote(7) *** variable name expected: quote(7) ^- gp (11:14)> '+ *** variable name expected: '+ ^ gp (11:14)> 'a^2+5*'a %5 = a^2 + 5*a gp (11:14)> subst(%5,a,4) %6 = a^2 + 5*a gp (11:15)> subst(%5,'a,4) %7 = 36 gp (11:15)> Good bye! Enjoy! Michael ----8<--------PATCH-------------------------------------------------- lordly:/Users/micha/UnixProjects/pari/pari-2.0.7.alpha> diff -c2 src/headers/paridecl.h.orig src/headers/paridecl.h *** src/headers/paridecl.h.orig Tue Apr 21 10:54:39 1998 --- src/headers/paridecl.h Tue Apr 21 11:04:57 1998 *************** *** 508,520 **** GEN cyclo(long n, long v); GEN dirdiv(GEN x, GEN y); - GEN direuler(entree *ep, GEN a, GEN b, char *ch); GEN dirmul(GEN x, GEN y); GEN dirzetak(GEN nf, GEN b); - GEN divsum(GEN num,entree *ep, char *ch); - void fordiv(GEN a, entree *ep, char *ch); - void forpari(entree *ep, GEN a, GEN b, char *ch); - void forprime(entree *ep, GEN a, GEN b, char *ch); - void forstep(entree *ep, GEN a, GEN b, GEN s, char *ch); - void forvec(entree *ep, GEN x, char *ch); GEN gen_sort(GEN x, int cmp(GEN,GEN), int flag); GEN genrand(GEN N); --- 508,513 ---- *************** *** 528,532 **** GEN indexlexsort(GEN x); GEN indexsort(GEN x); - GEN intnum0(entree *ep, GEN a, GEN b, char *ch,long flag,long prec); GEN laplace(GEN x); GEN legendre(long n, long v); --- 521,524 ---- *************** *** 534,538 **** GEN mathilbert(long n); GEN matpascal(long n); - GEN matrice(GEN nlig, GEN ncol,entree *ep1, entree *ep2, char *ch); long mymyrand(); GEN permute(long n, GEN x); --- 526,529 ---- *************** *** 540,555 **** GEN polint(GEN xa, GEN ya, GEN x, GEN *dy); GEN polymodrecip(GEN x); - GEN polzag(long n, long m); - GEN polzagreel(long n, long m, long prec); - GEN prodeuler(entree *ep, GEN a, GEN b, char *ch, long prec); - GEN prodinf(entree *ep, GEN a, char *ch, long prec); - GEN prodinf0(entree *ep, GEN a, char *ch, long flag, long prec); - GEN prodinf1(entree *ep, GEN a, char *ch, long prec); - GEN produit(entree *ep, GEN a, GEN b, char *ch, GEN x); - GEN qromb(entree *ep, GEN a, GEN b, char *ch, long prec); - GEN qromi(entree *ep, GEN a, GEN b, char *ch, long prec); - GEN qromo(entree *ep, GEN a, GEN b, char *ch, long prec); GEN reorder(GEN x); - GEN rombint(entree *ep, GEN a, GEN b, char *ch, long prec); GEN setintersect(GEN x, GEN y); long setisset(GEN x); --- 531,535 ---- *************** *** 560,579 **** GEN sindexlexsort(GEN x); GEN sindexsort(GEN x); - GEN somme(entree *ep, GEN a, GEN b, char *ch, GEN x); GEN sort(GEN x); - GEN sumalt(entree *ep, GEN a, char *ch, long prec); - GEN sumalt0(entree *ep, GEN a, char *ch,long flag, long prec); - GEN sumalt2(entree *ep, GEN a, char *ch, long prec); - GEN suminf(entree *ep, GEN a, char *ch, long prec); - GEN sumpos(entree *ep, GEN a, char *ch, long prec); - GEN sumpos0(entree *ep, GEN a, char *ch, long flag,long prec); - GEN sumpos2(entree *ep, GEN a, char *ch, long prec); GEN tayl(GEN x, long v, long precdl); GEN tchebi(long n, long v); GEN vecsort(GEN x, GEN k); GEN vecsort0(GEN x, GEN k); - GEN vecteur(GEN nmax, entree *ep, char *ch); - GEN vvecteur(GEN nmax, entree *ep, char *ch); - GEN zbrent(entree *ep, GEN a, GEN b, char *ch, long prec); /* buch1.c */ --- 540,548 ---- *************** *** 1029,1032 **** --- 998,1036 ---- GEN bnrstark(GEN bnr, GEN subgroup, long flag, long prec); + /* sumiter.c */ + + GEN direuler(entree *ep, GEN a, GEN b, char *ch); + GEN divsum(GEN num,entree *ep, char *ch); + void fordiv(GEN a, entree *ep, char *ch); + void forpari(entree *ep, GEN a, GEN b, char *ch); + void forprime(entree *ep, GEN a, GEN b, char *ch); + void forstep(entree *ep, GEN a, GEN b, GEN s, char *ch); + void forvec(entree *ep, GEN x, char *ch); + GEN intnum0(entree *ep, GEN a, GEN b, char *ch,long flag,long prec); + GEN matrice(GEN nlig, GEN ncol,entree *ep1, entree *ep2, char *ch); + GEN polzag(long n, long m); + GEN polzagreel(long n, long m, long prec); + GEN prodeuler(entree *ep, GEN a, GEN b, char *ch, long prec); + GEN prodinf(entree *ep, GEN a, char *ch, long prec); + GEN prodinf0(entree *ep, GEN a, char *ch, long flag, long prec); + GEN prodinf1(entree *ep, GEN a, char *ch, long prec); + GEN produit(entree *ep, GEN a, GEN b, char *ch, GEN x); + GEN qromb(entree *ep, GEN a, GEN b, char *ch, long prec); + GEN qromi(entree *ep, GEN a, GEN b, char *ch, long prec); + GEN qromo(entree *ep, GEN a, GEN b, char *ch, long prec); + GEN quote(entree* ep); + GEN rombint(entree *ep, GEN a, GEN b, char *ch, long prec); + GEN somme(entree *ep, GEN a, GEN b, char *ch, GEN x); + GEN sumalt(entree *ep, GEN a, char *ch, long prec); + GEN sumalt0(entree *ep, GEN a, char *ch,long flag, long prec); + GEN sumalt2(entree *ep, GEN a, char *ch, long prec); + GEN suminf(entree *ep, GEN a, char *ch, long prec); + GEN sumpos(entree *ep, GEN a, char *ch, long prec); + GEN sumpos0(entree *ep, GEN a, char *ch, long flag,long prec); + GEN sumpos2(entree *ep, GEN a, char *ch, long prec); + GEN vecteur(GEN nmax, entree *ep, char *ch); + GEN vvecteur(GEN nmax, entree *ep, char *ch); + GEN zbrent(entree *ep, GEN a, GEN b, char *ch, long prec); + /* thue.c */ lordly:/Users/micha/UnixProjects/pari/pari-2.0.7.alpha> diff -c2 src/language/anal.c.orig src/language/anal.c *** src/language/anal.c.orig Tue Apr 21 10:31:33 1998 --- src/language/anal.c Tue Apr 21 10:56:52 1998 *************** *** 81,84 **** --- 81,85 ---- * or constante * or ! truc + * or ' identifier * or matrix_block (no_affect=1) * or (expr) *************** *** 662,665 **** --- 663,677 ---- return i ? gun : gzero; } + if (*analyseur == '\'') + { + const char* old; + entree *ep; + analyseur++; old = analyseur; + if(!isalpha(*analyseur)) err(varer1,old,mark.start); + ep = entry(); + if (EpVALENCE(ep)!=EpVAR) /* not a variable */ + err(varer1,old,mark.start); + return quote(ep); + } if (isalpha(*analyseur)) return identifier(); *************** *** 1874,1877 **** --- 1886,1895 ---- if (*analyseur == '"') { skipstring(); return 0; } if (*analyseur == '!') { analyseur++; skiptruc(); return 0; } + if (*analyseur == '\'') + { + analyseur++; + if (isalpha(*analyseur)) { skipentry(); return 0; } + err(varer1,analyseur,mark.start); + } if (isalpha(*analyseur)) { skipidentifier(); return 0; } if (isdigit(*analyseur) || *analyseur== '.') { skipconstante(); return 0; } lordly:/Users/micha/UnixProjects/pari/pari-2.0.7.alpha> diff -c2 src/language/helpmessages.c.orig src/language/helpmessages.c *** src/language/helpmessages.c.orig Tue Apr 21 10:29:08 1998 --- src/language/helpmessages.c Tue Apr 21 10:29:47 1998 *************** *** 343,346 **** --- 343,347 ---- "quadregulator(x): regulator of the real quadratic field of discriminant x", "quadunit(x): fundamental unit of the quadratic field of discriminant x where x must be positive", + "quote(v): returns the variable v unevaluated", "random({N=2^31}): random integer between 0 and N-1", "real(x): real part of x", lordly:/Users/micha/UnixProjects/pari/pari-2.0.7.alpha> diff -c2 src/language/init.c.orig src/language/init.c *** src/language/init.c.orig Tue Apr 21 10:27:23 1998 --- src/language/init.c Tue Apr 21 10:28:59 1998 *************** *** 1517,1520 **** --- 1517,1521 ---- {"quadregulator",1,(void*)gregula,4,"Gp"}, {"quadunit",1,(void*)gfundunit,4,"Gp"}, + {"quote",1,(void*)quote,11,"V"}, {"random",0,(void*)genrand,2,"DG"}, {"real",1,(void*)greal,2,"G"}, lordly:/Users/micha/UnixProjects/pari/pari-2.0.7.alpha> diff -c2 src/language/sumiter.c.orig src/language/sumiter.c *** src/language/sumiter.c.orig Tue Apr 21 10:25:01 1998 --- src/language/sumiter.c Tue Apr 21 11:05:34 1998 *************** *** 13,16 **** --- 13,29 ---- /********************************************************************/ /** **/ + /** QUOTE **/ + /** **/ + /********************************************************************/ + + /* quote takes a variable name and returns the varaible unevaluated */ + GEN + quote(entree *ep) + { + return (GEN) initial_value(ep); + } + + /********************************************************************/ + /** **/ /** ITERATIONS **/ /** **/