''Purpose: meditate on how other systems/languages shaped Tcl -- started by [Richard Suchenwirth] - please add what you think!'' Of related interest is the [Tcl chronology].
----
'''[TRAC]''' Text Reckoning and Compiling
* the original "everything is a string" language.
'''[UNIX]''' (borrowed from '''Multics''' [http://www.multicians.org]):
* "everything is a string" (at least command line arguments, argv)
* the environment as a string->string mapping (::env array in Tcl)
'''[Multics] Command Language'''
* cwd, pwd, and command execution [http://www.multicians.org/multics-commands.html]
* commands that start with the standard streams for '''standard_input''', '''standard_output''', and '''error_output'''[http://www.multicians.org/mgs.html#standardoutput]
* separation of commands by semicolon or newline
* indication of optional parameters by name following a dash ("-"), e.g., [[if ... -then ... -else ...]]
* Optional parameter names with both a long form and a short form, e.g., -home_dir or -hd
* separation of parameters by whitespace
* expansion of embedded commands [[..]] before calling the first command
* # as comment marker
* grouping of words with ".." and `..'
* method of searching for unknown commands when encountered during processing (what's the exact concept here? Is it the implicit [exec]ification when running in the interactive shell? A more proximate source for that might be the Unix shells, or even [Rexx]. The concept is ''dynamic linking.'' When there is a command encountered that is not found, then the ''search rules'' are used to find a segment that defines the command so that it will be dynamically loaded. This dates from the mid 1960s, and I believe before the Unix shells.)
* dynamically loading and linking commands
* replacement of loaded procs with new ones while still running
'''UNIX shells''' (borrowed from '''Multics Command Language''' [http://www.multicians.org/mspm-bx-1-00.html] shell [http://www.multicians.org/shell.html]):
* the names ''tclsh'', ''[wish]'' (specifically the ..sh ;-)
'''Bourne family of shells (sh/[ksh])''':
* [cd], [pwd], [exec]
* separation of commands by semicolon or newline
* separation of parameters by whitespace
* expansion of parameters before calling the command
* expansion of embedded commands (``..`` in shells, [[..]] in Tcl which nests better) before calling the first command
* expansion of variables with $ ($x as shortcut for [[set x]]; not in earliest Tcl, but introduced by [Karl Lehenbauer])
* grouping of words with "..", which allows expansion
* grouping of words without expansion (Unix shells use '..', Tcl has {..} which nests better--but see below)
* # as comment marker
* redirection of stdout and stdin
'''BSD's csh family of shells''':
* tilde expansion (~suchenwi or ~/bin..)
* redirection of stderr
* history command
'''UNIX tools''':
* [expr] (though Tcl's is much more powerful)
* dash as switch marker (ls -l, glob -nocomplain)
'''Assembler:'''
* ''incr'' (GfA Basic had that too, but assemblers were way earlier ;-)
'''Awk/Lex/Egrep:'''
* regular expressions, ''[[regexp]]'', ''[[regsub]]''. (But ''[[switch -regexp]]'' really feels like something from Snobol or Trac!)
'''[Awk]:'''
* associative arrays (Yes, I know, Snobol had them first, too!)
'''[C]''':
* ''stdin, stdout, stderr''
* ''argv'' (argc unneccessary, we have ''[[llength $argv]]'')
* ''for'' loop, ''while''
* fopen, fputs, fgets, fclose, ftell - minus the leading f
* sprintf is ''format'', especially the format string syntax
* putting code blocks in braces (but much more generalized in Tcl)
* ''expr'' syntax (infix operators, functions, parens..)
'''[C++]''':
* the name::space syntax (not exactly the most beautiful, tho)
'''[FORTRAN]''':
* parens as marker for array elements (but different functionality)
* ''if'' statement (well, they had that earlier than C ;-)
'''[LISP]''':
* lists as major data structure (though not implemented as chains of cons cells)
* dynamic handling of list lengths
* Polish notation, command is always first word
* dynamic binding of commands, rename, replacing proc's at run time, code as data,''[[eval]]''.
* set returns value being set, I actually begged John to do this in the day. BTW, where did John get the idea of program glue? I first saw TCL at UseNIX after writing a small [LISP] library that was meant to let different programs pass data and command execution across pipes or network connections, that was program glue. things like fileevent are key to this.
'''[[Incr Tcl]]'''
* Namespaces
'''SCL'''
* [[Sometime we need to ask JO about this.]] * In the '780s (?), CDC's NOS/VE OS included System Command Language (SCL) [https://www.museumwaalsdorp.nl/en/history/computerhistory-background-information/nosvescl/] which was embeddable and extensible. Applications and the OS could embed other applications (and the OS?) with pleasing symmetry and convenience.
* [[Was it Steve Lidie who observed this?]]
'''X Window System:'''
* the event model (as opposed to either multithreading or PL/I-style ''on''-units) (see [Tcl event loop]) .
* resource "database"
'''(not sure)''' (but all quite important to the character of the language; we need to ask John or Brent or Karl)
* [uplevel], [upvar]
* [info]
* [trace] [[Note that [ksh] had traces--"discipline functions"--in 1988.]]
----
It strikes [CL] that grouping is crucial. Tcl's like [Forth], [Lisp],
[shell], and so on, but it elaborates "grouping" (what might be
lexification in other languages) more than any other. [C] and [TeX]
were two quite different predecessors that both use {} for a
conceptual variety of grouping operations. [m4] has `', rather
clumsily.
----
Updates by:
''KBK'' (7 November 2000) -
''[LV]'' (Nov. 07/08, 2000) - [CL] (2001 ...) - [escargo] (Oct. 9-11, 2002)
----
See also [Is Tcl different!] - [Arts and crafts of Tcl-Tk programming]
<<categories>> Language | History of Tcl and Tk