Karim Belabas on Tue, 07 Oct 2014 09:47:19 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
opinion about "strictmatch" and "compatible" |
Dear PARI/GP users, I recently rewrote the gp interpreter in a more modular way to support in a nicer way the various frontends (gp, Java/Android, emacs, TeXmacs, etc.) and I would like your opinion on two obscure, in my opinion obsolete, features. Both complicate the code (I can live with that) and the interfaces / documentation (which bothers me). First some background, if you're in a hurry, jump to PROPOSED CHANGES at the end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1) The "strictmatch" default: is 1 by default, which produces the following expected behaviour ? print(1)))); 1+1 *** unused characters: print(1)))); 1+1 *** ^--- In other words, if incorrect bracing causes some characters to be left over, we have a syntax error and no statement is executed. If set to 0 ( strictmatch = 0 in GPRC or "default(strictmatch,0)" ), we have ? print(1)))); 1+1 *** Warning: unused characters: )));1+1. 1 We simply discard the extra characters, issue a warning, and go on. (Note that all characters are still discarded, 1+1 is not executed.) The original intent was to allow people writing complicated 1-liners directly in the gp interpreter (and not used to Lisp) to add as many closing parentheses as they pleased rather than count and properly match them. For about ten years, the conclusion of ??strictmatch has been "Please do not use this; find a decent text-editor instead" This complicates the parser interface and is, in my opinion, worse than useless: harmful. 2) The "compatible" default: in 1995, Henri Cohen and I decided to change 70% of all GP function names, effective in gp-2.0, released in 1997. Although long term benefits were expected from the more consistent naming scheme, this certainly broke existing scripts; so I provided "compatible" as well as the "whatnow" mechanism. Depending on the value of "compatible", runtime errors due to evaluation of undefined functions, e.g. initalg(x^2+1), were handled in a special way if the offending function name had been present in gp-1.39. The original (1997) meaning was : * compatible = 0: error but warn about the name change ? initalg(x^2+1) *** at top-level: initalg(x^2+1) *** ^-------------- *** not a function in function call A function with that name existed in GP-1.39.15; to run in backward compatibility mode, type "default(compatible,3)", or set "compatible = 3" in your GPRC file. New syntax: initalg(pol) ===> nfinit(pol) [...] The output of "whatnow(initalg)" followed, explaining the new syntax for that command. * compatible = 1: issue a warning but otherwise accept the function. Meant as a transitory help and no longer works since gp-2.5.0 (2011) and Bill's rewrite of the GP parser: now treated as compatible = 0. * compatible = 2: use the old (1997) function naming scheme, except that we distinguish between uppercase / lowercase, so 'i' (unbound by default) is not the same as 'I' (= sqrt(-1)). * compatible = 3: use the old function naming scheme, do not distinguish between uppercase/lowercase (e.g. 'i' is an invalid variable name: it equals sqrt(-1)). This was certainly useful at the time, but it was meant as a one-shot transitory help and was never designed to provide long-term backward compatibility support. It has the following drawbacks: * functions changed in subtle ways over time, possibly with different input/output conventions. Compatibility only concerned the function name. * this was specific to the 1997 change, and functions continued to change after that, in a less massive way (maybe 10 other functions were removed), and I went on changing whatnow to indicate the current name and syntax, but there's no history. I.e. no way of emulating the behaviour of gp-2.3 in gp-2.7, say. * in "compatible > 1" mode, none of the new functions are available: about 250 of them since 1997... Personal comments: * I don't think anybody was addicted to "compatible = 3". Judging from feedback email in the 1993-1995 period, the impossibility to use 'i' as a loop index was the No 1 pet peeve of GP users at the time. And I have never met with a GP script written in FORTRAN 77 style :-). * since we provide all versions of PARI/GP on our web site / ftp server, full compatibility is easily obtained by running the exact gp binary the script was written for. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PROPOSED CHANGES: 1) make strictmatch = 0 a no-op: we always have a syntax error when the syntax is incorrect. 2) make compatible = 1,2,3 a no-op: we always have compatible = 0 behaviour. 3) leave whatnow() alone for the time being (so that errors still provide a hint about function name changes). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Thanks in advance for any feedback. If nobody feels strongly about this, I'll just go on with the changes :-) Cheers, K.B. -- Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17 Universite de Bordeaux Fax: (+33) (0)5 40 00 69 50 351, cours de la Liberation http://www.math.u-bordeaux1.fr/~kbelabas/ F-33405 Talence (France) http://pari.math.u-bordeaux1.fr/ [PARI/GP] `