# In the following, the columns are to be interpreted as:

# idem - The command is idempotent in the sense that invoking it multiple
#        times with the same args in the same interp will always return the
#        same result
# kill - The command is killable in that nothing depends on its side effects,
#        so if its result is not used, the call may be eliminated entirely.
#        This is 0, 1, or 'objc<=N'
#
# reads - What variables does the command read from the callframe? For
#         the builtins in this table, the result is either 'all' or
#         empty.
#
# writes - What variables does the command write to the callframe?
#          This is empty, a list of numbers N (indicating that objv[N]
#          contains the name of an output variable, or N+ (indicating that
#          objv[N] and all following args contain the names of output
#          variables).


#GLOBAL NAMESPACE

#name                                   idem    kill    reads   writes  notes

after                                   0       0    
cd                                      0       0
clock                                   SPECIAL                         <4>
close                                   0       0
encoding                                SPECIAL                         <4>

eof                                     0       1    
exit                                    0       0
fblocked                                0       1
fconfigure                              0       objc<=3
fcopy                                   0       0

fileevent                               0       0
flush                                   0       0
gets                                    0       0               objv[2]
glob                                    0       1
interp                                  SPECIAL                         <?>

join                                    1       1
lrepeat                                 1       1
lreverse                                1       1
lsearch                                 1       1
lsort                                   SPECIAL                         <1>

open                                    0       0
pid                                     1       1
puts                                    0       0
pwd                                     0       1
read                                    0       0

regexp                                  SPECIAL                          <2>
regsub                                  SPECIAL                          <3>
scan                                    0       0               objv[3+]
seek                                    0       0    
socket                                  0       0

split                                   1       1
tell                                    0       1

#<1> lsort needs the callframe if -command is used, and needs whatever
#    variable access that the command needs. It's unkillable if the
#    command is unkillable. Without -command (the common case!) it doesn't
#    touch the callframe. Even most of the -commands will wind up being
#    killable and not need the callframe, but it's probably best to
#    ignore the case initially and simply announce that [lsort
#    -command] is not compilable.
#
#<2> 'regexp' needs to parse out the switches in order to decide what
#    position on the command line is the 'exp'. The following position
#    is the 'string', and after that are the match variables. 'regexp'
#    reads nothing from the callframe and writes the match variables.
#    For nonconstant args, it's safe to assume it writes everything.
#    If there are no match variables (or if no match variables are
#    live), 'regexp' is killable.
#
#<3> 'regsub' needs to parse out the switches in order to decide
#    whether a 'varName' arg is present. It reads nothing from the
#    callframe and writes only the 'varName'. For nonconstant args,
#    it's safe to assume that it writes everything. If there is no
#    match variable (or if the match variable is not live), 'regsub' is
#    killable.
#
#<4> 'clock' and 'encoding' are not yet compilable ensembles. They
#    probably ought to get made into such before attempting to analyze
#    them in the quadcode compiler.
    

#THE [platform] NAMESPACE

# name                                  idem    kill    reads   writes  notes
platform::generic                       1       1
platform::identify                      1       1
platform::patterns                      1       1


#THE [binary] ENSEMBLE

# name                                  idem    kill    reads   writes  notes
tcl::binary::decode::*                  1       1
tcl::binary::encode::*                  1       1
tcl::binary::format                     1       1
tcl::binary::scan                       0       0               objv[3+]


#THE [chan] ENSEMBLE

# name                                  idem    kill    reads   writes  notes
tcl::chan::blocked                      0       1
tcl::chan::close                        0       0
tcl::chan::copy                         0       0
tcl::chan::create                       0       0
tcl::chan::eof                          0       1

tcl::chan::event                        0       0
tcl::chan::flush                        0       0
tcl::chan::gets                         0       0               objv[2]
tcl::chan::names                        0       1
tcl::chan::pending                      0       1

tcl::chan::pipe                         0       0
tcl::chan::pop                          0       0
tcl::chan::postevent                    0       0
tcl::chan::push                         0       0
tcl::chan::read                         0       0

tcl::chan::puts                         0       0
tcl::chan::seek                         0       0
tcl::chan::tell                         0       1
tcl::chan::truncate                     0       0

# THE [dict] ENSEMBLE

# Not all the subcommands of [dict] are compiled in all circumstances

#name                                   idem    kill    reads   writes
tcl::dict::keys                         1       1
tcl::dict::values                       1       1

#THE [file] ENSEMBLE

#name                                   idem    kill    reads   writes  notes
tcl::file::atime                        0       objc<=3
tcl::file::attributes                   0       objc<=4
tcl::file::channels                     0       1
tcl::file::copy                         0       0
tcl::file::delete                       0       0

tcl::file::dirname                      1       1
tcl::file::executable                   0       1
tcl::file::exists                       0       1
tcl::file::extension                    1       1
tcl::file::isdirectory                  0       1

tcl::file::isfile                       0       1
tcl::file::join                         1       1
tcl::file::link                         0       0
tcl::file::lstat                        0       0               objv[3]  <5>
tcl::file::mkdir                        0       0

tcl::file::mtime                        0       objc<=3
tcl::file::nativename                   0       1
tcl::file::normalize                    0       1
tcl::file::owned                        0       1
tcl::file::pathtype                     1       1

tcl::file::readable                     0       1
tcl::file::readlink                     0       1
tcl::file::rename                       0       0
tcl::file::rootname                     1       1
tcl::file::separator                    1       1

tcl::file::size                         0       1
tcl::file::split                        1       1
tcl::file::stat                         0       0               objv[3]  <5>
tcl::file::system                       0       1
tcl::file::tail                         1       1

tcl::file::tempfile                     0       0
tcl::file::type                         0       1
tcl::file::volumes                      0       1
tcl::file::writable                     0       1

# <5> For tcl::file::lstat and tcl::file::stat, objv[3] is an array, not a
#     scalar variable

#THE [info] ENSEMBLE

#name                                   idem    kill    reads   writes  notes
tcl::info::args                         0       1
tcl::info::body                         0       1
tcl::info::cmdcount                     0       1
tcl::info::commands                     0       1
tcl::info::complete                     1       1

tcl::info::default                      0       0               objv[3]
tcl::info::errorstack                   0       1
tcl::info::frame                        0       1
tcl::info::functions                    0       1
tcl::info::globals                      0       1

tcl::info::hostname                     1       1
tcl::info::library                      1       1
tcl::info::loaded                       0       1
tcl::info::locals                       0       1       all
tcl::info::nameofexecutable             1       1

tcl::info::patchlevel                   1       1
tcl::info::procs                        0       1
tcl::info::script                       0       objc<=2
tcl::info::sharedlibextension           1       1
tcl::info::tclversion                   1       1

tcl::info::vars                         0       1       all

# tcl::info::vars and tcl::info::locals need only the variable names to
# be correct in the callframe. The variable values can be anything.


# THE [info class] SUBENSEMBLE

#name                                   idem    kill    reads   writes  notes
oo::InfoClass::call                     0       1
oo::InfoClass::constructor              0       1
oo::InfoClass::definition               0       1
oo::InfoClass::destructor               0       1
oo::InfoClass::filters                  0       1

oo::InfoClass::forward                  0       1
oo::InfoClass::instances                0       1
oo::InfoClass::methods                  0       1
oo::InfoClass::methodtype               0       1
oo::InfoClass::mixins                   0       1

oo::InfoClass::subclasses               0       1
oo::InfoClass::superclasses             0       1
oo::InfoClass::variables                0       1


# The [info object] SUBENSEMBLE

#name                                   idem    kill    reads   writes  notes
oo::InfoObject::call                    0       1
oo::InfoObject::definition              0       1
oo::InfoObject::filters                 0       1
oo::InfoObject::forward                 0       1
oo::InfoObject::isa                     0       1

oo::InfoObject::methods                 0       1
oo::InfoObject::methodtype              0       1
oo::InfoObject::mixins                  0       1
oo::InfoObject::variables               0       1
oo::InfoObject::vars                    0       1


# THE MATHFUNCS

#name                                   idem    kill    reads   writes  notes
tcl::mathfunc::abs                      1       1
tcl::mathfunc::acos                     1       1
tcl::mathfunc::asin                     1       1
tcl::mathfunc::atan                     1       1
tcl::mathfunc::atan2                    1       1

tcl::mathfunc::bool                     1       1
tcl::mathfunc::ceil                     1       1
tcl::mathfunc::cos                      1       1
tcl::mathfunc::cosh                     1       1
tcl::mathfunc::double                   1       1

tcl::mathfunc::entier                   1       1
tcl::mathfunc::exp                      1       1
tcl::mathfunc::floor                    1       1
tcl::mathfunc::fmod                     1       1
tcl::mathfunc::hypot                    1       1

tcl::mathfunc::int                      1       1
tcl::mathfunc::isqrt                    1       1
tcl::mathfunc::log                      1       1
tcl::mathfunc::log10                    1       1
tcl::mathfunc::max                      1       1

tcl::mathfunc::min                      1       1
tcl::mathfunc::pow                      1       1
tcl::mathfunc::rand                     0       0
tcl::mathfunc::round                    1       1
tcl::mathfunc::srand                    0       0

tcl::mathfunc::sin                      1       1
tcl::mathfunc::sinh                     1       1
tcl::mathfunc::sqrt                     1       1
tcl::mathfunc::tan                      1       1
tcl::mathfunc::tanh                     1       1

tcl::mathfunc::wide                     1       1


# THE [string] ENSEMBLE

#name                                   idem    kill    reads   writes  notes
tcl::string::equal                      1       1
tcl::string::first                      1       1
tcl::string::last                       1       1
tcl::string::repeat                     1       1
tcl::string::reverse                    1       1
