Check-in [dce4aef4b9]

Login
Bounty program for improvements to Tcl and certain Tcl packages.
Tcl 2019 Conference, Houston/TX, US, Nov 4-8
Send your abstracts to [email protected]
or submit via the online form by Sep 9.

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Clean-up CVS import
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: dce4aef4b9553e98fa78255fec6ab043d9ac79f3015a410872a1d84d25f868e7
User & Date: mjanssen 2017-09-06 14:15:36
Context
2017-09-06
14:15
Converted TIPs to Markdown check-in: 9f0c27f8d1 user: mjanssen tags: trunk
14:15
Clean-up CVS import check-in: dce4aef4b9 user: mjanssen tags: trunk
2017-07-16
21:04
Revision through web from Andreas Leitgeb <[email protected]> added reference to fossil branch. check-in: 26cb3c7596 user: tclhttpd tags: trunk
Changes
Hide Diffs Unified Diffs Show Whitespace Changes Patch

Deleted CVSROOT/checkoutlist.

1
2
3
4
5
6
7
8
9
10
11
12
13
# The "checkoutlist" file is used to support additional version controlled
# administrative files in $CVSROOT/CVSROOT, such as template files.
#
# The first entry on a line is a filename which will be checked out from
# the corresponding RCS file in the $CVSROOT/CVSROOT directory.
# The remainder of the line is an error message to use if the file cannot
# be checked out.
#
# File format:
#
#	[<whitespace>]<filename><whitespace><error message><end-of-line>
#
# comment lines begin with '#'
<
<
<
<
<
<
<
<
<
<
<
<
<
























Deleted CVSROOT/commitinfo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# The "commitinfo" file is used to control pre-commit checks.
# The filter on the right is invoked with the repository and a list 
# of files to check.  A non-zero exit of the filter program will 
# cause the commit to be aborted.
#
# The first entry on a line is a regular expression which is tested
# against the directory that the change is being committed to, relative
# to the $CVSROOT.  For the first match that is found, then the remainder
# of the line is the name of the filter to run.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name "ALL" appears as a regular expression it is always used
# in addition to the first matching regex or "DEFAULT".
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























Deleted CVSROOT/config.

1
2
3
4
5
6
7
8
9
10
11
# Set this to "no" if pserver shouldn't check system users/passwords
SystemAuth=no

# Set `PreservePermissions' to `yes' to save file status information
# in the repository.
#PreservePermissions=no

# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top
# level of the new working directory when using the `cvs checkout'
# command.
#TopLevelAdmin=no
<
<
<
<
<
<
<
<
<
<
<




















Deleted CVSROOT/cvswrappers.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# This file affects handling of files based on their names.
#
# The -t/-f options allow one to treat directories of files
# as a single file, or to transform a file in other ways on
# its way in and out of CVS.
#
# The -m option specifies whether CVS attempts to merge files.
#
# The -k option specifies keyword expansion (e.g. -kb for binary).
#
# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers)
#
#  wildcard	[option value][option value]...
#
#  where option is one of
#  -f		from cvs filter		value: path to filter
#  -t		to cvs filter		value: path to filter
#  -m		update methodology	value: MERGE or COPY
#  -k		expansion mode		value: b, o, kkv, &c
#
#  and value is a single-quote delimited value.
# For example:
#*.gif -k 'b'
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












































Deleted CVSROOT/editinfo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# The "editinfo" file is used to allow verification of logging
# information.  It works best when a template (as specified in the
# rcsinfo file) is provided for the logging procedure.  Given a
# template with locations for, a bug-id number, a list of people who
# reviewed the code before it can be checked in, and an external
# process to catalog the differences that were code reviewed, the
# following test can be applied to the code:
#
#   Making sure that the entered bug-id number is correct.
#   Validating that the code that was reviewed is indeed the code being
#       checked in (using the bug-id number or a seperate review
#       number to identify this particular code set.).
#
# If any of the above test failed, then the commit would be aborted.
#
# Actions such as mailing a copy of the report to each reviewer are
# better handled by an entry in the loginfo file.
#
# One thing that should be noted is the the ALL keyword is not
# supported.  There can be only one entry that matches a given
# repository.
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































Deleted CVSROOT/loginfo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# The "loginfo" file controls where "cvs commit" log information
# is sent.  The first entry on a line is a regular expression which must match
# the directory that the change is being made to, relative to the
# $CVSROOT.  If a match is found, then the remainder of the line is a filter
# program that should expect log information on its standard input.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name ALL appears as a regular expression it is always used
# in addition to the first matching regex or DEFAULT.
#
# You may specify a format string as part of the
# filter.  The string is composed of a `%' followed
# by a single format character, or followed by a set of format
# characters surrounded by `{' and `}' as separators.  The format
# characters are:
#
#   s = file name
#   V = old version number (pre-checkin)
#   v = new version number (post-checkin)
#
# For example:
#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog
# or
#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog
^tip (date; cat; (sleep 2; cd /usr/local/web/tip; /usr/bin/cvs -q update -d) &) >> $CVSROOT/CVSROOT/updatelog 2>&1
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































Deleted CVSROOT/modules.

1
2
3
4
5
6
7
modules      CVSROOT modules
admin        web/admin
doc.site     web/doc.site
devxchg.site web/devxchg.site
dxc_res.site web/dxc_res.site
site_look    web/site_look
tip          tip
<
<
<
<
<
<
<












Deleted CVSROOT/notify.

1
2
3
4
5
6
7
8
9
10
11
12
# The "notify" file controls where notifications from watches set by
# "cvs watch add" or "cvs edit" are sent.  The first entry on a line is
# a regular expression which is tested against the directory that the
# change is being made to, relative to the $CVSROOT.  If it matches,
# then the remainder of the line is a filter program that should contain
# one occurrence of %s for the user to notify, and information on its
# standard input.
#
# "ALL" or "DEFAULT" can be used in place of the regular expression.
#
# For example:
#ALL mail %s -s "CVS notification"
<
<
<
<
<
<
<
<
<
<
<
<






















Deleted CVSROOT/rcsinfo.

1
2
3
4
5
6
7
8
9
10
11
12
13
# The "rcsinfo" file is used to control templates with which the editor
# is invoked on commit and import.
#
# The first entry on a line is a regular expression which is tested
# against the directory that the change is being made to, relative to the
# $CVSROOT.  For the first match that is found, then the remainder of the
# line is the name of the file that contains the template.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name "ALL" appears as a regular expression it is always used
# in addition to the first matching regex or "DEFAULT".
<
<
<
<
<
<
<
<
<
<
<
<
<
























Deleted CVSROOT/taginfo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# The "taginfo" file is used to control pre-tag checks.
# The filter on the right is invoked with the following arguments:
#
# $1 -- tagname
# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d
# $3 -- repository
# $4->  file revision [file revision ...]
#
# A non-zero exit of the filter program will cause the tag to be aborted.
#
# The first entry on a line is a regular expression which is tested
# against the directory that the change is being committed to, relative
# to the $CVSROOT.  For the first match that is found, then the remainder
# of the line is the name of the filter to run.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name "ALL" appears as a regular expression it is always used
# in addition to the first matching regex or "DEFAULT".
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































Deleted CVSROOT/verifymsg.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# The "verifymsg" file is used to allow verification of logging
# information.  It works best when a template (as specified in the
# rcsinfo file) is provided for the logging procedure.  Given a
# template with locations for, a bug-id number, a list of people who
# reviewed the code before it can be checked in, and an external
# process to catalog the differences that were code reviewed, the
# following test can be applied to the code:
#
#   Making sure that the entered bug-id number is correct.
#   Validating that the code that was reviewed is indeed the code being
#       checked in (using the bug-id number or a seperate review
#       number to identify this particular code set.).
#
# If any of the above test failed, then the commit would be aborted.
#
# Actions such as mailing a copy of the report to each reviewer are
# better handled by an entry in the loginfo file.
#
# One thing that should be noted is the the ALL keyword is not
# supported.  There can be only one entry that matches a given
# repository.
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































Deleted CVSROOT/writers.

Name change from tip/10.patch to assets/10.patch.

whitespace changes only

Name change from tip/152after.eps to assets/152after.eps.

whitespace changes only

Name change from tip/152after.gif to assets/152after.gif.

cannot compute difference between binary files

Name change from tip/152after.txt to assets/152after.txt.

whitespace changes only

Name change from tip/152before.eps to assets/152before.eps.

whitespace changes only

Name change from tip/152before.gif to assets/152before.gif.

cannot compute difference between binary files

Name change from tip/152before.txt to assets/152before.txt.

whitespace changes only

Name change from tip/168P.eps to assets/168P.eps.

whitespace changes only

Name change from tip/168P.png to assets/168P.png.

cannot compute difference between binary files

Name change from tip/168P.txt to assets/168P.txt.

whitespace changes only

Name change from tip/168ab.eps to assets/168ab.eps.

whitespace changes only

Name change from tip/168ab.png to assets/168ab.png.

cannot compute difference between binary files

Name change from tip/168ab.txt to assets/168ab.txt.

whitespace changes only

Name change from tip/168f.eps to assets/168f.eps.

whitespace changes only

Name change from tip/168f.png to assets/168f.png.

cannot compute difference between binary files

Name change from tip/168f.txt to assets/168f.txt.

whitespace changes only

Name change from tip/168xy.eps to assets/168xy.eps.

whitespace changes only

Name change from tip/168xy.png to assets/168xy.png.

cannot compute difference between binary files

Name change from tip/168xy.txt to assets/168xy.txt.

whitespace changes only

Name change from tip/18labframe.eps to assets/18labframe.eps.

whitespace changes only

Name change from tip/18labframe.png to assets/18labframe.png.

cannot compute difference between binary files

Name change from tip/18labframe.txt to assets/18labframe.txt.

whitespace changes only

Name change from tip/19.patch to assets/19.patch.

whitespace changes only

Name change from tip/247fig1.png to assets/247fig1.png.

cannot compute difference between binary files

Name change from tip/247fig1.txt to assets/247fig1.txt.

whitespace changes only

Name change from tip/247fig2.png to assets/247fig2.png.

cannot compute difference between binary files

Name change from tip/247fig2.txt to assets/247fig2.txt.

whitespace changes only

Name change from tip/247fig3.png to assets/247fig3.png.

cannot compute difference between binary files

Name change from tip/247fig3.txt to assets/247fig3.txt.

whitespace changes only

Name change from tip/247fig4.png to assets/247fig4.png.

cannot compute difference between binary files

Name change from tip/247fig4.txt to assets/247fig4.txt.

whitespace changes only

Name change from tip/247fig5.png to assets/247fig5.png.

cannot compute difference between binary files

Name change from tip/247fig5.txt to assets/247fig5.txt.

whitespace changes only

Name change from tip/247fig6.png to assets/247fig6.png.

cannot compute difference between binary files

Name change from tip/247fig6.txt to assets/247fig6.txt.

whitespace changes only

Name change from tip/247fig7.png to assets/247fig7.png.

cannot compute difference between binary files

Name change from tip/247fig7.txt to assets/247fig7.txt.

whitespace changes only

Name change from tip/249statemachine.png to assets/249statemachine.png.

cannot compute difference between binary files

Name change from tip/249statemachine.txt to assets/249statemachine.txt.

whitespace changes only

Name change from tip/25native.eps to assets/25native.eps.

whitespace changes only

Name change from tip/25native.gif to assets/25native.gif.

cannot compute difference between binary files

Name change from tip/25native.txt to assets/25native.txt.

whitespace changes only

Name change from tip/25original.eps to assets/25original.eps.

whitespace changes only

Name change from tip/25original.gif to assets/25original.gif.

cannot compute difference between binary files

Name change from tip/25original.txt to assets/25original.txt.

whitespace changes only

Name change from tip/26.patch to assets/26.patch.

whitespace changes only

Name change from tip/2workflow.eps to assets/2workflow.eps.

whitespace changes only

Name change from tip/2workflow.fig to assets/2workflow.fig.

whitespace changes only

Name change from tip/2workflow.gif to assets/2workflow.gif.

cannot compute difference between binary files

Name change from tip/2workflow.txt to assets/2workflow.txt.

whitespace changes only

Name change from tip/3example.eps to assets/3example.eps.

whitespace changes only

Name change from tip/3example.fig to assets/3example.fig.

whitespace changes only

Name change from tip/3example.gif to assets/3example.gif.

cannot compute difference between binary files

Name change from tip/3example.txt to assets/3example.txt.

whitespace changes only

Name change from tip/41example.eps to assets/41example.eps.

whitespace changes only

Name change from tip/41example.png to assets/41example.png.

cannot compute difference between binary files

Name change from tip/41example.txt to assets/41example.txt.

whitespace changes only

Name change from tip/4layers1.eps to assets/4layers1.eps.

whitespace changes only

Name change from tip/4layers1.fig to assets/4layers1.fig.

whitespace changes only

Name change from tip/4layers1.gif to assets/4layers1.gif.

cannot compute difference between binary files

Name change from tip/4layers1.txt to assets/4layers1.txt.

whitespace changes only

Name change from tip/4layers2.eps to assets/4layers2.eps.

whitespace changes only

Name change from tip/4layers2.fig to assets/4layers2.fig.

whitespace changes only

Name change from tip/4layers2.gif to assets/4layers2.gif.

cannot compute difference between binary files

Name change from tip/4layers2.txt to assets/4layers2.txt.

whitespace changes only

Name change from tip/4layers3.eps to assets/4layers3.eps.

whitespace changes only

Name change from tip/4layers3.fig to assets/4layers3.fig.

whitespace changes only

Name change from tip/4layers3.gif to assets/4layers3.gif.

cannot compute difference between binary files

Name change from tip/51compare.eps to assets/51compare.eps.

whitespace changes only

Name change from tip/51compare.gif to assets/51compare.gif.

cannot compute difference between binary files

Name change from tip/51compare.txt to assets/51compare.txt.

whitespace changes only

Name change from tip/78pa_cycle.eps to assets/78pa_cycle.eps.

whitespace changes only

Name change from tip/78pa_cycle.fig to assets/78pa_cycle.fig.

whitespace changes only

Name change from tip/78pa_cycle.gif to assets/78pa_cycle.gif.

cannot compute difference between binary files

Name change from tip/78pa_cycle.txt to assets/78pa_cycle.txt.

whitespace changes only

Name change from tip/78tea_terms_relations_1.eps to assets/78tea_terms_relations_1.eps.

whitespace changes only

Name change from tip/78tea_terms_relations_1.fig to assets/78tea_terms_relations_1.fig.

whitespace changes only

Name change from tip/78tea_terms_relations_1.gif to assets/78tea_terms_relations_1.gif.

cannot compute difference between binary files

Name change from tip/78tea_terms_relations_1.txt to assets/78tea_terms_relations_1.txt.

whitespace changes only

Name change from tip/78tea_terms_relations_2.eps to assets/78tea_terms_relations_2.eps.

whitespace changes only

Name change from tip/78tea_terms_relations_2.fig to assets/78tea_terms_relations_2.fig.

whitespace changes only

Name change from tip/78tea_terms_relations_2.gif to assets/78tea_terms_relations_2.gif.

cannot compute difference between binary files

Name change from tip/78tea_terms_relations_2.txt to assets/78tea_terms_relations_2.txt.

whitespace changes only

Name change from tip/7capture.eps to assets/7capture.eps.

whitespace changes only

Name change from tip/7capture.gif to assets/7capture.gif.

cannot compute difference between binary files

Name change from tip/7capture.tcl to assets/7capture.tcl.

whitespace changes only

Name change from tip/7capture.txt to assets/7capture.txt.

whitespace changes only

Name change from tip/7histogram.eps to assets/7histogram.eps.

whitespace changes only

Name change from tip/7histogram.gif to assets/7histogram.gif.

cannot compute difference between binary files

Name change from tip/7histogram.tcl to assets/7histogram.tcl.

whitespace changes only

Name change from tip/7histogram.txt to assets/7histogram.txt.

whitespace changes only

Name change from tip/tipxml.dtd to assets/tipxml.dtd.

whitespace changes only

Name change from tip/valid-html40.gif to assets/valid-html40.gif.

cannot compute difference between binary files

Deleted tip/10000.tip.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
TIP:            10000
Title:          Dummy Proposal for Testing Editing Interfaces
Version:        $Revision: 1.216 $
Author:         Don Porter <[email protected]>
Author:         Andreas Kupries <[email protected]>
Author:         Richard Suchenwirth <[email protected]>
Author:         Kevin B KENNY <[email protected]>
Author:         Jeff Hobbs <[email protected]>
Author:         Vince Darley <[email protected]>
Author:         Fabrice Pardo <[email protected]>
Author:         Joe Mistachkin <[email protected]>
Author:         Donal K. Fellows <[email protected]>
Author:         Mark Janssen <[email protected]>
Author:         Reinhard Max <[email protected]>
Author:         Andreas Leitgeb <[email protected]>
Author:         Andreas Kupries <[email protected]>
Author:         Francois Vogel <[email protected]>
Author:         KEVIN KENNY <[email protected]>
State:          Draft
Type:           Informative
Vote:           Pending
Created:        03-Dec-2000
Post-History:   

~ Abstract

This TIP proposes to complete the separation between string and
numeric comparison operations in [[expr]] and related commands
([[for]], [[if]], [[while]], etc.). It introduces new comparison
operators '''ge''', '''gt''', '''le''', and '''lt''', (along with the
corresponding commands in the '''::tcl::mathop''' namespace), and to
restrict the six operators '''==''', '''>=''', '''>''', '''<=''',
'''<''' and '''!=''' to comparisons of numeric values.

~ Rationale

Tcl throughout its history has had comparison operators that freely
compare numeric and string values. These operators behave as expected
if both their arguments are numeric: they compare values on the real
number line. Hence, 15 < 0x10 < 0b10001. Similarly, if presented with
non-numeric strings, they compare the strings in lexicographic order,
as a programmer might expect: "bambam" < "barney" < "betty" < "fred".

Trouble arises, however, when numeric and non-numeric strings are
compared. The rule for comparison is that mixed-type comparisons like
this are treated as string comparisons. The result is that '''<'''
does not induce an order. There are inconsistent comparison results,
rendering '''<''' and friends worthless for sorting. 0x10 < 0y < 1 < 0x10.

The problems with this inconsistency prompted changes in May of 2000,
introducing '''eq''' and '''ne''' operators that always perform string
comparison. For whatever reason, the four inequality operations never
followed. This leads to pitfalls for the unwary. It's fairly well
entrenched in the Tcl folklore that comparisons other than '''eq'''
and '''ne''' should be reserved for numeric arguments only, and
experienced Tcl programmers know to write:

| if {[string compare $x $y] < 0} { ... }

in place of 

| if {$x < $y} { ... }

~ Proposal

Two things are proposed.

   1. [[8.x]] Four new bareword operators, '''ge''', '''gt''', '''le''' and '''lt''' shall be added to the expression parser and to the '''::tcl::mathop''' command set. They will have precedence identical to the existing operators '''>=''', '''>''', '''<=''' and '''<'''. They will accept string values, and return 0 or 1 according to lexicographic string comparison of their operators. This change is entirely backward compatible (it uses syntax that would previously have been erroneous), and should go in as soon as possible - no later than the next point release, but ideally even in a patchlevel - so that programmers can begin conversion as soon as possible. Use of the  '''==''', '''>=''', '''>''', '''<=''', '''<''', and '''!=''' for comparing non-numeric values shall immediately be deprecated.

   2. [[9.0]] Passing of non-numeric values to the '''==''', '''>=''', '''>''', '''<=''', '''<''', and '''!=''' operators (or to their '''tcl::mathop''' equivalents) shall be forbidden and result in an error being thrown.

~ Discussion

~~ Forcing numeric comparisons in today's Tcl

Programmers who wish to prepare for the change, once the four new operators are in place, can adapt places in their code where they wish to force numeric comparisons by replacing expressions of the form:

| if {$x < $y} { ... }

with

| if {+$x < +$y} { ... }

The second comparison will have the effect of forcing both operands to be numeric, and the existing comparison code will then provide the correct semantics.

~~ Deprecation and compatibility

It may be possible to introduce some sort of per-interpreter or
per-namespace option to control the behaviour of numeric comparisons
when evaluated in the given interpreter or namespace. The author of
this TIP has not investigated how such an option might be implemented,
and encourages those who propose it to do so. Until and unless a
concrete implementation plan emerges from their investigation, the
plan is to leave a "backward compatibility" setting out of scope.

In addition, at least one reader of this TIP has requested a setting
whereby a warning can be delivered that functionality is
deprecated. Since in the past, we have not been able to identify and
standardize a mechanism whereby such warnings could be delivered, this
functionality is also considered to be out of scope.

~~ Rejected alternatives

One possible alternative to excluding non-numeric arguments from the
comparison operators is to change their semantics so that all
non-numeric strings are greater than all numbers. This change would at
least yield a consistent ordering. The ordering that it yields would,
however, be somewhat surprising, and not terribly useful. (It would at
least be compatible with today's scheme for numeric comparisons.)

~~ Objections (and rebuttals)

In out-of-band discussions, several objections were raised. This section
attempts to address them.

   1. Tcl's expression parser has a hard limit of 64 different binary
      operators. This proposal consumes four of them, leaving only 28.
      There is a concern that this is a less-than-effective use of a
      limited resource.

      The limit is self-imposed, in an effort to make the nodes of an
      expression parse tree fit in exactly 16 bytes (or four int's).
      It is far from obvious that this pretty size is actually useful.
      Few expressions are more than a few dozen parse nodes, and
      typical expressions are not parsed multiple times. It appears
      that neither the speed of the parse nor the size of the tree
      will be critical issues in most applications. In any case, we
      still have nearly half the operators left.

   2. ''There is some concern that using barewords for operators was a
      bad idea in the first place.'' The fact that

|               expr {"foo"}

      and

|               set x foo; expr {$x}

      both work, while

|               expr {foo}

      is an invalid bareword is arguably surprising.

      Nevertheless, we have committed to the approach with the 'eq',
      'ne', 'in' and 'ni' operators. These are unlikely to go
      away. Adding 'lt', 'le', 'gt' and 'ge' will make this problem no
      better nor worse.

      Moreover, the language of [[expr]] is not the same as Tcl.
      It does not strip comments, parse into words, and apply Tcl's
      precise substitution rules - and it would be surprising if it did!
      There are other 'little languages' throughout Tcl - regular
      expressions, glob patterns, assembly code, and so on. [[expr]]
      is one among many.

   3. ''There is concern that [[expr]], which was originally intended
      almost exclusively for numeric calculations, is being abused
      with string arguments and possibly string results.''

      The author of this TIP contends that we introduced string values
      to [[expr]] a long time ago, certainly by the time that the
      '''eq''', '''ne''', '''in''' and '''ni''' operations were introduced.
      It is true that the use of numeric conversions in [[expr]]
      is incoherent, as seen in:

|               % proc tcl::mathfunc::cat {args} { join $args {} }
|               % expr {cat(0x1,0x2,"a")}
|               0x10x2a
|               % expr {cat(0x1)}
|               1

      (Bug [[e7c21ed678]] is another manifestation of this general
      problem.) Once again, adding additional string operations
      that behave, with respect to data types, exactly the same
      as ones that are already there will neither fix nor exacerbate
      the general problem.

   4. ''Because [[expr]] has no interpreted form, the operations must
      have bytecode representations. The space of available bytecodes
      is under even more pressure than the space of available operators,
      and must not be squandered on operations that are duplicative
      of already-available functionality such as [[string compare]]''

      The obvious rebuttal is that [[string compare]] is already
      bytecoded. There are no new operations required, merely a compiler
      that is smart enough to emit a short codeburst rather than a
      single bytecode. As an example, the code for the expression

|               {$x lt $y}

      could be:

|    (0) loadScalar1 %v0        # var "x"
|    (2) loadScalar1 %v1        # var "y"
|    (4) strcmp 
|    (5) push1 0        # "0"
|    (7) lt 

      For the other string operators, only the last bytecode in the burst
      would change.  No new bytecode operations are needed. In fact,
      this codeburst is identical code to that generated for

|               {[string compare $x $y] < 0}
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<