Tcl

by John Ousterhout
University of California at Berkeley
ouster@cs.berkeley.edu

1. Introduction
---------------

This directory contains the sources and documentation for Tcl, an
embeddable tool command language.  The information here corresponds
to release 7.3.

2. Documentation
----------------

The best way to get started with Tcl is to read the draft of my
upcoming book on Tcl and Tk, which can be retrieved using anonymous
FTP from the directory "ucb/tcl" on ftp.cs.berkeley.edu.  Part I of the
book provides an introduction to writing Tcl scripts and Part III
describes how to write C code that uses the Tcl C library procedures.

The "doc" subdirectory in this release contains a complete set of manual
entries for Tcl.  Files with extension ".1" are for programs (for
example, tclsh.1); files with extension ".3" are for C library procedures;
and files with extension ".n" describe Tcl commands.  The file "doc/Tcl.n"
gives a quick summary of the Tcl language syntax.  To print any of the man
pages, cd to the "doc" directory and invoke your favorite variant of
troff using the normal -man macros, for example

		ditroff -man Tcl.n

to print Tcl.n.  If Tcl has been installed correctly and your "man"
program supports it, you should be able to access the Tcl manual entries
using the normal "man" mechanisms, such as

		man Tcl

3. Compiling and installing Tcl
-------------------------------

This release should compile and run "out of the box" on any UNIX-like
system that approximates POSIX, BSD, or System V.  I know that it runs
on workstations from Sun, DEC, H-P, IBM, and Silicon Graphics, and on
PC's running SCO UNIX and Xenix.  To compile Tcl, do the following:

    (a) Type "./configure" in this directory.  This runs a configuration
	script created by GNU autoconf, which configures Tcl for your
	system and creates a Makefile.  The configure script allows you
	to customize the Tcl configuration for your site;  for details on
	how you can do this, see the file "configure.info".

    (b) Type "make".  This will create a library archive called "libtcl.a"
	and an interpreter application called "tclsh" that allows you to type
	Tcl commands interactively or execute script files.

    (c) If the make fails then you'll have to personalize the Makefile
        for your site or possibly modify the distribution in other ways.
	First check the file "porting.notes" to see if there are hints
	for compiling on your system.  If you need to modify Makefile,
	there are comments at the beginning of it that describe the things
	you might want to change and how to change them.

    (d) Type "make install" to install Tcl binaries and script files in
        standard places.  You'll need write permission on /usr/local to
	do this.  See the Makefile for details on where things get
	installed.

    (e) At this point you can play with Tcl by invoking the "tclsh"
	program and typing Tcl commands.  However, if you haven't installed
	Tcl then you'll first need to set your TCL_LIBRARY variable to
	hold the full path name of the "library" subdirectory.

If you have trouble compiling Tcl, I'd suggest looking at the file
"porting.notes".  It contains information that people have sent me about
changes they had to make to compile Tcl in various environments.  I make
no guarantees that this information is accurate, complete, or up-to-date,
but you may find it useful.  If you get Tcl running on a new configuration,
I'd be happy to receive new information to add to "porting.notes".  I'm
also interested in hearing how to change the configuration setup so that
Tcl compiles on additional platforms "out of the box".

4. Test suite
-------------

There is a relatively complete test suite for all of the Tcl core in
the subdirectory "tests".  To use it just type "make test" in this
directory.  You should then see a printout of the test files processed.
If any errors occur, you'll see a much more substantial printout for
each error.  See the README file in the "tests" directory for more
information on the test suite.

5. Summary of changes in recent releases
----------------------------------------

Tcl 7.3 is a minor release that includes only one change relative to
Tcl 7.1 (it fixes a portability problem that prevented tclMain.c from
compiling on some machines due to a missing R_OK definition).  Tcl 7.3
should be completely compatible with Tcl 7.1 and Tcl 7.0.

Tcl 7.2 was a mistake; it was withdrawn shortly after it was released.

Tcl 7.1 is a minor release that consists almost entirely of bug fixes.
The only feature change is to allow no arguments in invocations of "list"
and "concat".  7.1 should be completely compatible with 7.0.

Tcl 7.0 is a major new release that includes several new features
and a few incompatible changes.  For a complete list of all changes
to Tcl in chronological order, see the file "changes".  Those changes
likely to cause compatibility problems with existing C code or Tcl
scripts are specially marked.  The most important changes are
summarized below.

Tcl configuration and installation has improved in several ways:

    1. GNU autoconf is now used for configuring Tcl prior to compilation.

    2. The "tclTest" program no longer exists.  It has been replaced by
    "tclsh", which is a true shell-like program based around Tcl (tclTest
    didn't really work very well as a shell).  There's a new program
    "tcltest" which is the same as "tclsh" except that it includes a
    few extra Tcl commands for testing purposes.

    3. A new procedure Tcl_AppInit has been added to separate all of the
    application-specific initialization from the Tcl main program.  This
    should make it easier to build new Tcl applications that include
    extra packages.

    4. There are now separate manual entries for each of the built-in
    commands.  The manual entry "Tcl.n", which used to describe all of
    the built-ins plus many other things, now contains a terse but
    complete description of the Tcl language syntax.

Here is a list of all incompatibilities that affect Tcl scripts:

    1. There have been several changes to backslash processing:
	- Unknown backslash sequences such as "\*" are now replaced with
	  the following character (such as "*");  Tcl used to treat the
	  backslash as an ordinary character in these cases, so both the
	  backslash and the following character would be passed through.
	- Backslash-newline now eats up any white space after the newline,
	  replacing the whole sequence with a single space character.  Tcl
	  used to just remove the backslash and newline.
	- The obsolete sequences \Cx, \Mx, \CMx, and \e no longer get
	  special treatment.
	- The "format" command no longer does backslash processing on
	  its input string.
    You can invoke the shell command below to locate backslash uses that
    may potentially behave differently under Tcl 7.0.  This command
    will print all of the lines from the script files "*.tcl" that may
    not work correctly under Tcl 7.0:
	egrep '(\\$)|(\\[^][bfnrtv\0-9{}$ ;"])' *.tcl
    In some cases the command may print lines that are actually OK.

    2. The "glob" command now returns only the names of files that
    actually exist, and it only returns names ending in "/" for
    directories.

    3. When Tcl prints floating-point numbers (e.g. in the "expr" command)
    it ensures that the numbers contain a "." or "e" so that they don't
    look like integers.

    4. The "regsub" command now overwrites its result variable in all cases.
    If there is no match, then the source string is copied to the result.

    5. The "exec", "glob", "regexp", and "regsub" commands now include a
    "--" switch;  if the first non-switch argument starts with a "-" then
    there must be a "--" switch or the non-switch argument will be treated
    as a switch.

    6. The keyword "UNIX" in the variable "errorCode" has been changed to
    "POSIX".

    7. The "format" and "scan" commands no longer support capitalized
    conversion specifiers such as "%D" that aren't supported by ANSI
    sprintf and sscanf.

Here is a list of all of the incompatibilities that affect C code that
uses the Tcl library procedures.  If you use an ANSI C compiler then
any potential problems will be detected when you compile your code:  if
your code compiles cleanly then you don't need to worry about anything.

    1. Tcl_TildeString now takes a dynamic string as an argument, which is
    used to hold the result.

    2. tclHash.h has been eliminated;  its contents are now in tcl.h.

    3. The Tcl_History command has been eliminated:  the "history" command
    is now automatically part of the interpreter.

    4. The Tcl_Fork and Tcl_WaitPids procedures have been deleted (just
    use fork and waitpid instead).

    5. The "flags" and "termPtr" arguments to Tcl_Eval have been eliminated,
    as has the "noSep" argument to Tcl_AppendElement and the TCL_NO_SPACE
    flag for Tcl_SetVar and Tcl_SetVar2.

    6. The Tcl_CmdBuf structure has been eliminated, along with the procedures
    Tcl_CreateCmdBuf, Tcl_DeleteCmdBuf, and Tcl_AssembleCmd.  Use dynamic
    strings instead.

    7. Tcl_UnsetVar and Tcl_UnsetVar2 now return TCL_OK or TCL_ERROR instead
    of 0 or -1.

    8. Tcl_UnixError has been renamed to Tcl_PosixError.

    9. Tcl no longer redefines the library procedures "setenv", "putenv",
    and "unsetenv" by default.  You have to set up special configuration
    in the Makefile if you want this.

Below is a sampler of the most important new features in Tcl 7.0.  Refer
to the "changes" file for a complete list.

    1. The "expr" command supports transcendental and other math functions,
    plus it allows you to type expressions in multiple arguments.  Its
    numerics have also been improved in several ways (e.g. support for
    NaN).

    2. The "format" command now supports XPG3 %n$ conversion specifiers.

    3. The "exec" command supports many new kinds of redirection such as
    >> and >&, plus it allows you to leave out the space between operators
    like < and the file name.  For processes put into the background,
    "exec" returns a list of process ids.

    4. The "lsearch" command now supports regular expressions and exact
    matching.

    5. The "lsort" command has several new switches to control the
    sorting process (e.g. numerical sort, user-provided sort function,
    reverse sort, etc.).

    6. There's a new command "pid" that can be used to return the current
    process ids or the process ids from an open file that refers to a
    pipeline.

    7. There's a new command "switch" that should now be used instead
    of "case".  It supports regular expressions and exact matches, and
    also uses single patterns instead of pattern lists.  "Case" is
    now deprecated, although it's been retained for compatibility.

    8. A new dynamic string library has been added to make it easier to
    build up strings and lists of arbitrary length.  See the manual entry
    "DString.3".

    9. Variable handling has been improved in several ways:  you can
    now use whole-array traces to create variables on demand, you can
    delete variables during traces, you can upvar to array elements,
    and you can retarget an upvar variable to stop through a sequence
    of variables.  Also, there's a new library procedure Tcl_LinkVar
    that can be used to associate a C variable with a Tcl variable and
    keep them in sync.

    10. New library procedures Tcl_SetCommandInfo and Tcl_GetCommandInfo
    allow you to set and get the clientData and callback procedure for
    a command.

    11. Added "-errorinfo" and "-errorcode" options to "return" command;
    they allow much better error handling.

    12. Made prompts in tclsh user-settable via "tcl_prompt1" and
    "tcl_prompt2" variables.

    13. Added low-level support that is needed to handle signals:  see
    Tcl_AsyncCreate, etc.

6. Tcl newsgroup
-----------------

There is a network news group "comp.lang.tcl" intended for the exchange
of information about Tcl, Tk, and related applications.  Feel free to use
the newsgroup both for general information questions and for bug reports.
I read the newsgroup and will attempt to fix bugs and problems reported
to it.

7. Tcl contributed archive
--------------------------

Many people have created exciting packages and applications based on Tcl
and made them freely available to the Tcl community.  An archive of these
contributions is kept on the machine harbor.ecn.purdue.edu.  You can
access the archive using anonymous FTP;  the Tcl contributed archive is
in the directory "pub/tcl".  The archive also contains an FAQ ("frequently
asked questions") document that provides solutions to problems that
are commonly encountered by TCL newcomers.

8. Support and bug fixes
------------------------

I'm very interested in receiving bug reports and suggestions for
improvements.  Bugs usually get fixed quickly (particularly if they
are serious), but enhancements may take a while and may not happen at
all unless there is widespread support for them (I'm trying to slow
the rate at which Tcl turns into a kitchen sink).  It's almost impossible
to make incompatible changes to Tcl at this point.

The Tcl community is too large for me to provide much individual
support for users.  If you need help I suggest that you post questions
to comp.lang.tcl.  I read the newsgroup and will attempt to answer
esoteric questions for which no-one else is likely to know the answer.
In addition, Tcl support and training are available commercially from
NeoSoft.  For more information, send e-mail to "info@neosoft.com".

9. Tcl release organization
---------------------------

Each Tcl release is identified by two numbers separated by a dot, e.g.
6.7 or 7.0.  If a new release contains changes that are likely to break
existing C code or Tcl scripts then the major release number increments
and the minor number resets to zero: 6.0, 7.0, etc.  If a new release
contains only bug fixes and compatible changes, then the minor number
increments without changing the major number, e.g. 7.1, 7.2, etc.  If
you have C code or Tcl scripts that work with release X.Y, then they
should also work with any release X.Z as long as Z > Y.

Beta releases have an additional suffix of the form bx.  For example,
Tcl 7.0b1 is the first beta release of Tcl version 7.0, Tcl 7.0b2 is
the second beta release, and so on.  A beta release is an initial
version of a new release, used to fix bugs and bad features before
declaring the release stable.  Each new release will be preceded by
one or more beta releases.  I hope that lots of people will try out
the beta releases and report problems back to me.  I'll make new beta
releases to fix the problems, until eventually there is a beta release
that appears to be stable.  Once this occurs I'll remove the beta
suffix so that the last beta release becomes the official release.

If a new release contains incompatibilities (e.g. 7.0) then I can't
promise to maintain compatibility among its beta releases.  For example,
release 7.0b2 may not be backward compatible with 7.0b1.  I'll try
to minimize incompatibilities between beta releases, but if a major
problem turns up then I'll fix it even if it introduces an
incompatibility.  Once the official release is made then there won't
be any more incompatibilities until the next release with a new major
version number.

10. Compiling on non-UNIX systems
--------------------------------

The Tcl features that depend on system calls peculiar to UNIX (stat,
fork, exec, times, etc.) are now separate from the main body of Tcl,
which only requires a few generic library procedures such as malloc
and strcpy.  Thus it should be relatively easy to compile Tcl for
non-UNIX machines such as MACs and DOS PC's, although a number of
UNIX-specific commands will be absent (e.g.  exec, time, and glob).
See the comments at the top of Makefile for information on how to
compile without the UNIX features.
