[Richard Suchenwirth] 2002-12-18 - Late on March 3, 1990, [Peter da Silva] produced two shell archives (shar) that contained the full documentation for Tcl 2.1, and posted them to alt.sources. Thanks to the history awareness of [SourceForge].net [http://sourceforge.net/project/showfiles.php?group_id=10894] (and the friendly folks that uploaded the data), we can still today download Tcl 2.1 and, like in a time capsule, see how Tcl was when it was really young ;-) The documentation of those times consisted of 18 man pages, 16 for the C functions, one for Tcl_Interp, and a single Tcl.1 for the language description (plus another, stream.5). It was a joy to read, more than 12 years after, and showed how mature Tcl was already at that time. Here are my notes on the differences I found. "Tcl will eventually provide a mechanism for communicating between applications". It took [Tk] and [send] to fulfil that promise, but we still don't have a robust cross-platform solution... Bracketed commands didn't need to be in one line: "newlines within brackets are treated as argument separators, not command separators". This has changed later, and we all know the backslashes to extend bracketed commands over more than one line. The current view is that the contents of brackets are a script, and hence the same rules apply. "Double-quotes act the same as braces except that they cannot be nested". This means that no substitutions took place in double-quoted strings - later allowing them was a good decision, I think. "A Tcl expression has C-like syntax and evaluates to an integer result". No doubles, no string comparisons - but most of the operators were there already. I only miss ? : which makes concise decisions possible. Tcl 2.1 built-in commands (left uncommented if like today's; an arrow -> marks what became of it later): * [break] * '''case''' ''string'' [[in]] ''patList body [[patList body ...]]'' -> [switch] but the ''default'' could be at any position. Glob-style matching only. * [catch] * [concat] * [continue] * [error] * [eval] * [exec] command arg1 arg2... [[< input]] - which is << today * [expr] - but integer only * [file] ''filename'' option - option could be: dirname executable exists extension isdirectory isfile owned readable rootname tail writable * [for] ''start test next body'' - ''next'' could contain a [break] * [foreach] ''varname list body'' - no multiple varnames or lists as of today * [format] * [glob] * [global] * [if] ''test'' [[then]] ''truebody'' [[[[else]] ''falsebody'']] - no elseif * '''index''' ''value index'' [[chars]] -> [lindex] resp. [string] index * [info] ''option'' - option could be: args body commands cmdcount default globals level locals procs tclversion vars * '''length''' ''value'' [[chars]] -> [llength] resp. [string] length * [list] * '''print''' ''string [[filename'' [[append]]]] -> [puts] * [proc] * '''range''' ''value first last'' [[chars]] -> [lrange] resp. [string] range * [rename] * [return] ''value'' - no return codes etc. * [scan] * [set] * [source] * '''stream''' ''handle'' option - option could be: [open] [close] [gets] [puts] name error [eof] [tell] [seek] -> separate commands * [string] ''option'' - option could be: compare first last match * [time] * [uplevel] - level with negative sign, e.g. uplevel -1; no [upvar] Quite a mature language, it was! Here's what was added since then to the 8.4 command set: [after] [append] [array] [binary] [cd] [clock] [encoding] [exit] [fblocked] [fconfigure] [fcopy] [fileevent] [flush] [incr] [interp] [join] [lappend] [load] [lreplace] [lsearch] [lset] [lsort] [namespace] [package] [pid] [pwd] [read] [regexp] [regsub] [socket] [split] [subst] [trace] [unset] [upvar] [variable] [vwait] [while] - Some of these I'd sorely miss... An embedded language was apparently not allowed to [exit] its app; [while] was not a built-in, but the manpage says it can be added by using [uplevel]. ''while isn't that important, you can always do for {} test {} body -[FW]'' The list of built-in variables was also very short, namely one: ''errorInfo''. Finally, the short list of C functions documented 1990: * Tcl_Backslash() * Tcl_CreateCommand() * Tcl_CreateInterp() * Tcl_CreateTrace() - not available at Tcl level then * Tcl_DeleteCommand() * Tcl_DeleteInterp() * Tcl_DeleteTrace() * Tcl_Eval() * Tcl_Expr() * Tcl_GetVar() * Tcl_Merge() * Tcl_Return() * Tcl_SetVar() * Tcl_SplitList() * Tcl_StringMatch() * Tcl_WatchInterp() - register callback for interp deletion A charmingly compact set... We've sure come a long way since then, but as I'm always interested in simplicity, it is fascinating to see how much power came out of so few commands and functions, twelve years ago... ---- [Tcl Heritage] | [Arts and crafts of Tcl-Tk programming]