Article 1475 of comp.lang.tcl: Path: netlabs!news!usc!cs.utexas.edu!sun-barr!ames!agate!sprite.Berkeley.EDU!ouster From: ouster@sprite.Berkeley.EDU (John Ousterhout) Newsgroups: comp.lang.tcl Subject: Planning for Tcl 7.0 Message-ID: <1avu22INN5ao@agate.berkeley.edu> Date: 8 Oct 92 00:06:26 GMT Organization: U.C. Berkeley Sprite Project Lines: 156 NNTP-Posting-Host: tyranny.berkeley.edu For the last year I've made only small changes to Tcl while focussing on the canvas and text widgets for Tk. I'm now making plans to catch up on a bunch of much-needed bug fixes and enhancements to Tcl. Some of the changes I'm considering are not backwards-compatible. The purpose of this message is to let know know what changes I'm considering for Tcl 7.0 and to solicit feedback. I'm particularly interested in comments on the changes that are incompatible: I'll probably drop the changes for which I get lots of negative feedback and not much positive feedback. If there are other changes that you think are important but aren't contained on this list, let me know and I may add them. Incompatible changes: --------------------- The changes listed below are likely to require changes to existing scripts and/or C code. Each change includes an explanation of why the change might be useful. I'd like to know whether or not you think the change is useful enough to justify the incompatibility. 1. Eliminate the "|" option in the "open" command. Instead, add a "popen" command that does the same thing. Rationale: in the current implementation you can't open a file whose name begins with "|". Also, I think the "popen" command would be more logical. 2. Eliminate the Tcl_WaitPids procedure and use the waitpid POSIX call instead. Also change the wait code to periodically poll for dead child processes so that zombie processes don't get left around forever. Rationale: the current code tends to leave zombies around in some situations. Switching to waitpid should solve this problem in a relatively portable fashion. The only incompatibility will be for C procedures that call Tcl_WaitPids; they'll have to switch to call waitpid instead. I'll provide a compatibility version of waitpid for use on systems that don't have it yet. 3. Clean up backslash processing in several ways: - Change backslash-newline to eat up all the whitespace following the newline and replace the sequence with a single whitespace character. Right now it only eats up the newline character and replaces it with an empty string. Rationale: this would be more consistent with other programs that process backslash-newline sequences. - Eliminate the sequences \Mxx, \Cxxx, and \e. Rationale: these sequences are left around from ancient times. They're not particular compatible with any other program. I should have removed them in Tcl 6.0 but didn't. They did get removed from the documentation, however, so no-one should be using them (?). - Change \x (where x is not one of the characters that gets special backslash treatment) to expand to x, not \x. Rationale: the current behavior is inconsistent with all other programs I know of that handle backslashes, and I think it's confusing. - Change "format" so it doesn't do an additional layer of backslash processing on its format string. Rationale: I don't know why it currently behaves as it does, and I think it's confusing. 4. Change "regsub" so that when no match occurs it sets the result variable to the original string, rather than leaving it unmodified. Rationale: the current behavior results in extra tests of the regsub result that could sometimes be avoided with the proposed new behavior. I doubt that there's much code that will break with the change (this would have to be code that depends on the result variable *not* being modified). 5. Change the name "UNIX" in the "errorCode" variable to "POSIX". Rationale: I suspect that I'm eventually going to get a call from the USL lawyers on this one if I don't change it. Better to change it now in an orderly fashion so I don't have change it hastily in the future. 6. Change glob to return only the names of existing files. Rationale: at present "glob */foo" expands * and generates a result without checking to see if each directory has a "foo" file in it. This makes the current behavior incompatible with csh, for example. One question is whether constructs like "glob {a,b}.c" should also check for the existence of each of the files. At present they don't (i.e. a.c and b.c will be returned even if they don't exist), but neither does csh. My inclination is to make the behavior match csh (names containing *?[] are checked for existence, others aren't). I'd be interested to hear opinions on this one: check all names for existence, check only names including *?[] (for csh compatibility), or keep it as it is? 7. Change "gets" so it returns 1 for success and 0 for failure. At present it returns the line length for success and -1 for failure. Rationale: this would allow slightly simple Tcl scripts: you could just say while [gets $f line] {...} instead of while {[gets $f line] >= 0} {...} I'm not really convinced that this one is important enough to justify the incompatibility, so it won't take much negative feedback to kill it. Other changes: -------------- The changes listed below shouldn't introduce substantial compatibility problems. Of course, any change can potentially cause scripts to stop working (e.g. almost any change will break the test suite), but very few if any people should be affected by these changes. 8. Implement Tcl_CreateExternVar() procedure along lines proposed by Andreas Stolcke to tie a C variable to a Tcl variable with automatic updates between them. 9. Changes to exec: - Allow redirection to an existing file descriptor in "exec", with a mechanism like >&1 or >& stdout. - Allow file names immediately after ">" and "<" without intervening spaces. 10. Changes related to files: - Fix Scott Bolte bug (closing stdin and stdout). - Move TclGetOpenFile and OpenFile stuff to tcl.h so that they're accessible to applications. - Extend access modes in open to include the complete set of POSIX access modes (such as O_EXCL and O_NONBLOCK). 11. Re-instate Tcl_WatchInterp to notify application when an interpreter is deleted. 12. Add "elseif" mechanism to "if" command for chaining "else {if ..." constructs more cleanly. Require exact matches on "then" and "else" keywords. 13. Remove UNIX system call declarations from tclUnix.h. Use them from unistd.h instead, and provide a default version of unistd.h for systems that don't have one. 14. Changes in the expr command, mostly following suggestions made by George Howlett a long time ago: - Increase precision of floating-point results. - Make floating-point numbers always print with a point. - Add transcendental functions like sin and exp. - Add explicit integer and floating conversion operations. - Don't promote large integers to floating-point automatically. - Allow multiple arguments to expr command. 15. Extend lsort to allow alternate sorting mechanisms, like numeric, or client-supplied. 16. Allow alternate pattern-matching forms (e.g. exact or regexp) for lsearch and case. 17. Add XPG/3 positional argument specifiers to format (code contributed by Mark Diekhans). 18. Change "file readlink" to return an error on systems that don't support it rather than removing the option entirely. 19. Add a mechanism for scheduling a Tcl command to be executed when the interpreter reaches a clean point. This is needed for things like signal support. 20. Change upvar so that you can refer to an element of an array as well as a whole array.