Changes On Branch trunk

Login

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

Changes In Branch main Excluding Merge-Ins

This is equivalent to a diff from 9cf338db59 to cf6f1f759d

2024-04-22
19:09
Better count Leaf check-in: cf6f1f759d user: jan.nijtmans tags: main, trunk
19:07
TIP #648/#690/#692 vote done check-in: 68c71d9a55 user: jan.nijtmans tags: main, trunk
2020-11-16
09:19
Rename "trunk" to "main", but with "trunk" as additional propagating tag. Just as already done with other Tcl fossil repositories check-in: ae875d3373 user: jan.nijtmans tags: main, trunk
09:04
Remove 'implementation detail' which is no longer true in current implementation (for a very good reason ....) Closed-Leaf check-in: 9cf338db59 user: jan.nijtmans tags: trunk
2020-11-15
13:51
TIP #584 accepted 6/0/0: YES: 6 (Culler, Decoster, Fellows, Vogel, Walzer). NO: -. PRESENT: -. Vote conclusion email was sent 15-Nov-2020 to Tcl Core list. Implementation was merged the same day. check-in: 5bf709f393 user: fvogel tags: trunk

Changes to doc/help.md.

63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# Adding the new TIP

To add a new TIP,

1. Create a file in the `tip` subdirectory.  Choose a name of the
format `NNN.md`, for example 467.md. The TIP numbering is currently
not enforced by the system, so pick the next unused number based on
the [current TIPs](https://core.tcl-lang.org/tips/doc/trunk/index.md).

1. [TIP 2](https://core.tcl-lang.org/tips/doc/trunk/tip/2.md)
specifies guidelines for writing a TIP.
Write up the text, using [Markdown mark-up](/md_rules) (plenty of
examples are available - pay attention to the header as described below).
**NOTE:** if you already have the TIP text written in the old TIP format,
you can use the `tip2md.tcl` script in the `scripts` subdirectory
to convert it to Markdown.








|

|







63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# Adding the new TIP

To add a new TIP,

1. Create a file in the `tip` subdirectory.  Choose a name of the
format `NNN.md`, for example 467.md. The TIP numbering is currently
not enforced by the system, so pick the next unused number based on
the [current TIPs](https://core.tcl-lang.org/tips/doc/main/index.md).

1. [TIP 2](https://core.tcl-lang.org/tips/doc/main/tip/2.md)
specifies guidelines for writing a TIP.
Write up the text, using [Markdown mark-up](/md_rules) (plenty of
examples are available - pay attention to the header as described below).
**NOTE:** if you already have the TIP text written in the old TIP format,
you can use the `tip2md.tcl` script in the `scripts` subdirectory
to convert it to Markdown.

107
108
109
110
111
112
113
114
115
	    Vote:           Done
	    Post-History:
	------

The meta-data is terminated by `------` and indented with tabs
(for nicer display in fossil).

See [TIP 3](https://core.tcl-lang.org/tips/doc/trunk/tip/3.md) for a detailed
specification of the header format and meaning of each header field.







|

107
108
109
110
111
112
113
114
115
	    Vote:           Done
	    Post-History:
	------

The meta-data is terminated by `------` and indented with tabs
(for nicer display in fossil).

See [TIP 3](https://core.tcl-lang.org/tips/doc/main/tip/3.md) for a detailed
specification of the header format and meaning of each header field.

Changes to index.json.

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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
{"tip": {












	"591":{"url":"./tip/591.md","keywords":"Tk, bindings","created":"13-Nov-2020","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 591: Rotate ttk::notebook window wtih mousewheel on tab","author":["Harald Oehlmann <[email protected].net>"],"is-jest":false},
























































































	"590":{"url":"./tip/590.md","keywords":"package","created":"4-Nov-2020","post-history":"","state":"Draft","tcl-branch":"tip-590","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 590: Recommend lowercase Package Names","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},



	"589":{"url":"./tip/589.md","created":"27-Oct-2020","post-history":"","state":"Withdrawn","tk-branch":"deprecate-bd-bg-fg","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 589: Deprecate \"-fg\", \"-bg\", \"-bd\" options in Tk.","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"588":{"url":"./tip/588.md","keywords":"X11","created":"23-Oct-2020","post-history":"","state":"Draft","tk-branch":"keysym-unicode","tcl-version":"8.7","vote":"In progress","type":"Project","title":"# TIP 588: Unicode for (X11) keysyms","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"587":{"url":"./tip/587.md","keywords":"Tcl source","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"BG, DGP, DKF, FV, JN, KBK, KW, MC, SL","votes-against":"none","created":"20-Sept-2020","title":"# TIP 587: Default utf-8 for source command","post-history":"","tcl-branch":"tip-587","tcl-version":"9.0","vote":"Done","votes-present":"none","is-jest":false},
	"586":{"url":"./tip/586.md","keywords":"binary","created":"18-Sep-2020","post-history":"","state":"Draft","tcl-branch":"tip-586-binary-scan-c-string","tcl-version":"8.7","vote":"In progress","type":"Project","title":"# TIP 586: C String Parsing Support for binary scan","author":["Christian Werner <[email protected]>"],"is-jest":false},
	"585":{"url":"./tip/585.md","keywords":"Tcl Tcl_GetIndexFromObj() Tcl_GetIndexFromObjStruct()","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Francois Vogel <[email protected]>"],"votes-for":"DGP, FV, JN, KW, MC, SL","votes-against":"none","created":"30-Aug-2020","title":"# TIP 585: Promote the INDEX\\_TEMP\\_TABLE flag of Tcl_GetIndexFromObj*() to the public interface","post-history":"","tcl-branch":"tip-585","tcl-version":"8.7","vote":"Done","votes-present":"none","is-jest":false},
	"584":{"url":"./tip/584.md","keywords":"Tk ttk introspection","state":"Final","vote-summary":"Accepted 6/0/0","tk-branch":"tip-584","type":"Project","author":["Francois Vogel <[email protected]>"],"votes-for":"MC, JD, DKF, FV, KW","votes-against":"none","created":"24-Aug-2020","title":"# TIP 584: Better introspection for ttk","post-history":"","tcl-version":"8.7","vote":"Done","votes-present":"none","is-jest":false},
	"583":{"url":"./tip/583.md","keywords":"Tcl","created":"15-Aug-2020","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 583: Add Option to Limit Depth of Execution Step Traces for Procs","author":["Eric Taylor <[email protected]>"],"is-jest":false},
	"582":{"url":"./tip/582.md","keywords":"Tcl","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, KBK, KW, MC, SL, FV","votes-against":"none","created":"13-Aug-2020","title":"# TIP 582: Comments in Expressions","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-582","votes-present":"none","is-jest":false},
	"581":{"url":"./tip/581.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"BG, DKF, FV, JD, JN, KBK, KW, MC, SL","created":"17-July-2020","title":"# TIP 581: Master/Slave","post-history":"","vote":"Done","tcl-version":"8.6","tcl-branch":"tip-581","votes-present":"none","is-jest":false},
	"580":{"url":"./tip/580.md","keywords":"export","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","tk-version":"8.7","tk-branch":"tip-580","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"BG, DKF, FV, JD, JN, KBK, KW, MC, SL","created":"14-July-2020","title":"# TIP 580: Export Tk_GetDoublePixelsFromObj and 5 more","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"579":{"url":"./tip/579.md","keywords":"safe interp auto_path access_path","created":"07-Jul-2020","post-history":"","state":"Draft","tcl-branch":"tip-579-8-7","tcl-version":"8.7","version":"25-Jul-2020","vote":"Pending","type":"Project","title":"# TIP 579: Improved auto_path for Safe Base interpreters","author":["Keith Nash <k.j.nash@usa.net>"],"is-jest":false},
	"578":{"url":"./tip/578.md","keywords":"Tcl index","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"AK, DKF, FV, JN, KW, SL","created":"10-June-2020","title":"# TIP 578: Death to TCL_DBGX","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"death-to-dbgx","votes-present":"none","is-jest":false},
	"577":{"url":"./tip/577.md","keywords":"Tcl index","created":"8-June-2020","post-history":"","state":"Draft","tk-branch":"strict-index","tcl-version":"8.7","type":"Project","title":"# TIP 577: Enhanced index values for Tk","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"576":{"url":"./tip/576.md","keywords":"Tk listbox","created":"25-May-2020","post-history":"","state":"Draft","tk-version":"8.7","tcl-version":"8.7","type":"Project","title":"# TIP 576: Poor-mans Table listbox enhancement","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"575":{"url":"./tip/575.md","state":"Draft","tcl-branch":"tip-575","tcl-version":"8.7","type":"Project","title":"# TIP 575: Switchable Tcl\\_UtfCharComplete()/Tcl\\_UtfNext()/Tcl\\_UtfPrev()","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"574":{"url":"./tip/574.md","keywords":"Tk Ttk treeview tag","state":"Final","vote-summary":"Accepted 7/0/0","type":"Project","tk-branch":"bug-1bb2f1d7ab","author":["Emiliano Gavilan <[email protected]>, Francois Vogel <[email protected]>"],"votes-against":"none","votes-for":"MC, JD, DKF, BG, KBK, SL, FV","created":"8-May-2020","title":"# TIP 574: Add a 'tag delete' command to the ttk::treeview widget","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"573":{"url":"./tip/573.md","state":"Draft","tcl-branch":"tip-573","tcl-version":"8.7","type":"Project","title":"# TIP 573: Surrogates are invalid","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"572":{"url":"./tip/572.md","state":"Draft","tcl-version":"9.0","type":"Project","title":"# TIP 572: Implement a mechanism to specify the procedure/lambda/method argument call types (Evaluation strategy)","author":["Rami Khaldi <[email protected]>"],"is-jest":false},
	"571":{"url":"./tip/571.md","state":"Withdrawn","tcl-version":"8.6","type":"Project","title":"# TIP 571: Make TclX's profiler work properly with Tcl 8.6","author":["Rami Khaldi <[email protected]>"],"is-jest":false},
	"570":{"url":"./tip/570.md","keywords":"Tk, bindings","created":"18-Mar-2020","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 570: Gesture Support for Finger Scrolling and \"Pinch to Zoom\"","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"569":{"url":"./tip/569.md","keywords":"lint","state":"Final","vote-summary":"Accepted 8/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"DP, JD, KK, KW, SL, FV, DF, JN","votes-against":"none","created":"6-Mar-2020","title":"# TIP 569: Eliminate Comments That Serve Lint","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"568":{"url":"./tip/568.md","keywords":"bytearray","created":"4-Mar-2020","post-history":"","state":"Draft","tcl-branch":"dgp-properbytearray","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 568: Revise ByteArray Routines To Support Proper Value Extraction","author":["Don Porter <dgp@users.sourceforge.net>"],"is-jest":false},
	"567":{"url":"./tip/567.md","keywords":"Tcl, TclOO, slots","created":"22-Feb-2020","post-history":"","state":"Draft","tcl-branch":"tip-567","tcl-version":"8.7","vote":"In progress","type":"Project","title":"# TIP 567: Add Operation to Support Set-like Slots","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"566":{"url":"./tip/566.md","keywords":"lset","created":"19-Feb-2020","post-history":"","state":"Withdrawn","tcl-branch":"lset-index","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 566: Index usage in lset","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"565":{"url":"./tip/565.md","keywords":"Tk canvas","created":"10-Feb-2020","post-history":"","state":"Final","tcl-branch":"bug-3552805fff","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 565: Gracefully ignore non-existent tags in canvas raise/lower","author":["Francois Vogel <[email protected]>"],"is-jest":false},
	"564":{"url":"./tip/564.md","keywords":"Tk Ttk x11 font size","created":"9-Feb-2020","post-history":"","state":"Final","tcl-branch":"bug-dccd82bdc7","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 564: Specify ttk font sizes in points on X11","author":["Francois Vogel <[email protected]>"],"is-jest":false},
	"563":{"url":"./tip/563.md","keywords":"Tk, bindings","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","tk-branch":"tip-563-scrollbar-scrollwheel","author":["Harald Oehlmann <[email protected]>"],"votes-for":"FV, SL, KK, JD, BG, JN, KW","votes-against":"none","created":"02-Feb-2020","title":"# TIP 563: Scrollwheel on Horizontal Scrollbar Scrolls Without Shift too","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"562":{"url":"./tip/562.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 3/0/4","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"DGP, DKF, JN","created":"31-Jan-2020","title":"# TIP 562: Deprecate channel types 1-4","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"deprecate-channel-type-1-4","votes-present":"FV, KBK, KW, SL","is-jest":false},
	"561":{"url":"./tip/561.md","keywords":"Tk","created":"23-Jan-2020","post-history":"","state":"Draft","tk-branch":"tip-561","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 561: Add console Command to Unix","author":["Eric Taylor <[email protected]>"],"is-jest":false},
	"560":{"url":"./tip/560.md","keywords":"Tk, TclOO, configuration, properties, options","created":"23-Jan-2020","post-history":"","state":"Draft","tk-branch":"tip-560","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 560: Megawidget Configure/Property Support","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"559":{"url":"./tip/559.md","keywords":"Tcl, result","state":"Final","vote-summary":"Accepted 8/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-against":"none","votes-for":"DP, JD, MC, KW, SL, FV, DF, JN","created":"13-Jan-2020","title":"# TIP 559: Eliminate public routine `Tcl_FreeResult`","post-history":"","tcl-version":"9.0","vote":"Done","tcl-branch":"tip-599","votes-present":"none","is-jest":false},
	"558":{"url":"./tip/558.md","keywords":"Tcl, TclOO, properties","created":"22-Dec-2019","post-history":"","state":"Draft","tcl-branch":"tip-558","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 558: Basic Configure Support for TclOO","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"557":{"url":"./tip/557.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 2/0/3","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"JN, KW","created":"13-Dec-2019","title":"# TIP 557: C++ support for Tcl","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"cplusplus","votes-present":"DGP, FV, SL","is-jest":false},
	"556":{"url":"./tip/556.md","keywords":"Tk","created":"26-Nov-2019","post-history":"","state":"Deferred","tk-branch":"tip-556","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 556: Add oo like widgets to Tk","author":["René Zaumseil <[email protected]>"],"is-jest":false},
	"555":{"url":"./tip/555.md","created":"19-Nov-2019","obsoleted-by":"584","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 555: Enable listing of layouts in ttk::Themes","author":["Manfred Rosenberger<[email protected]>"],"is-jest":false},
	"554":{"url":"./tip/554.md","created":"14-Nov-2019","post-history":"","state":"Draft","tcl-branch":"tip-554","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 554: Library file system for Tcl and Tk core using an C-based VFS","author":["Sean Woods <[email protected]>","Roy Keene"],"is-jest":false},
	"553":{"url":"./tip/553.md","keywords":"Tk, label, listbox, entry","created":"07-Nov-2019","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 553: Ellipses: the Alternative to Scrolling and Wrapping","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"552":{"url":"./tip/552.md","keywords":"Tk, treeview","created":"19-Sep-2019","post-history":"","state":"Draft","tk-branch":"pspjuth-treeview","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 552: Extended treeview functionality.","author":["Peter Spjuth <[email protected]>"],"is-jest":false},
	"551":{"url":"./tip/551.md","keywords":"numbers, readability","state":"Final","vote-summary":"Accepted 6/0/2","vote-against":"none","vote-for":"BG,KW,MC,FV,JN,SL","type":"Project","author":["Eric Taylor <[email protected]>"],"created":"16-Sep-2019","title":"# TIP 551: Permit underscore in numerical literals in source code","vote-present":"DP,KK","sponsor":"Brian Griffin <[email protected]>","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-551","is-jest":false},
	"550":{"url":"./tip/550.md","keywords":"Tcl, memory","created":"11-Jun-2019","post-history":"","state":"Draft","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 550: Garbage Collection for TclOO","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"549":{"url":"./tip/549.md","keywords":"Tcl","created":"7-June-2019","post-history":"","state":"Draft","tcl-branch":"tip-549","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 549: Make configure --enable-64bit the default","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"548":{"url":"./tip/548.md","keywords":"Tcl","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"JN, DKF, KW, KBK","vote-results":"4/2/0 accepted","created":"3-June-2019","title":"# TIP 548:Support `wchar_t` conversion functions and deprecate `Tcl_WinUtfToTChar()` and `Tcl_WinTCharToUtf()`","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-548","votes-present":"DGP, SL","discussions-to":"Tcl Core list","is-jest":false},
	"547":{"url":"./tip/547.md","keywords":"Tcl","created":"31-May-2019","post-history":"","state":"Final","tcl-branch":"tip-547","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 547: New encodings: UTF-16, UCS-2","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"546":{"url":"./tip/546.md","keywords":"Tcl, traces","created":"20-May-2019","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 546: Typedefs to Support Source-Compatible Migration","author":["Don Porter <[email protected]>"],"is-jest":false},
	"545":{"url":"./tip/545.md","keywords":"Tk, image","state":"Final","type":"Project","tk-branch":"tip-545-svg-options","author":["Harald Oehlmann <[email protected]>"],"vote-results":"6/0/0 accepted","votes-for":"BG, DKF, FV, KW, JN, MC","votes-against":"none","created":"19-May-2019","title":"# TIP 545: image photo SVG options: remove -unit and add target height/width option","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"544":{"url":"./tip/544.md","keywords":"Tcl","created":"15-May-2019","post-history":"","state":"Final","tcl-branch":"tip-544","vote":"Done","tcl-version":"8.7","type":"Project","title":"# TIP 544: Export TclGetIntForIndex()","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"543":{"url":"./tip/543.md","keywords":"Tcl, traces","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-against":"none","votes-for":"DP, JD, MC, KW, SL, KK, FV, DF, JN","created":"10-May-2019","title":"# TIP 543: Eliminate `TCL_INTERP_DESTROYED` flag value","post-history":"","tcl-version":"9.0","vote":"Done","tcl-branch":"tip-543-9","votes-present":"none","is-jest":false},
	"542":{"url":"./tip/542.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"FV, JN, KBK, KW, MC, SL","created":"10-May-2019","title":"# TIP 542:Support for switchable Full Unicode support","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"utf-max","votes-present":"none","discussions-to":"Tcl Core list","is-jest":false},
	"541":{"url":"./tip/541.md","keywords":"Tcl","created":"8-May-2019","post-history":"","state":"Final","tcl-branch":"bug-2858503fff","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 541: Add support for 'end' index in ttk::combobox current","author":["Francois Vogel <[email protected]>"],"is-jest":false},
	"540":{"url":"./tip/540.md","keywords":"Tcl, Unix, pipeline","created":"03-May-2019","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 540: Add -signal Channel Configure Option to POSIX Pipes","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"539":{"url":"./tip/539.md","tcl-ticket":"2370575","keywords":"Tcl, dict filter, set intersection","created":"27-Nov-2008","obsoleted-by":"341","post-history":"","state":"Withdrawn","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 539: Multiple dict filter patterns","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"538":{"url":"./tip/538.md","keywords":"Tcl","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","vote-results":"5/0/0 accepted","votes-for":"JN, KBK, KW, MC, SL","created":"9-April-2019","title":"# TIP 538: Externalize libtommath","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"digit-bit-60","votes-present":"none","is-jest":false},
	"537":{"url":"./tip/537.md","keywords":"Tcl","created":"7-April-2019","post-history":"","state":"Final","tcl-branch":"regexp-api-64bit","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 537: Enable 64-bit indexes in regexp matching","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"536":{"url":"./tip/536.md","keywords":"Tk","state":"Final","type":"Project","tk-branch":"mac_services","author":["Kevin Walzer <[email protected]>"],"votes-for":"DKF, BG, JN, SL, AK","votes-against":"none","created":"29-March-2019","title":"# TIP 536: Improvements to Mac-specific IPC in Tk","post-history":"","vote":"Done","tcl-version":"8.6","votes-present":"KBK, FV","is-jest":false},
	"535":{"url":"./tip/535.md","keywords":"Tcl","created":"10-March-2019","post-history":"","state":"Final","tcl-branch":"scale-tick-format","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 535: Remove trailing zeroes in scale ticks","author":["François Vogel <[email protected]>"],"is-jest":false},
	"534":{"url":"./tip/534.md","keywords":"Tcl","created":"02-March-2019","post-history":"","state":"Draft","tcl-branch":"dkf-experimental-fast-number-hash","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 534: Faster Hashing of Small Integers","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"533":{"url":"./tip/533.md","keywords":"Tk, menubutton","":"","[menu man page](https":"//www.tcl.tk/man/tcl/TkCmd/menu.htm).","state":"Final","type":"Project","tk-branch":"bug-70e531918e","author":["Marc Culler"],"three arguments":"two coordinates and an index.  That function uses the","[70e531918e](https":"//core.tcl-lang.org/tk/tktview/70e531918e6d99cbdd8b527386fec15872c64216).","created":"13-Jan-2019","by calling <b>":":tk::PostOverPoint</b> which, like the proposed extension, accepts","a method <b>[nsmenu popupmenupositioningitem":"atLocation:inView]</b> which draws the","title":"# TIP 533: Extension of the menu post command","the [bug-70e531918e](https":"//core.tcl-lang.org/tk/timeline?r=bug-70e531918e)","post-history":"","vote":"Done","tcl-version":"8.6","is-jest":false},
	"532":{"url":"./tip/532.md","manual (`man bind`) says":"","moreover the following issues have been solved":"","":"","keywords":"Tk, bind, event, event loop","this has been observed in applications [scid](http":"//scid.sourceforge.net), and","state":"Final","says (`man bind`)":"","type":"Project","tk-branch":"bug6e8afe516d","author":["Gregor Cramer <[email protected]>"],"(same with applications [scid](http":"//scid.sourceforge.net), and","5. legacy implementation cannot handle homogeneous equal sequences properly, see this script":"","votes-for":"DKF, BG, KBK, JN, FV, SL","votes-against":"none","2. immediately after startup of application [scidb](http":"//scidb.sourceforge.net)","created":"09-Jan-2019","title":"# TIP 532: Re-implementation of event loop processing","how to choose the most specific binding, has to be changed":"","4. see following code":"","can be expressed in a different way":"","this problem occurs often in application [scidb](http":"//scidb.sourceforge.net),","post-history":"","vote":"Done","tcl-version":"8.6","[scid vs pc](http":"//scidvspc.sourceforge.net).","the following problems, caused by event ring overflow, have been solved":"","votes-present":"DGP, AK","is-jest":false},
	"531":{"url":"./tip/531.md","keywords":"Tcl, stubs","":"","state":"Draft","type":"Project","author":["Shannon Noe <[email protected]>"],"created":"14-Dec-2018","title":"# TIP 531: Static Tcl Interpreter Creation Function","post-history":"","vote":"Pending","tcl-version":"8.7","tcl-branch":"tip-531","/usr/local/include/tcl8.6/tcldecls.h":"#define Tcl_CreateInterp \\","is-jest":false},
	"530":{"url":"./tip/530.md","created":"13-Dec-2018","post-history":"","state":"Draft","tcl-branch":"tip-530","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 530: Control over performance impact of TIP 280","author":["Leon Manukyan <[email protected]>"],"is-jest":false},
	"529":{"url":"./tip/529.md","keywords":"Tk, image","created":"07-Dec-2018","state":"Draft","tk-branch":"tip-529-image-metadata","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 529: Add metadata dict property to tk photo image","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"528":{"url":"./tip/528.md","state":"Final","type":"Project","tk-branch":"offsetof","author":["Jan Nijtmans <[email protected]>"],"votes-for":"DKF, BG, KBK, JN, DGP, FV, SL, AK","votes-against":"none","created":"05-Dec-2018","title":"# TIP 528: Deprecate Tk_Offset()","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"527":{"url":"./tip/527.md","state":"Final","type":"Project","author":["Sergey G. Brester <[email protected]>"],"votes-against":"None","vote-results":"5/0 accepted","votes-for":"KBK, DKF, AK, SL, FV","created":"26-Nov-2018","title":"# TIP 527: New measurement facilities in TCL: New command timerate","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"sebres-8-6-timerate","discussions-to":"news:comp.lang.tcl","is-jest":false},
	"526":{"url":"./tip/526.md","created":"08-Nov-2018","post-history":"","state":"Draft","tcl-branch":"tip-526","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 526: Make [expr] Only Accept One Argument","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"525":{"url":"./tip/525.md","keywords":"Tcl, testing, continuous integration","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"vote-results":"8/0/0 accepted","votes-for":"KBK, SL, AF, DGP, FV, DKF, AK, JN","votes-against":"none","created":"24-Oct-2018","title":"# TIP 525: Make Tcltest Report Overall Success in a Machine-Readable Way","post-history":"","vote":"Done","tcl-version":"8.5","votes-present":"none","is-jest":false},
	"524":{"url":"./tip/524.md","keywords":"Tcl, object orientation, customization","state":"Final","vote-summary":"Accepted 2/0/4","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-against":"none","votes-for":"DKF, JN","created":"23-Oct-2018","title":"# TIP 524: Custom Definition Dialects for TclOO","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-524","votes-present":"BG, KBK, FV, SL","is-jest":false},
	"523":{"url":"./tip/523.md","keywords":"queue, stack, pop","state":"Final","vote-summary":"Accepted 7/0/0","type":"Project","author":["Peter Spjuth <[email protected]>"],"votes-against":"none","votes-for":"DKF, BG, KBK, JN, DGP, FV, SL","created":"22-Oct-2018","title":"# TIP 523: New lpop command","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-523","votes-present":"none","is-jest":false},
	"522":{"url":"./tip/522.md","keywords":"tcltest, error codes","state":"Final","type":"Project","author":["Peter Spjuth <[email protected]>"],"vote-results":"8/0/0 accepted","votes-for":"KBK, SL, AF, DGP, FV, DKF, AK, JN","votes-against":"none","created":"22-Oct-2018","title":"# TIP 522: Test error codes with Tcltest","post-history":"","tcl-branch":"tip-522","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"521":{"url":"./tip/521.md","keywords":"Tcl, floating point, NaN, not a number","state":"Final","type":"Project","author":["Kevin B. Kenny <[email protected]>"],"votes-for":"DKF, BG, KBK, JN, DGP, FV, AK","votes-against":"none","created":"21 October 2018","title":"# TIP 521: Floating Point Classification Functions","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-521","votes-present":"SL","is-jest":false},
	"520":{"url":"./tip/520.md","keywords":"Tcl, floating point, NaN, not a number","created":"18 October 2018","post-history":"","state":"Draft","tcl-branch":"tip-520","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 520: Make NaN Quiet","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"519":{"url":"./tip/519.md","":"","keywords":"TclOO","state":"Final","vote-summary":"Accepted 4/0/2","this tip proposes to extend the `method` subcommand of the `oo":":define` command","type":"Project","author":["Pietro Cerutti <[email protected]>"],"votes-against":"none","votes-for":"DKF, KBK, JN, SL","follows":"","oo":":define RPCClient {","created":"18-Oct-2018","title":"# TIP 519: Inline export/unexport option to TclOO method definition","the class definition in the previous example would then be as follows":"","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-519","votes-present":"BG, FV","is-jest":false},
	"518":{"url":"./tip/518.md","keywords":"Tk","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","tk-branch":"tip518-event-last-child-unmanaged","author":["Harald Oehlmann <[email protected]>"],"votes-against":"none","votes-for":"DKF, BG, KBK, JN, FV, SL","created":"22-Sep-2018","title":"# TIP 518: Virtual Event when Last Child is not Managed any more","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"517":{"url":"./tip/517.md","keywords":"tk menu","created":"13-Sept-2018","post-history":"","state":"Final","tk-branch":"tip-517","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 517: Add -activerelief Configuration Option to the menu widget","author":["François Vogel <[email protected]>"],"is-jest":false},
	"516":{"url":"./tip/516.md","keywords":"Tcl, TclOO","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"vote-results":"4/0/5 accepted","votes-for":"DKF, JN, JD, AK","votes-against":"none","created":"7-Sept-2018","title":"# TIP 516: More OO Slot Operations","post-history":"","tcl-branch":"tip-516","vote":"Done","tcl-version":"8.7","votes-present":"BG, KBK, DGP, FV, SL","is-jest":false},
	"515":{"url":"./tip/515.md","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"vote-results":"8/0/1 accepted","votes-for":"DKF, KBK, JN, JD, DGP, FV, SL, AK","votes-against":"none","created":"7-Sept-2018","title":"# TIP 515: Level Value Reform","post-history":"","tcl-branch":"tip-515","vote":"Done","tcl-version":"8.7","votes-present":"BG","is-jest":false},
	"514":{"url":"./tip/514.md","keywords":"Tcl","created":"20-Aug-2018","post-history":"","state":"Final","tcl-branch":"tip-514","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 514: Platform differences in handling int/wide","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"513":{"url":"./tip/513.md","keywords":"Tcl,data structure","created":"02-Aug-2017","post-history":"","state":"Draft","implementation-url":"https://core.tcl-lang.org/tips/doc/trunk/attach/513/agendas.tcl","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 513: Better support for 'agendas' as arrays, dictionaries or lists","author":["Florian Murr <[email protected]>"],"is-jest":false},
	"512":{"url":"./tip/512.md","keywords":"Tcl","created":"25-June-2018","post-history":"","state":"Final","tcl-branch":"tip-512","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 512: No stub for Tcl_SetExitProc()","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"511":{"url":"./tip/511.md","keywords":"Tcl,threads","state":"Accepted","type":"Project","author":["Christian Werner <[email protected]>"],"vote-results":"4/0/5 accepted","votes-for":"DKF, BG, KBK, JN, JD, SL","votes-against":"none","created":"14-June-2018","title":"# TIP 511: Implement Tcl_AsyncMarkFromSignal()","post-history":"","implementation-url":"https://www.androwish.org/index.html/info/40790af1e8e4ec9f","vote":"Done","tcl-version":"8.7","votes-present":"DGP, FV, AK","is-jest":false},
	"510":{"url":"./tip/510.md","":"might be to just co-distribute, just as TDBC is with Tcl","keywords":"Tk","state":"Deferred","vote-summary":"Rejected 1/3/1","type":"Project","tk-branch":"tip-510","author":["René Zaumseil <[email protected]>"],"votes-against":"KBK, JN, FV","votes-for":"DKF","created":"5-Jun-2018","vote-comments":"code not yet ready, needs porting to macOS; alternate","title":"# TIP 510: Add Rbc and Tkpath widgets to Tk","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"BG","is-jest":false},
	"509":{"url":"./tip/509.md","keywords":"Tcl,threads","state":"Final","type":"Project","author":["Frédéric Bonnet <[email protected]>"],"vote-results":"8/0/1 accepted","votes-for":"DKF, KBK, JN, JD, DGP, FV, SL, AK","votes-against":"none","created":"24-May-2018","title":"# TIP 509: Implement reentrant mutexes on all platforms","post-history":"","tcl-branch":"tip-509","vote":"Done","tcl-version":"8.7","votes-present":"BG","is-jest":false},
	"508":{"url":"./tip/508.md","keywords":"Tcl,array","state":"Final","type":"Project","author":["Frédéric Bonnet <[email protected]>"],"vote-results":"9/0/0 accepted","votes-for":"DKF, BG, KBK, JN, JD, DGP, FV, SL, AK","votes-against":"none","created":"13-May-2018","title":"# TIP 508: New subcommand [array default]","post-history":"","tcl-branch":"tip-508","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"507":{"url":"./tip/507.md","keywords":"Tk","state":"Final","type":"Project","tk-branch":"tip-507","author":["René Zaumseil <[email protected]>"],"votes-for":"DKF, JN, FV, SL, AK","votes-against":"none","created":"9-May-2018","title":"# TIP 507: Include simple SVG support with nanosvg","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"506":{"url":"./tip/506.md","state":"Final","vote-summary":"Accepted 5/0/1","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"DKF, KBK, JN, DGP, SL","votes-against":"none","created":"30-Mar-2018","title":"# TIP 506: Purge RefCount Macros","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-506","votes-present":"BG, FV","is-jest":false},
	"505":{"url":"./tip/505.md","state":"Final","type":"Project","author":["Don Porter <[email protected]>"],"vote-results":"8/0/1 accepted","votes-for":"DKF, KBK, JN, JD, DGP, FV, SL, AK","votes-against":"none","created":"26-Mar-2018","title":"# TIP 505: Make [lreplace] Accept All Out-of-Range Index Values","post-history":"","tcl-branch":"tip-505","vote":"Done","tcl-version":"8.6.9","votes-present":"BG","is-jest":false},
	"504":{"url":"./tip/504.md","keywords":"Tcl,string,insert","state":"Final","type":"Project","author":["Don Porter <[email protected]>"],"votes-against":"none","votes-for":"DKF, JN, DGP, FV, SL, AK","created":"21-Mar-2018","obsoletes":"475","title":"# TIP 504: New subcommand [string insert]","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"dgp-string-insert","votes-present":"none","is-jest":false},
	"503":{"url":"./tip/503.md","created":"05-Feb-2018","post-history":"","state":"Final","tcl-branch":"tip-503","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 503: End Tcl 8.3 Source Compatibility Support","author":["Don Porter <[email protected]>"],"is-jest":false},
	"502":{"url":"./tip/502.md","created":"26-Feb-2018","post-history":"","state":"Final","tcl-branch":"tip-502","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 502: Index Value Reform","author":["Don Porter <[email protected]>"],"is-jest":false},
	"501":{"url":"./tip/501.md","keywords":"Tcl,string","state":"Final","vote-summary":"Accepted 5/0/1","type":"Project","author":["Sean Woods <[email protected]>"],"votes-against":"none","votes-for":"DKF, KBK, JN, FV, SL","created":"12-Feb-2018","title":"# TIP 501: string is dict","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-501","votes-present":"BG","is-jest":false},
	"500":{"url":"./tip/500.md","keywords":"Tcl, object orientation, visibility","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, AF, JD, SL, AK, KBK","votes-against":"none","created":"10-Feb-2018","title":"# TIP 500: Private Methods and Variables in TclOO","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-500","is-jest":false},
	"499":{"url":"./tip/499.md","keywords":"msgcat, oo","created":"07-Dec-2017","post-history":"","state":"Final","tcl-branch":"tip499-msgcat-custom-preferences","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 499: Custom locale search list for msgcat","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"498":{"url":"./tip/498.md","keywords":"tcl","created":"18-Jan-2016","post-history":"","state":"Draft","tcl-branch":"bug-e593adf103-core-8","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 498: Simplify Tcl_DeleteNamespace","author":["Nathan Coulter <tcl[email protected]>"],"is-jest":false},
	"497":{"url":"./tip/497.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 6/0/1","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"DKF, FV, JN, KBK, KW, SL","created":"23-Jan-2018","title":"# TIP 497: Full support for Unicode planes 1-16.","post-history":"","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-497","votes-present":"DGP","discussions-to":"Tcl Core list","is-jest":false},
	"496":{"url":"./tip/496.md","keywords":"Tk","created":"17-Jan-2018","post-history":"","state":"Final","tk-branch":"tip-496","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 496: Display hints in ::entry ::spinbox ::ttk::entry ::ttk::spinbox and ::ttk::combobox","author":["René Zaumseil <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"495":{"url":"./tip/495.md","keywords":"Tcl,build system,extension building","created":"14-Jan-2018","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 495: Tcl Based Build System for TEA projects","author":["Sean Woods <[email protected]>"],"is-jest":false},
	"494":{"url":"./tip/494.md","keywords":"tcl","created":"29-Dec-2017","post-history":"","state":"Final","tcl-branch":"memory-API","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 494: More use of size_t in Tcl 9","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"493":{"url":"./tip/493.md","created":"29-Dec-2017","post-history":"","state":"Final","tcl-branch":"tip-493","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 493: Cease Distribution of http 1.0","author":["Don Porter <[email protected]>"],"is-jest":false},
	"492":{"url":"./tip/492.md","keywords":"tk busy","created":"19-Dec-2017","post-history":"","state":"Final","tk-branch":"tip-492","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 492: Introspection for 'tk busy'","author":["François Vogel <[email protected]>"],"is-jest":false},
	"491":{"url":"./tip/491.md","keywords":"threads","created":"11-Dec-2017","post-history":"","state":"Final","tcl-branch":"tip-491","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 491: Threading Support: phasing out non-threaded builds","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"490":{"url":"./tip/490.md","keywords":"msgcat, oo","created":"07-Dec-2017","post-history":"","state":"Final","tcl-branch":"tip490-msgcat-oo-2","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 490: msgcat for TclOO","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"489":{"url":"./tip/489.md","keywords":"canvas, image","created":"02-Dec-2017","post-history":"","state":"Final","tk-branch":"canvas_image","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 489: Add image widget command to the Tk canvas","author":["Scott Pitcher <[email protected]>"],"is-jest":false},
	"488":{"url":"./tip/488.md","keywords":"Tcl, string representation, floating-point","created":"24-Nov-2017","post-history":"","state":"Final","tcl-branch":"tip-488","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 488: Remove tcl_precision","author":["Arjen Markus <[email protected]>"],"is-jest":false},
	"487":{"url":"./tip/487.md","created":"20-Nov-2017","post-history":"","state":"Final","tcl-branch":"tip-487","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 487: Stop support for Pre-XP Windows","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"486":{"url":"./tip/486.md","created":"13-Nov-2017","post-history":"","state":"Draft","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 486: Thread 3.0 is for Tcl 9","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"485":{"url":"./tip/485.md","created":"08-Nov-2017","post-history":"","state":"Final","tcl-branch":"tip-485","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 485: Remove Deprecated API","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"484":{"url":"./tip/484.md","keywords":"Tcl","created":"06-Nov-2017","post-history":"","state":"Final","tcl-branch":"no-wideint","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 484: Merge 'int' and 'wideInt' Obj-type to a single 'int'","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"483":{"url":"./tip/483.md","keywords":"Tk, configuration","created":"03-Nov-2017","post-history":"","state":"Final","tk-branch":"tk-stu-pkg","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 483: Improved TIP #59 implementation for Tk","author":["Stuart Cassoff <[email protected]>"],"is-jest":false},
	"482":{"url":"./tip/482.md","keywords":"Tk, demos, configuration","created":"03-Nov-2017","post-history":"","state":"Final","tk-branch":"tk-stu-pkg","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 482: Record Tk demo directory information","author":["Stuart Cassoff <[email protected]>"],"is-jest":false},
	"481":{"url":"./tip/481.md","keywords":"Tcl","created":"27-Oct-2017","post-history":"","state":"Draft","tcl-branch":"tip-481","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 481: `Tcl_GetStringFromObj()` with `size_t` length parameter","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"480":{"url":"./tip/480.md","keywords":"assertion, pragma, type, alias, compilation","created":"25-Oct-2017","post-history":"","state":"Draft","tcl-branch":"tip-480","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 480: Type and Alias Assertions for Tcl","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"479":{"url":"./tip/479.md","keywords":"Tcl,procedure,argument handling","created":"23-Oct-2017","post-history":"","state":"Draft","tcl-branch":"tip479","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 479: Add Named Procedures as a New Command in Tcl (dictargs::proc)","author":["Sean Woods <[email protected]>"],"is-jest":false},
	"478":{"url":"./tip/478.md","keywords":"Tcl","state":"Final","type":"Project","author":["Gerald Lester <[email protected]>","Donal K. Fellows <[email protected]>"],"votes-for":"DKF, AK, JD, SL, JN","votes-against":"none","created":"18-Oct-2017","title":"# TIP 478: Add Expected Class Level Behaviors to oo::class","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-478","is-jest":false},
	"477":{"url":"./tip/477.md","keywords":"Windows nmake build","created":"30-Sep-2017","post-history":"","state":"Final","tcl-branch":"vc-reform","tcl-version":"8.6.8","vote":"Done","type":"Project","title":"# TIP 477: Modernize the nmake build system","author":["Ashok P. Nadkarni <[email protected]>"],"is-jest":false},
	"476":{"url":"./tip/476.md","keywords":"scan, printf","created":"27-Sep-2017","post-history":"PM","state":"Final","tcl-branch":"z_modifier","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 476: Scan/Printf format consistency","author":["Jan Nijtmans ([email protected])"],"is-jest":false},
	"475":{"url":"./tip/475.md","keywords":"Tcl,string,insert","created":"22-Sep-2017","post-history":"","state":"Rejected","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 475: Add [string insert] Command and C API","author":["Andy Goth ([email protected])"],"is-jest":false},
	"474":{"url":"./tip/474.md","keywords":"Tk, events","state":"Final","vote-summary":"Accepted 7/0/2","tk-branch":"tip474","type":"Project","author":["Arjen Markus <[email protected]>","Jan Nijtmans <[email protected]>"],"votes-for":"BG, DKF, FV, JN, KW, MC, SL","votes-against":"none","created":"25-Aug-2017","title":"# TIP 474: Treat the mouse wheel events in a uniform way","post-history":"PM","vote":"Done","tcl-version":"8.7","votes-present":"DGP, KBK","is-jest":false},
	"473":{"url":"./tip/473.md","keywords":"Tcl, missing functionality, bugfix","created":"06-Jun-2017","post-history":"","state":"Final","tcl-branch":"oo-copy-ns","vote":"Done","tcl-version":"8.6.7","type":"Project","title":"# TIP 473: Allow a Defined Target Namespace in oo::copy","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"472":{"url":"./tip/472.md","created":"25-May-2017","post-history":"","state":"Final","tcl-branch":"bsg-0d-radix-prefix","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 472: Add Support for 0d Radix Prefix to Integer Literals","author":["Venkat Iyer <[email protected]>","Brian Griffin <[email protected]>"],"is-jest":false},
	"471":{"url":"./tip/471.md","":"rethink it (talk to TCT to help resolve)","state":"Draft","vote-summary":"Rejected 2/2/3","type":"Project","author":["Mathieu Lafon <[email protected]>"],"votes-for":"DKF, JN","votes-against":"KBK, DGP","created":"05-May-2017","vote-comments":"feature provides insufficient information to be useful,","title":"# TIP 471: Add [info linkedname] Introspection Command","post-history":"","tcl-version":"8.7","vote":"Done","tcl-branch":"info-linkedname","votes-present":"BG, FV, SL","is-jest":false},
	"470":{"url":"./tip/470.md","keywords":"TclOO, metaprogramming","created":"23-Apr-2017","post-history":"","state":"Final","tcl-branch":"tip-470","vote":"Done","tcl-version":"8.7","type":"Project","title":"# TIP 470: Reliable Access to OO Definition Context Object","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"469":{"url":"./tip/469.md","keywords":"Tcl,event handling","created":"16-Apr-2017","post-history":"","state":"Draft","tcl-branch":"tip-469","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 469: A Callback for Channel-Exception Conditions","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"468":{"url":"./tip/468.md","keywords":"Tcl, socket, SOMAXCONN","created":"03-Apr-2017","post-history":"","state":"Draft","tcl-branch":"tip-468","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 468: Support Passing TCP listen Backlog Size Option to TCP Socket Creation","author":["Shannon Noe <[email protected]>"],"is-jest":false},
	"467":{"url":"./tip/467.md","keywords":"migration","created":"14-Mar-2017","post-history":"","state":"Final","vote":"Done","type":"Process","title":"# TIP 467: Move TIP Collection to Fossil","author":["Mark Janssen <[email protected]>"],"is-jest":false},
	"466":{"url":"./tip/466.md","keywords":"Tk,text widget","created":"10-Mar-2017","post-history":"","state":"Draft","tk-branch":"revised_text","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 466: Revised Implementation of the Text Widget","author":["François Vogel <[email protected]>","Gregor Cramer <[email protected]>"],"is-jest":false},
	"465":{"url":"./tip/465.md","created":"03-Mar-2017","post-history":"","state":"Draft","tcl-branch":"tip-465","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 465: Change Rule 8 of the Dodekalogue to Cut Some Corner Cases","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"464":{"url":"./tip/464.md","keywords":"Tk,keyboard,keycode","created":"28-Jan-2017","post-history":"","state":"Final","tcl-branch":"tip-464","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 464: Support for Multimedia Keys on Windows","author":["Ralf Fassel <[email protected]>","Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"463":{"url":"./tip/463.md","keywords":"Tcl, regular expression","created":"11-Feb-2017","post-history":"","state":"Final","tcl-branch":"tip-463","vote":"Done","tcl-version":"8.7","type":"Project","title":"# TIP 463: Command-Driven Substitutions for regsub","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"462":{"url":"./tip/462.md","created":"23-Jan-2017","post-history":"","state":"Final","tcl-branch":"tip-462","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 462: Add New [::tcl::process] Ensemble for Subprocess Management","author":["Frédéric Bonnet <[email protected]>"],"is-jest":false},
	"461":{"url":"./tip/461.md","keywords":"Tcl,expression","state":"Final","type":"Project","author":["Kevin B Kenny <[email protected]>","Kevin B Kenny <[email protected]>","Kevin Kenny <[email protected]>"],"votes-for":"DKF, BG, KBK, JN, DGP, FV, SL, AK","votes-against":"none","created":"24-Jan-2017","title":"# TIP 461: Separate Numeric and String Comparison Operators","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-461","votes-present":"none","is-jest":false},
	"460":{"url":"./tip/460.md","keywords":"Tcl,variable,link,upvar","created":"08-Dec-2016","post-history":"","state":"Draft","tcl-branch":"dah-proc-arg-upvar","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 460: An Alternative to Upvar","author":["Don Hathway <[email protected]>"],"is-jest":false},
	"459":{"url":"./tip/459.md","keywords":"Tcl,package","created":"08-Dec-2016","post-history":"","state":"Final","tcl-branch":"package_files","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 459: Tcl Package Introspection Improvements","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"458":{"url":"./tip/458.md","keywords":"event loop,scalability","created":"24-Nov-2016","post-history":"","state":"Final","tcl-branch":"tip-458","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 458: Add Support for epoll() and kqueue() in the Notifier","author":["Lucio Andrés Illanes Albornoz <[email protected]>","Lucio Andrés Illanes Albornoz <[email protected]>"],"is-jest":false},
	"457":{"url":"./tip/457.md","keywords":"Tcl,procedure,argument handling","created":"21-Nov-2016","post-history":"","state":"Draft","tcl-branch":"tip-457","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 457: Add Support for Named Arguments","author":["Mathieu Lafon <[email protected]>","Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"456":{"url":"./tip/456.md","keywords":"Tcl,socket,SO_REUSEPORT,SO_REUSEADDR","created":"18-Nov-2016","post-history":"","state":"Final","tcl-branch":"tip-456","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 456: Extend the C API to Support Passing Options to TCP Server Creation","author":["LemonBoy <[email protected]>","lime boy <[email protected]>"],"is-jest":false},
	"455":{"url":"./tip/455.md","keywords":"Tcl, event loop","created":"07-Oct-2016","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 455: Extensions to [vwait]: Variable Sets and Scripted Access to Tcl_DoOneEvent","author":["Christian Werner <[email protected]>"],"is-jest":false},
	"454":{"url":"./tip/454.md","keywords":"Tk","created":"21-Sep-2016","post-history":"","state":"Withdrawn","tcl-version":"8.6.6","vote":"Done","type":"Project","title":"# TIP 454: Automatically Resize Frames After Last Child Removed","author":["Harald Oehlmann <[email protected]>","Harald Oehlmann <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"453":{"url":"./tip/453.md","keywords":"Build tooling","created":"13-Sep-2016","post-history":"","state":"Draft","implementation-url":"https://core.tcl-lang.org/tclconfig/timeline?r=practcl","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 453: Tcl Based Automation for tcl/pkgs","author":["Sean Woods <[email protected]>"],"is-jest":false},
	"452":{"url":"./tip/452.md","state":"Draft","type":"Project","author":["Gerald Lester <[email protected]>","Gerald W. Lester <[email protected]>","Gerald W. Lester <[email protected]>"],"vote-results":"2/4/3 rejection in favour of further work","votes-for":"KBK, JD","votes-against":"DKF, JN, DGP, AK","created":"10-Aug-2016","title":"# TIP 452: Add \"stubs\" Package to or Along Side of TclTest","post-history":"","tcl-branch":"tip-452","vote":"Pending","tcl-version":"8.7","votes-present":"BG, FV, SL","is-jest":false},
	"451":{"url":"./tip/451.md","keywords":"Tcl,event loop","created":"10-Aug-2016","post-history":"","state":"Draft","tcl-branch":"updateextended","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 451: Modify [update] to Give Full Script Access to Tcl_DoOneEvent","author":["Colin McCormack <[email protected]>"],"is-jest":false},
	"450":{"url":"./tip/450.md","keywords":"Tcl, binary data","created":"18-Jul-2016","post-history":"","state":"Draft","tcl-branch":"tip-450","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 450: Add [binary] subcommand \"set\" for in-place modification","author":["Arjen Markus <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"449":{"url":"./tip/449.md","keywords":"Tk","created":"07-Jun-2016","post-history":"","state":"Final","tk-branch":"tip-449","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 449: [text] undo/redo to Return Range of Characters","author":["François Vogel <[email protected]>"],"is-jest":false},
	"448":{"url":"./tip/448.md","keywords":"Tcl, C API","created":"24-May-2016","post-history":"","state":"Draft","implementation-url":"http://fossil.etoyoc.com/sandbox/tcllib/artifact/b2b272a285811272","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 448: Update Tcl_SetNotifier to Reinitialize Event Loop","author":["Jeff Rogers <[email protected]>"],"is-jest":false},
	"447":{"url":"./tip/447.md","keywords":"Tcl,tcltest","created":"20-Apr-2016","post-history":"","state":"Final","tcl-branch":"gahr-tip-447","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 447: Execution Time Verbosity Levels in tcltest::configure","author":["Pietro Cerutti <[email protected]>"],"is-jest":false},
	"446":{"url":"./tip/446.md","keywords":"Tk","created":"05-Apr-2016","post-history":"","state":"Final","tk-branch":"tip-446","tcl-version":"8.6.6","vote":"Done","type":"Project","title":"# TIP 446: Introspect Undo/Redo Stack Depths","author":["François Vogel <[email protected]>"],"is-jest":false},
	"445":{"url":"./tip/445.md","state":"Final","vote-summary":"Accepted 4/0/3","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"DKF, KBK, JN, DGP","votes-against":"none","created":"18-Mar-2016","title":"# TIP 445: Tcl_ObjType Utility Routines","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-445","votes-present":"BG, FV, SL","is-jest":false},
	"444":{"url":"./tip/444.md","created":"23-Feb-2016","post-history":"","state":"Final","tcl-branch":"tip-444","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 444: Add \"weekdays\" unit in clock add","author":["Pietro Cerutti <[email protected]>"],"is-jest":false},
	"443":{"url":"./tip/443.md","keywords":"Tk","created":"09-Feb-2016","post-history":"","state":"Final","tk-branch":"tip-443","tcl-version":"8.6.6","vote":"Done","type":"Project","title":"# TIP 443: More Tag Configuration Options for the Text Widget","author":["François Vogel <[email protected]>"],"is-jest":false},
	"442":{"url":"./tip/442.md","keywords":"Tk","created":"17-Feb-2016","post-history":"","state":"Final","tk-branch":"tip-442","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 442: Display text in progressbars","author":["René Zaumseil <[email protected]>","Kevin B Kenny <[email protected]>","Andreas Leitgeb <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"441":{"url":"./tip/441.md","keywords":"Tk,listbox","created":"18-Jan-2016","post-history":"","state":"Final","tk-branch":"tip-441","tcl-version":"8.6.5","vote":"Done","type":"Project","title":"# TIP 441: Add -justify Configuration Option to the listbox Widget","author":["François Vogel <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"440":{"url":"./tip/440.md","keywords":"language implementation,platform","created":"14-Jan-2016","post-history":"","state":"Final","tcl-branch":"tclPlatformEngine","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 440: Add engine to tcl_platform Array","author":["Joe Mistachkin <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"439":{"url":"./tip/439.md","created":"08-Dec-2015","post-history":"","state":"Draft","tcl-branch":"semver","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 439: Semantic Versioning","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"438":{"url":"./tip/438.md","keywords":"Tk,text","created":"01-Nov-2015","post-history":"","state":"Final","tk-branch":"tip-438","tcl-version":"8.6.5","vote":"Done","type":"Project","title":"# TIP 438: Ensure Line Metrics are Up-to-Date","author":["François Vogel <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"437":{"url":"./tip/437.md","keywords":"Tk","created":"14-Jul-2015","post-history":"","state":"Final","tk-branch":"tip-437","vote":"Done","tcl-version":"8.5.18","type":"Project","title":"# TIP 437: Tk panedwindow options for proxy window","author":["Eric Boudaillier <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"436":{"url":"./tip/436.md","created":"30-Jun-2015","post-history":"","state":"Final","implementation-url":"https://core.tcl-lang.org/tcloo/info/5fa1374aa026d4c7","vote":"Done","tcl-version":"8.6.5","type":"Project","title":"# TIP 436: Improve TclOO isa Introspection","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"435":{"url":"./tip/435.md","created":"16-May-2015","post-history":"","state":"Rejected","vote":"Done","tcl-version":"8.6.5","type":"Project","title":"# TIP 435: Safe Mutex Disposal API","author":["Donal Fellows <[email protected]>","Joe Mistachkin <[email protected]>"],"is-jest":false},
	"434":{"url":"./tip/434.md","created":"26-Feb-2015","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.6","type":"Project","title":"# TIP 434: Specify Event Sources for 'vwait'","author":["Jos Decoster <[email protected]>"],"is-jest":false},
	"433":{"url":"./tip/433.md","created":"25-Feb-2015","post-history":"","state":"Final","tk-branch":"bindScriptCount","tcl-version":"8.6.4","vote":"Done","type":"Project","title":"# TIP 433: Add %M binding substitution","author":["Joe Mistachkin <[email protected]>","Brian Griffin <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"432":{"url":"./tip/432.md","created":"20-Sep-2014","post-history":"","state":"Final","tk-branch":"apn-win-filedialogs","tcl-version":"8.6.3","vote":"Done","type":"Project","title":"# TIP 432: Support for New Windows File Dialogs in Vista and Later","author":["Ashok P. Nadkarni <[email protected]>"],"is-jest":false},
	"431":{"url":"./tip/431.md","keywords":"Tcl, directory, file","state":"Final","type":"Project","author":["Kevin Pasko <[email protected]>"],"votes-for":"DKF, FV, KBK, JN, SL","votes-against":"none","created":"10-Sep-2014","title":"# TIP 431: Add 'tempdir' Subcommand to 'file'","post-history":"","tcl-version":"8.7","vote":"Done","tcl-branch":"tip-431","votes-present":"none","is-jest":false},
	"430":{"url":"./tip/430.md","keywords":"virtual filesystem,zip,tclkit,boot,bootstrap","state":"Final","type":"Project","author":["Sean Woods <[email protected]>","Donal Fellows <[email protected]>","Poor Yorick <[email protected]>","Harald Oehlmann <[email protected]>"],"votes-for":"DKF, KBK, SL, AK, JD, JN (partially)","votes-against":"JN (partially)","created":"03-Sep-2014","present":"JN (partially)","title":"# TIP 430: Add basic ZIP archive support to Tcl","post-history":"","tcl-branch":"core_zip_vfs","vote":"Done","tcl-version":"8.7","is-jest":false},
	"429":{"url":"./tip/429.md","keywords":"Tcl,cat,scriptlet result","created":"27-Jul-2014","post-history":"","state":"Final","tcl-branch":"tip-429","tcl-version":"8.6.2","vote":"Done","type":"Project","title":"# TIP 429: A 'string' Subcommand for Concatenation","author":["Andreas Leitgeb <[email protected]>","Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"428":{"url":"./tip/428.md","keywords":"socket,non-blocking,error reporting,option dictionary","created":"16-Mar-2014","post-history":"","state":"Draft","tcl-branch":"tip-428","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 428: Produce Error Dictionary from 'fconfigure -error'","author":["Harald Oehlmann <[email protected]>","Harald Oehlmann <[email protected]>"],"is-jest":false},
	"427":{"url":"./tip/427.md","keywords":"async socket connect,introspection,IPV6","created":"16-Mar-2014","post-history":"","state":"Final","tcl-branch":"tip-427","tcl-version":"8.6.4","vote":"Done","type":"Project","title":"# TIP 427: Introspection of Asynchronous Socket Connection","author":["Reinhard Max <[email protected]>","Harald Oehlmann <[email protected]>","Reinhard Max <[email protected]>"],"is-jest":false},
	"426":{"url":"./tip/426.md","keywords":"introspection, commands, Tcl, Tk","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"vote-results":"4/2/3 accepted","votes-for":"DKF, BG, JN, JD","votes-against":"DGP, AK","created":"31-Jul-2013","title":"# TIP 426: Determining the \"Type\" of Commands","post-history":"","tcl-branch":"dkf-command-type","tcl-version":"8.7","vote":"Done","votes-present":"KBK, FV, SL","is-jest":false},
	"425":{"url":"./tip/425.md","keywords":"Tcl,platform integration,i18n","created":"17-Jul-2013","post-history":"","state":"Final","tcl-branch":"win-console-panic","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 425: Correct use of UTF-8 in Panic Callback (Windows only)","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"424":{"url":"./tip/424.md","keywords":"Tcl,subprocess,execution","created":"07-Jul-2013","post-history":"","state":"Draft","tcl-branch":"tip-improve-exec","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 424: Improving [exec]","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"423":{"url":"./tip/423.md","keywords":"Tcl, time, millisecond resolution","created":"07-Jun-2013","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 423: Formatting Timestamps with Milliseconds","author":["Thomas Perschak <[email protected]>"],"is-jest":false},
	"422":{"url":"./tip/422.md","keywords":"Tcl, API removal, varargs","created":"02-Jan-2013","post-history":"","state":"Final","tcl-branch":"tip-422","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 422: Don't Use stdarg.h/va_list in Public API","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"421":{"url":"./tip/421.md","state":"Final","type":"Project","author":["Karl Lehenbauer <[email protected]>","Brad Lanam <[email protected]>","Donal K. Fellows <[email protected]>"],"updated":"24-Oct-2017","created":"28-Nov-2012","present":"none","title":"# TIP 421: A Command for Iterating Over Arrays","post-history":"","tcl-branch":"tip-421","tcl-version":"8.7","vote":"Done","for":"DKF, AF, JN, SL, KBK, DGP, AK","against":"none","is-jest":false},
	"420":{"url":"./tip/420.md","created":"15-Nov-2012","post-history":"","state":"Draft","implementation-url":"http://www.etoyoc.com/tclmatrix3d","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 420: 'vexpr', a Vector Expression Command","author":["Sean Woods <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"419":{"url":"./tip/419.md","created":"28-Aug-2012","post-history":"","state":"Draft","implementation-url":"http://wiki.tcl.tk/tkevent","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 419: A New Command for Binding to Tk Events","author":["Jeff Rogers <[email protected]>"],"is-jest":false},
	"418":{"url":"./tip/418.md","keywords":"Tcl,binary data","created":"27-Aug-2012","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 418: Add [binary] Subcommands for In-Place Modification","author":["Jeff Rogers <[email protected]>"],"is-jest":false},
	"417":{"url":"./tip/417.md","keywords":"Tcl, future expansion, extensibility","created":"16-Nov-2012","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 417: Use Explicit Option Names for \"file tempfile\"","author":["Christophe Curis <[email protected]>"],"is-jest":false},
	"416":{"url":"./tip/416.md","created":"31-Oct-2012","post-history":"","state":"Final","tcl-branch":"frq-3579001","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 416: New Options for 'load': -global and -lazy","author":["Christian Delbaere <[email protected]>","Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"415":{"url":"./tip/415.md","keywords":"Tk","state":"Final","vote-summary":"Accepted 5/0/1","type":"Project","tk-branch":"tip-415","author":["Simon Geard <[email protected]>"],"votes-against":"none","votes-for":"DKF, KBK, JN, FV, SL","created":"16-Oct-2012","title":"# TIP 415: Enable Easy Creation of Circular Arc Segments","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"BG","is-jest":false},
	"414":{"url":"./tip/414.md","keywords":"Tcl, library initialisation","state":"Final","type":"Project","author":["Brian Griffin <[email protected]>","Jan Nijtmans <[email protected]>"],"votes-against":"none","vote-results":"5/1/0 accepted","votes-for":"JN, DKF, KW, KBK, DGP","created":"15-Oct-2012","title":"# TIP 414: Add (back) Tcl_InitSubsystems as Public API","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"initsubsystems","votes-present":"SL","is-jest":false},
	"413":{"url":"./tip/413.md","keywords":"Tcl","created":"08-Oct-2012","post-history":"","state":"Final","tcl-branch":"tip-318-update","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 413: Unicode Support for 'string is space' and 'string trim'","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"412":{"url":"./tip/412.md","obsoletes":"399","keywords":"Tcl,localization,msgcat","created":"27-Mar-2012","post-history":"","state":"Final","tcl-branch":"msgcat_dyn_locale","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 412: Dynamic Locale Changing for msgcat with On-Demand File Load","author":["Harald Oehlmann <[email protected]>","Harald Oehlmann <[email protected]>"],"is-jest":false},
	"411":{"url":"./tip/411.md","created":"31-Aug-2012","post-history":"","state":"Draft","implementation-url":"http://sqlitestudio.pl/tcl/patches/tip-411-chan_info.patch","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 411: Improved Channel Introspection via \"chan info\"","author":["Pawel Salawa <[email protected]>"],"is-jest":false},
	"410":{"url":"./tip/410.md","created":"26-Aug-2012","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 410: Three Features of scan Adapted for binary scan/format","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"409":{"url":"./tip/409.md","obsoletes":"391","keywords":"udp,datagram,message","created":"17-Aug-2012","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 409: UDP in Tcl","author":["Alexandre Ferrieux <[email protected]>","Colin McCormack <[email protected]>"],"is-jest":false},
	"408":{"url":"./tip/408.md","created":"17-Aug-2012","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 408: Allow Any Command for expr Functions","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"407":{"url":"./tip/407.md","created":"06-Aug-2012","post-history":"","state":"Draft","vote":"No voting","type":"Informative","title":"# TIP 407: The String Representation of Tcl Lists: the Gory Details","author":["Donal K. Fellows <[email protected]>","Kevin Kenny <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"406":{"url":"./tip/406.md","state":"Final","vote-summary":"Accepted 5/0/1","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DKF, KBK, JN, FV, SL","votes-against":"none","created":"01-Aug-2012","title":"# TIP 406: \"C\" is for Cookie","post-history":"","tcl-version":"8.7","vote":"Done","tcl-branch":"dkf-http-cookies","votes-present":"BG","is-jest":false},
	"405":{"url":"./tip/405.md","tcl-ticket":"3163961","keywords":"Tcl,mapeach,loop,accumulator","created":"31-Jul-2012","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 405: Add Collecting Loops, the 'lmap' and 'dict map' Commands","author":["Trevor Davel <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"404":{"url":"./tip/404.md","tcl-ticket":"3544988","keywords":"msgcat, convention","created":"17-Jul-2011","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 404: Let Message Catalogs get the Locale from their File Name","discussions-to":"Tcl Core list","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"403":{"url":"./tip/403.md","keywords":"Tk","created":"17-Jul-2011","post-history":"","state":"Final","tk-branch":"jn-web-colors","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 403: Web Colors for Tk","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"402":{"url":"./tip/402.md","keywords":"Tcl","created":"16-Jul-2011","post-history":"","state":"Draft","tcl-branch":"jn-unc-vfs","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 402: General Platform UNC Support","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"401":{"url":"./tip/401.md","created":"29-Apr-2012","post-history":"","state":"Draft","tcl-branch":"tip-401","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 401: Comment Words with Leading {#}","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"400":{"url":"./tip/400.md","keywords":"Tcl, zlib","created":"30-Mar-2012","post-history":"","state":"Final","tcl-branch":"tip-400-impl","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 400: Setting the Compression Dictionary and Other 'zlib' Updates","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"399":{"url":"./tip/399.md","keywords":"Tcl,localization,msgcat","created":"27-Mar-2012","obsoleted-by":"412","post-history":"","state":"Accepted","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 399: Dynamic Locale Changing for msgcat","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"398":{"url":"./tip/398.md","keywords":"close,exit,flush,blocking,nonblocking","created":"24-Feb-2012","post-history":"","state":"Final","tcl-branch":"tip-398-impl","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 398: Quickly Exit with Non-Blocking Blocked Channels","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"397":{"url":"./tip/397.md","keywords":"Tcl, TclOO, copy, clone","created":"13-Feb-2012","post-history":"","state":"Final","implementation-url":"https://core.tcl-lang.org/tcloo/timeline?r=development-rfe3485060","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 397: Extensible Object Copying","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"396":{"url":"./tip/396.md","obsoletes":"372","keywords":"coroutine,yield,yieldto","created":"11-Feb-2012","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 396: Symmetric Coroutines, Multiple Args, and yieldto","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"395":{"url":"./tip/395.md","keywords":"Tcl","state":"Final","type":"Project","author":["Jos Decoster <[email protected]>"],"created":"13-Dec-2011","obsoletes":"347","title":"# TIP 395: New 'string is entier' Command","post-history":"","vote":"Done","tcl-version":"8.6","implementation-url":"http://sites.google.com/site/josdecoster/Home/tip_string_is_entier.diff","discussions-to":"news:comp.lang.tcl","is-jest":false},
	"394":{"url":"./tip/394.md","created":"30-Nov-2011","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 394: Platform-Independent Handling of Contemporary Mice","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"393":{"url":"./tip/393.md","created":"25-Apr-2011","post-history":"","state":"Draft","implementation-url":"http://sqlitestudio.pl/tcl/patches/tip-393-lsearch-command.patch","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 393: Add -command Option to lsearch","author":["Pawel Salawa <[email protected]>"],"is-jest":false},
	"392":{"url":"./tip/392.md","keywords":"bignum,runaway,safe,math,precision,integer,tcl","created":"30-Oct-2011","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 392: Allow Bignums to be Disabled at Runtime on a Per-Interp Basis","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"391":{"url":"./tip/391.md","created":"26-Oct-2011","obsoleted-by":"409","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 391: Support for UDP Sockets in Tcl","author":["Jeff Rogers <[email protected]>"],"is-jest":false},
	"390":{"url":"./tip/390.md","created":"27-Oct-2011","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 390: A Logging API for Tcl","author":["Jeff Rogers <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"389":{"url":"./tip/389.md","keywords":"Tcl","created":"23-Aug-2011","post-history":"","state":"Final","tcl-branch":"tip-389","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 389: Full support for Unicode 10.0 and later (part 1)","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"388":{"url":"./tip/388.md","keywords":"Tcl","created":"10-Aug-2011","post-history":"","state":"Final","tcl-branch":"tip-388-impl","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 388: Extending Unicode literals past the BMP","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"387":{"url":"./tip/387.md","keywords":"Tcl, coroutine","created":"30-May-2011","post-history":"","obsoleted-by":"396","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 387: Unified Yield Command Syntax","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"386":{"url":"./tip/386.md","keywords":"Fossil,DVCS","created":"01-Mar-2011","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 386: Relocation of Tcl/Tk Source Control Repositories","author":["Kevin B. Kenny <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"385":{"url":"./tip/385.md","keywords":"Tcl, traces","created":"13-Feb-2011","post-history":"","state":"Draft","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 385: Functional Traces On Variables","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"384":{"url":"./tip/384.md","keywords":"kqueue,inotify,dnotify,gamin,FSevents,fam","created":"02-Dec-2010","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 384: Add File Alteration Monitoring to the Tcl Core","author":["Reinhard Max <[email protected]>","Gerald W. Lester <[email protected]>"],"is-jest":false},
	"383":{"url":"./tip/383.md","keywords":"debugging,coroutine,yielded","state":"Final","type":"Project","author":["Alexandre Ferrieux <[email protected]>","Miguel Sofer <[email protected]>","Donal K. Fellows <[email protected]>"],"votes-for":"DKF, KBK, JN","votes-against":"none","created":"03-Dec-2010","title":"# TIP 383: Injecting Code into Suspended Coroutines","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-383","votes-present":"FV, SL","is-jest":false},
	"382":{"url":"./tip/382.md","keywords":"Tk, dialog","created":"02-Nov-2010","post-history":"","state":"Final","tk-branch":"tip-382","vote":"Done","tcl-version":"8.5.11","type":"Project","title":"# TIP 382: Let tk_getSaveFile ignore file overwrites","author":["Pawel Salawa <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"381":{"url":"./tip/381.md","keywords":"TclOO, iTcl","created":"20-Oct-2010","post-history":"","state":"Final","implementation-url":"https://core.tcl-lang.org/tcloo/timeline?r=development-next2","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 381: Call Chain Introspection and Control","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"380":{"url":"./tip/380.md","tcl-ticket":"3084339","created":"20-Oct-2010","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 380: TclOO Slots for Flexible Declarations","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"379":{"url":"./tip/379.md","keywords":"event","created":"17-Oct-2010","post-history":"","state":"Draft","implementation-url":"http://www.wjduquette.com/notifier/hook-0.1.zip","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 379: Add a Command for Delivering Events Without Tk","author":["Will Duquette <[email protected]>"],"is-jest":false},
	"378":{"url":"./tip/378.md","tcl-ticket":"3081184","created":"04-Oct-2010","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 378: Fixing the Performance of TIP 280","author":["Andreas Kupries <[email protected]>","Jeff Hobbs <[email protected]>"],"is-jest":false},
	"377":{"url":"./tip/377.md","created":"13-Sep-2010","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 377: Portably Determining the Number of Processors in the System","author":["Andreas Kupries <[email protected]>"],"is-jest":false},
	"376":{"url":"./tip/376.md","created":"14-Sep-2010","post-history":"","state":"Final","implementation-url":"https://core.tcl-lang.org/tdbc/","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 376: Bundle sqlite3 and tdbc::sqlite3 Packages","author":["Don Porter <[email protected]>","D. Richard Hipp <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"375":{"url":"./tip/375.md","obsoletes":"373","keywords":"coroutine,yield","created":"12-Aug-2010","obsoleted-by":"396","post-history":"","state":"Draft","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 375: Symmetric Coroutines and Yieldto","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"374":{"url":"./tip/374.md","created":"13-Aug-2010","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 374: Stackless Vwait","author":["Thomas Perschak <[email protected]>","Trevor Davel <[email protected]>"],"is-jest":false},
	"373":{"url":"./tip/373.md","obsoletes":"372","keywords":"coroutine,yield","created":"12-Aug-2010","obsoleted-by":"375","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 373: Improved Yielding Support for Coroutines","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"372":{"url":"./tip/372.md","keywords":"coroutine, yield","created":"11-Aug-2010","obsoleted-by":"396","post-history":"","state":"Draft","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 372: Multi-argument Yield for Coroutines","discussions-to":"http://wiki.tcl.tk/26006","author":["Colin McCormack <[email protected]>"],"is-jest":false},
	"371":{"url":"./tip/371.md","created":"05-Aug-2010","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 371: Improvements for the dict command","author":["Thomas Perschak <[email protected]>","Trevor Davel <[email protected]>"],"is-jest":false},
	"370":{"url":"./tip/370.md","created":"04-Aug-2010","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 370: Extend Tk's selection with a -time option","author":["George Petasis <[email protected]>"],"is-jest":false},
	"369":{"url":"./tip/369.md","tk-ticket":"3023578","keywords":"Tk,user-defined data,dictionary","created":"15-Jul-2010","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 369: Widget cargo command","author":["Russell Davidson <[email protected]>","Trevor Davel <[email protected]>"],"is-jest":false},
	"368":{"url":"./tip/368.md","keywords":"Tk","created":"10-May-2010","obsoleted-by":"441","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 368: Listbox Justification Option","author":["Russell Davidson <[email protected]>"],"is-jest":false},
	"367":{"url":"./tip/367.md","keywords":"Tcl, delete, item","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, DGP, FV, SL, AK","votes-against":"none","created":"18-May-2010","title":"# TIP 367: A Command to Remove Elements from a List","post-history":"","tcl-version":"8.7","vote":"Done","tcl-branch":"tip-367","votes-present":"none","is-jest":false},
	"366":{"url":"./tip/366.md","tk-ticket":"2996760","keywords":"Tk","created":"29-Apr-2010","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 366: Variable Sized Indicators for Menubuttons","author":["Russell Davidson <[email protected]>"],"is-jest":false},
	"365":{"url":"./tip/365.md","keywords":"Look at the date","created":"01-Apr-2010","post-history":"","state":"Draft","vote":"No voting","tcl-version":"8.6","type":"Project","title":"# TIP 365: Add Python Compatibility Mode","author":["Donal K. Fellows <[email protected]>"],"is-jest":true},
	"364":{"url":"./tip/364.md","keywords":"Tcl","created":"19-Mar-2010","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 364: Threading Support: Configuration and Package","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"363":{"url":"./tip/363.md","keywords":"expand,{*},vector,math","created":"02-Mar-2010","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.0","type":"Project","title":"# TIP 363: Vector Math in the Tcl Core","author":["Karl C. Hansen <[email protected]>"],"is-jest":false},
	"362":{"url":"./tip/362.md","tcl-ticket":"2960976","keywords":"Windows,Tcl","created":"01-Mar-2010","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 362: Simple 32 and 64 bit Registry Support","author":["Damon Courtney <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"361":{"url":"./tip/361.md","created":"03-Feb-2010","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 361: Releasing Channel Buffers","author":["Wayne Cuddy <[email protected]>"],"is-jest":false},
	"360":{"url":"./tip/360.md","tk-ticket":"2920409","keywords":"Tk, X11, menu","created":"24-Dec-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 360: Modernize X11 Menus","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"359":{"url":"./tip/359.md","tk-ticket":"2918731","keywords":"Tk,X11,ewmh,window manager","created":"21-Dec-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 359: Extended Window Manager Hint Support","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"358":{"url":"./tip/358.md","keywords":"Tcl, list extraction, parsing","created":"04-Oct-2009","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 358: Suppress Empty List Element Generation from the Split Command","author":["George Petasis <[email protected]>"],"is-jest":false},
	"357":{"url":"./tip/357.md","tcl-ticket":"2891616","created":"01-Oct-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 357: Export TclLoadFile","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"356":{"url":"./tip/356.md","keywords":"Tcl, C API, subst","created":"17-Sep-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 356: NR-enabled Substitutions for Extensions","author":["Don Porter <[email protected]>"],"is-jest":false},
	"355":{"url":"./tip/355.md","tcl-ticket":"2826430","created":"01-Sep-2009","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 355: Stop Fast Recycling of Channel Names on Unix","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"354":{"url":"./tip/354.md","created":"26-Aug-2009","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 354: Minor Production-Driven TclOO Revisions","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"353":{"url":"./tip/353.md","tcl-ticket":"2823282","created":"29-Jul-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 353: NR-enabled Expressions for Extensions","author":["Don Porter <[email protected]>"],"is-jest":false},
	"352":{"url":"./tip/352.md","created":"14-Jul-2009","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 352: Tcl Style Guide","author":["Ray Johnson <[email protected]>","Donal K. Fellows <[email protected]>","Mark Janssen <[email protected]>"],"is-jest":false},
	"351":{"url":"./tip/351.md","created":"09-Jul-2009","post-history":"","state":"Final","tcl-branch":"tip-351","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 351: Add Striding Support to lsearch","author":["Peter da Silva <[email protected]>","Donal K. Fellows <[email protected]>","Harald Oehlmann <[email protected]>","Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"350":{"url":"./tip/350.md","obsoletes":"308","created":"18-Apr-2009","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 350: Tcl Database Connectivity - Corrigenda","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"349":{"url":"./tip/349.md","created":"17-Apr-2009","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 349: New \"-cargo\" option for every Tk widget","author":["Zbigniew Baniewski <[email protected]>"],"is-jest":false},
	"348":{"url":"./tip/348.md","tcl-ticket":"2868499","keywords":"Tcl,debugging","created":"26-Feb-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 348: Substituted 'errorstack' / 'traceback'","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"347":{"url":"./tip/347.md","keywords":"Tcl","created":"09-Feb-2009","obsoleted-by":"395","post-history":"","state":"Withdrawn","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 347: Align 'string is ...' to Type-Conversion Functions in 'expr'","discussions-to":"news:comp.lang.tcl","author":["Jos Decoster <[email protected]>"],"is-jest":false},
	"346":{"url":"./tip/346.md","keywords":"Tcl,encoding,convertto,strict,Unicode,String,ByteArray","created":"02-Feb-2009","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 346: Error on Failed String Encodings","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"345":{"url":"./tip/345.md","tcl-ticket":"2564363","keywords":"Tcl,encoding,invalid UTF-8","created":"05-Feb-2009","post-history":"","state":"Final","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 345: Kill the 'identity' Encoding","discussions-to":"Tcl Core List","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"344":{"url":"./tip/344.md","created":"31-Dec-2008","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 344: Bring TCP_NODELAY and SO_KEEPALIVE to socket options","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"343":{"url":"./tip/343.md","tcl-ticket":"2368084","keywords":"Tcl,binary","created":"03-Dec-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 343: A Binary Specifier for [format/scan]","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"342":{"url":"./tip/342.md","keywords":"dictionary, default value","state":"Final","type":"Project","author":["Lars Hellström <[email protected]>"],"votes-for":"DKF, JN, DGP, SL, AK","votes-against":"none","created":"27-Nov-2008","title":"# TIP 342: Dict Get With Default","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-342","votes-present":"FV","is-jest":false},
	"341":{"url":"./tip/341.md","tcl-ticket":"2370575","keywords":"Tcl, set intersection","created":"27-Nov-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 341: Multiple 'dict filter' Patterns","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"340":{"url":"./tip/340.md","keywords":"Tcl_SetResult","created":"14-Nov-2008","post-history":"","state":"Withdrawn","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 340: Const Qualification of Tcl_SetResult's Argument","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"339":{"url":"./tip/339.md","created":"14-Nov-2008","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 339: Case-Insensitive Package Names","author":["Andreas Kupries <[email protected]>"],"is-jest":false},
	"338":{"url":"./tip/338.md","keywords":"Tcl, Tk, tclsh, wish","created":"22-Oct-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 338: Embedder Access to Startup Scripts of *_Main()","author":["Don Porter <[email protected]>"],"is-jest":false},
	"337":{"url":"./tip/337.md","created":"21-Oct-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 337: Make TclBackgroundException() Public","author":["Don Porter <[email protected]>"],"is-jest":false},
	"336":{"url":"./tip/336.md","created":"21-Oct-2008","post-history":"","state":"Final","tcl-branch":"tip-330-336","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 336: Supported Access To interp->errorline","author":["Don Porter <[email protected]>"],"is-jest":false},
	"335":{"url":"./tip/335.md","keywords":"numLevels,embedding,terminate,async,thread,safe,gc","created":"13-Oct-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 335: An API for Detecting Active Interpreters","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"334":{"url":"./tip/334.md","keywords":"empty list","created":"13-Oct-2008","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.6","type":"Project","title":"# TIP 334: Make 'lrepeat' Accept Zero as a Count","author":["Michael Thomas Greer <[email protected]>"],"is-jest":false},
	"333":{"url":"./tip/333.md","keywords":"Tcl,resolution","created":"13-Oct-2008","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 333: New Variable and Namespace Resolving Interface","author":["Arnulf Wiedemann <[email protected]>"],"is-jest":false},
	"332":{"url":"./tip/332.md","tcl-ticket":"219159","obsoletes":"301","keywords":"Tcl,channel,close,socket,shutdown","created":"25-Sep-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 332: Half-Close for Bidirectional Channels","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"331":{"url":"./tip/331.md","created":"22-Sep-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 331: Allow [lset] to Extend Lists","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"330":{"url":"./tip/330.md","created":"22-Sep-2008","post-history":"","state":"Final","tcl-branch":"tip-330-336","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 330: Eliminate interp->result from the Public Headers","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"329":{"url":"./tip/329.md","obsoletes":"89","created":"22-Sep-2008","post-history":"","state":"Final","implementation-url":"http://www.crypt.co.za/pub/try-1.tcl","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 329: Try/Catch/Finally syntax","discussions-to":"http://wiki.tcl.tk/21608","author":["Trevor Davel <[email protected]>"],"is-jest":false},
	"328":{"url":"./tip/328.md","keywords":"Coroutine,continuation,event-loop,NRE","created":"07-Sep-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 328: Coroutines","author":["Miguel Sofer <[email protected]>","Neil Madden <[email protected]>"],"is-jest":false},
	"327":{"url":"./tip/327.md","keywords":"tailcall,NRE","created":"20-Sep-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 327: Proper Tailcalls","author":["Miguel Sofer <[email protected]>","David S. Cargo <[email protected]>"],"is-jest":false},
	"326":{"url":"./tip/326.md","tcl-ticket":"2082681","keywords":"Tcl, lsort, sorting","created":"01-Sep-2008","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 326: Add -stride Option to lsort","author":["Kieran Elby <[email protected]>"],"is-jest":false},
	"325":{"url":"./tip/325.md","keywords":"Tk, desktop integration","created":"25-Aug-2008","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 325: System Tray and System Notification Access","author":["David N. Welton <[email protected]>, Kevin Walzer <[email protected]>"],"is-jest":false},
	"324":{"url":"./tip/324.md","tk-ticket":"1477426","obsoletes":"213","keywords":"Tk","created":"08-Aug-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 324: A Standard Dialog For Font Selection","author":["Adrian Robert <[email protected]>","Daniel A. Steffen <[email protected]>"],"is-jest":false},
	"323":{"url":"./tip/323.md","created":"06-Aug-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 323: Do Nothing Gracefully","author":["Colin McCormack <[email protected]>","Don Porter <[email protected]>","Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"322":{"url":"./tip/322.md","created":"13-Jul-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 322: Publish the NRE API","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"321":{"url":"./tip/321.md","tk-ticket":"1997907","keywords":"Tk,BLT,busy","created":"26-Jun-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 321: Add a [tk busy] Command","author":["Jos Decoster <[email protected]>"],"is-jest":false},
	"320":{"url":"./tip/320.md","tcl-ticket":"2005460","keywords":"TclOO","created":"13-Jun-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 320: Improved Variable Handling in the Core Object System","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"319":{"url":"./tip/319.md","created":"04-Jun-2008","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 319: Implement Backwards Compatibility for ttk Themed Widgets in tk Widgets","author":["Eric Taylor <[email protected]>"],"is-jest":false},
	"318":{"url":"./tip/318.md","created":"13-May-2008","post-history":"","state":"Final","tcl-branch":"tip-318-update","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 318: Extend Default Whitespace in 'string trim' Beyond ASCII","author":["Bill Poser <[email protected]>"],"is-jest":false},
	"317":{"url":"./tip/317.md","tcl-ticket":"1956530","keywords":"base64,uuencode,hex,transfer encoding","created":"03-May-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 317: Extend binary Ensemble with Binary Encodings","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"316":{"url":"./tip/316.md","created":"02-May-2008","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 316: Portable Access Functions for Stat Buffers","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"315":{"url":"./tip/315.md","created":"04-Apr-2008","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 315: Add pathSeparator to tcl_platform Array","author":["Hai Vu <[email protected]>"],"is-jest":false},
	"314":{"url":"./tip/314.md","tcl-ticket":"1901783","created":"26-Feb-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 314: Ensembles with Parameters","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"313":{"url":"./tip/313.md","tcl-ticket":"1894241","keywords":"Tcl","created":"14-Feb-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 313: Inexact Searching in Sorted List","author":["Peter Spjuth <[email protected]>"],"is-jest":false},
	"312":{"url":"./tip/312.md","keywords":"variable,trace","state":"Final","type":"Project","author":["René Zaumseil <[email protected]>","Larry W. Virden <[email protected]>"],"votes-for":"DKF, JN, SL, AK","votes-against":"none","created":"26-Jan-2008","title":"# TIP 312: Add More Link Types","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-312-new","votes-present":"DGP, FV","is-jest":false},
	"311":{"url":"./tip/311.md","created":"08-Jan-2008","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 311: Tcl/Tk 8.6 Release Calendar","author":["Don Porter <[email protected]>","Larry W. Virden <[email protected]>","Joe Mistachkin <[email protected]>","Pat Thoyts <[email protected]>","Miguel Sofer <[email protected]>","Lars Hellström <[email protected]>","Alexandre Ferrieux <[email protected]>","Arnulf Wiedemann <[email protected]>","Trevor Davel <[email protected]>","Donal K. Fellows <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"310":{"url":"./tip/310.md","keywords":"expr","created":"07-Jan-2008","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 310: Add a New Pseudo-Random Number Generator","author":["Arjen Markus <[email protected]>"],"is-jest":false},
	"309":{"url":"./tip/309.md","keywords":"expr, parse","created":"07-Jan-2008","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 309: Expose the Expression Parsing","author":["Arjen Markus <[email protected]>"],"is-jest":false},
	"308":{"url":"./tip/308.md","created":"15-Nov-2007","obsoleted-by":"350","post-history":"","state":"Final","vote":"Done","type":"Informative","title":"# TIP 308: Tcl Database Connectivity (TDBC)","author":["Kevin B. Kenny <[email protected]>","Artur Trzewik <[email protected]>","Andreas Leitgeb <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"307":{"url":"./tip/307.md","tcl-ticket":"1723738","keywords":"Tcl, result, transfer, interpreter, API rename","created":"28-Sep-2007","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 307: Make TclTransferResult() Public","author":["Erik Leunissen <[email protected]>"],"is-jest":false},
	"306":{"url":"./tip/306.md","keywords":"automatic,Tk,widget,naming","created":"11-Jun-2007","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 306: Auto-Naming Widgets","author":["Koen Danckaert <[email protected]>","Richard Suchenwirth <[email protected]>"],"is-jest":false},
	"305":{"url":"./tip/305.md","created":"21-Feb-2007","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 305: ANSI Escape Sequence Support for Windows's Console Channel Driver","discussions-to":"news:comp.lang.tcl","author":["David Gravereaux <[email protected]>"],"is-jest":false},
	"304":{"url":"./tip/304.md","tcl-ticket":"1978495","keywords":"Tcl,exec,process,subprocess,pipeline,channel","created":"07-Feb-2007","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 304: A Standalone [chan pipe] Primitive for Advanced Child IPC","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"303":{"url":"./tip/303.md","keywords":"Tcl, lindex","created":"29-Jan-2007","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 303: Enhance 'llength' Command to Support Nested Lists","author":["Wolf-Dieter Busch <[email protected]>"],"is-jest":false},
	"302":{"url":"./tip/302.md","keywords":"Tcl,time changes","created":"13-Dec-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 302: Fix \"after\"'s Sensitivity To Adjustments Of System Clock","author":["Alexandre Ferrieux <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"301":{"url":"./tip/301.md","created":"11-Dec-2006","obsoleted-by":"332","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 301: Split Bidirectional Channels For Half-Close","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"300":{"url":"./tip/300.md","tk-ticket":"1602955","keywords":"Tk","created":"25-Nov-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 300: Examine Glyph Substitution in the 'font actual' Command","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"299":{"url":"./tip/299.md","tk-ticket":"1602534","keywords":"Tcl, expression, integer, square root","created":"24-Nov-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 299: Add isqrt() Math Function","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"298":{"url":"./tip/298.md","tcl-ticket":"1601243","keywords":"Tcl,Tcl_Obj","created":"22-Nov-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 298: Revise Shared Value Rules for Tcl_GetBignumAndClearObj","author":["Don Porter <[email protected]>"],"is-jest":false},
	"297":{"url":"./tip/297.md","keywords":"Tcl, number, expression","created":"20-Nov-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 297: Integer Type Introspection and Conversion","author":["Don Porter <[email protected]>"],"is-jest":false},
	"296":{"url":"./tip/296.md","keywords":"Tcl,lrange,lreplace","created":"06-Nov-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 296: Enhanced Syntax for Pair-Wise Indices","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"295":{"url":"./tip/295.md","keywords":"Tcl,lrange","created":"06-Nov-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 295: Enhance Arguments to lrange","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"294":{"url":"./tip/294.md","keywords":"Tcl,number,cast,rename","created":"03-Nov-2006","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 294: The \"entier\" Function: It's Spelt \"entire\"","author":["Lars Hellström <[email protected]>","Richard Suchenwirth <[email protected]>"],"is-jest":false},
	"293":{"url":"./tip/293.md","obsoletes":"157","created":"02-Nov-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 293: Argument Expansion with Leading {*}","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"292":{"url":"./tip/292.md","keywords":"Tcl, expr","created":"01-Nov-2006","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 292: Allow Unquoted Strings in Expressions","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"291":{"url":"./tip/291.md","tcl-ticket":"1600701","keywords":"Tcl,Critcl,TEApot","created":"26-Oct-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 291: Add the 'platform' Package to Tcl","author":["Steve Landers <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"290":{"url":"./tip/290.md","tcl-ticket":"1587317","keywords":"Tcl,error,trap","created":"29-Oct-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 290: Registration of Custom Error Handler Scripts","author":["Eckhard Lehmann <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"289":{"url":"./tip/289.md","keywords":"Tcl","created":"26-Oct-2006","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 289: Revision of [lrepeat] Argument Order","author":["Peter Spjuth <[email protected]>","<[email protected]>"],"is-jest":false},
	"288":{"url":"./tip/288.md","keywords":"Tcl,proc","created":"03-Oct-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 288: Allow \"args\" Anywhere in Procedure Formal Arguments","author":["Peter Spjuth <[email protected]>","Andreas Leitgeb <[email protected]>","Peter Spjuth <[email protected]>"],"is-jest":false},
	"287":{"url":"./tip/287.md","tcl-ticket":"1586860","keywords":"Tcl,channel,chan,pendinginput,pendingoutput","created":"26-Oct-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 287: Add a Commands for Determining Size of Buffered Data","author":["Michael A. Cleverly <[email protected]>"],"is-jest":false},
	"286":{"url":"./tip/286.md","tk-ticket":"1152376","keywords":"Tk","created":"18-Oct-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 286: Add 'xposition' Command to Menu Widgets","author":["Schelte Bron <[email protected]>"],"is-jest":false},
	"285":{"url":"./tip/285.md","tcl-ticket":"1499394","keywords":"eval,cancel,unwind,terminate,runaway,async,thread,safe","created":"04-Jun-2006","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 285: Script Cancellation with [interp cancel] and Tcl_CancelEval","author":["Joe Mistachkin <[email protected]>","Dawson Cowals <[email protected]>"],"is-jest":false},
	"284":{"url":"./tip/284.md","created":"01-Oct-2006","post-history":"","state":"Draft","tcl-branch":"tip-284","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 284: New 'invoke' and 'namespace invoke' Commands","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"283":{"url":"./tip/283.md","tcl-ticket":"1577282","created":"01-Oct-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 283: Modify Ensemble Command Resolution Behaviour","author":["Miguel Sofer <[email protected]>","Neil Madden <[email protected]>"],"is-jest":false},
	"282":{"url":"./tip/282.md","tcl-ticket":"1969722","keywords":"expr,operator,assignment","created":"13-Oct-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 282: Enhanced Expression Syntax","author":["Will Duquette <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"281":{"url":"./tip/281.md","keywords":"POSIX,channel driver,errorCode","created":"08-Oct-2006","post-history":"","state":"Draft","implementation-url":"http://iocpsock.cvs.sourceforge.net/iocpsock/iocpsock/tclWinError.c?revision=HEAD&view=markup","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 281: Improvements in System Error Handling","author":["David Gravereaux <[email protected]>"],"is-jest":false},
	"280":{"url":"./tip/280.md","tcl-ticket":"1571568","obsoletes":"211","keywords":"Tcl","created":"10-Aug-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 280: Add Full Stack Trace Capability With Location Introspection","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"279":{"url":"./tip/279.md","created":"05-Oct-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 279: Adding an Extensible Object System to the Core","author":["Gustaf Neumann <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"278":{"url":"./tip/278.md","created":"03-Oct-2006","post-history":"","state":"Final","tcl-branch":"tip-278","tcl-version":"9.0","discussions to":"Tcl Core List","vote":"Done","type":"Project","title":"# TIP 278: Fix Variable Name Resolution Quirks","author":["Miguel Sofer <[email protected]>","Miguel Sofer <[email protected]>","Kevin Kenny <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"277":{"url":"./tip/277.md","created":"01-Oct-2006","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 277: Create Namespaces as Needed","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"276":{"url":"./tip/276.md","keywords":"Tcl,global,variable,upvar,namespace upvar","created":"01-Oct-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 276: Specify and Unify Variable Linking Commands","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"275":{"url":"./tip/275.md","tcl-ticket":"1565751","keywords":"Tcl,binary,unsigned","created":"27-Sep-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 275: Support Unsigned Values in binary Command","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"274":{"url":"./tip/274.md","tcl-ticket":"1556802","keywords":"Tcl,expr","created":"15-Sep-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 274: Right-Associativity for the Exponentiation Operator","author":["Arjen Markus <[email protected]>","David Smith <[email protected]>","Richard Suchenwirth <[email protected]>","Don Porter <[email protected]>","Sérgio Loureiro <[email protected]>"],"is-jest":false},
	"273":{"url":"./tip/273.md","obsoletes":"176","created":"30-Aug-2006","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 273: Add Tcl_Expr... Support to Tcl_Get... Functions","author":["Carsten Gosvig <[email protected]>"],"is-jest":false},
	"272":{"url":"./tip/272.md","tcl-ticket":"1545151","keywords":"Tcl, lreverse","created":"23-Aug-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 272: String and List Reversal Operations","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"271":{"url":"./tip/271.md","tk-ticket":"1520742","created":"11-Jul-2006","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 271: Windows-Style Open and Save File Dialog on Unix","author":["Matthew Middleton <[email protected]>","susanta kumar mishra <[email protected]>"],"is-jest":false},
	"270":{"url":"./tip/270.md","created":"19-Jun-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 270: Utility C Routines for String Formatting","author":["Don Porter <[email protected]>"],"is-jest":false},
	"269":{"url":"./tip/269.md","tcl-ticket":"1491459","keywords":"Tcl,lists,strings","created":"19-May-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 269: Add 'string is list' to the 'string is' Subcommand","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"268":{"url":"./tip/268.md","tcl-ticket":"1520767","created":"28-Apr-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 268: Enhance 'package' Version Handling","author":["Jeff Hobbs <[email protected]>","Hemang Lavana <[email protected]>","Andreas Kupries <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"267":{"url":"./tip/267.md","tcl-ticket":"1476191","created":"25-Apr-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 267: Allow 'exec' to Ignore Stderr","author":["Nathan Bell <[email protected]>"],"is-jest":false},
	"266":{"url":"./tip/266.md","keywords":"Tcl,unknown,expression","created":"11-Apr-2006","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 266: Numbers are Commands","author":["Kristoffer Lawson <[email protected]>","Michal Malecki <[email protected]>","Wolf-Dieter Busch <[email protected]>","Paul Nash <[email protected]>"],"is-jest":false},
	"265":{"url":"./tip/265.md","tcl-ticket":"1446696","keywords":"Command line parsing, C implementation","created":"03-Apr-2006","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 265: A Convenient C-side Command Option Parser for Tcl","author":["Sam Bromley <[email protected]>"],"is-jest":false},
	"264":{"url":"./tip/264.md","keywords":"Tk, C API","created":"01-Apr-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 264: Add Function to Retrieve the Interpreter of a Window","author":["George Petasis <[email protected]>"],"is-jest":false},
	"263":{"url":"./tip/263.md","created":"01-Apr-2006","post-history":"","state":"Draft","tcl-version":"9.2","vote":"Pending","type":"Project","title":"# TIP 263: Quantum Tcl","author":["Lars Hellström <[email protected]>"],"is-jest":true},
	"262":{"url":"./tip/262.md","keywords":"Tk,option","state":"Final","type":"Project","tk-branch":"tip-262","author":["Eric Taylor <[email protected]>","Donal K. Fellows <[email protected]>"],"votes-for":"DKF, FV, KBK, JN, SL","votes-against":"none","created":"18-Mar-2006","title":"# TIP 262: Background Images for Frames","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"261":{"url":"./tip/261.md","tcl-ticket":"1437008","created":"20-Dec-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 261: Return Imported Commands from [namespace import]","author":["Martin Lemburg <[email protected]>","<[email protected]>"],"is-jest":false},
	"260":{"url":"./tip/260.md","created":"04-Jan-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 260: Add Underline Option to Canvas Text Items","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"259":{"url":"./tip/259.md","created":"12-Dec-2005","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 259: Making 'exec' Optionally Binary Safe","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"258":{"url":"./tip/258.md","tcl-ticket":"1413934","keywords":"encoding","created":"01-Oct-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 258: Enhanced Interface for Encodings","author":["Don Porter <[email protected]>"],"is-jest":false},
	"257":{"url":"./tip/257.md","obsoletes":"50","created":"26-Sep-2005","post-history":"","state":"Final","tcl-branch":"tip-257-implementation-branch","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 257: Object Orientation for Tcl","author":["Donal K. Fellows <[email protected]>","Will Duquette <[email protected]>","Steve Landers <[email protected]>","Jeff Hobbs <[email protected]>","Kevin Kenny <[email protected]>","Miguel Sofer <[email protected]>","Richard Suchenwirth <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"256":{"url":"./tip/256.md","tk-ticket":"1247835","created":"12-Aug-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 256: Implement Tabular and Wordprocessor Style Tabbing","author":["Vince Darley <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"255":{"url":"./tip/255.md","tcl-ticket":"1309020","created":"21-Jul-2005","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 255: Add 'min' and 'max' [expr] Functions","author":["Jeff Hobbs <[email protected]>"],"is-jest":false},
	"254":{"url":"./tip/254.md","tcl-ticket":"1242844","created":"21-Jul-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 254: New Types for Tcl_LinkVar","author":["Rene Meyer <[email protected]>"],"is-jest":false},
	"253":{"url":"./tip/253.md","created":"05-Jul-2005","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 253: Consolidate Package-Related Commands","author":["Brian Schmidt <[email protected]>"],"is-jest":false},
	"252":{"url":"./tip/252.md","created":"28-Jun-2005","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 252: Add New 'string' Command Options","author":["Brian Schmidt <[email protected]>"],"is-jest":false},
	"251":{"url":"./tip/251.md","created":"28-Jun-2005","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 251: Enhance the 'list' Command","author":["Brian Schmidt <[email protected]>","Sérgio Loureiro <[email protected]>"],"is-jest":false},
	"250":{"url":"./tip/250.md","tcl-ticket":"1275435","created":"19-Jun-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 250: Efficient Access to Namespace Variables","author":["Will Duquette <[email protected]>","miguel sofer <[email protected]>"],"is-jest":false},
	"249":{"url":"./tip/249.md","created":"13-Jun-2005","post-history":"","state":"Draft","vote":"No voting","type":"Informative","title":"# TIP 249: Unification of Tcl's Parsing of Numbers","author":["Kevin B. Kenny <[email protected]>","David S. Cargo <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"248":{"url":"./tip/248.md","obsoletes":"172","created":"08-Jun-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 248: Integrate Tile into Tk as Ttk","author":["Jeff Hobbs <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"247":{"url":"./tip/247.md","created":"01-Jun-2005","post-history":"","state":"Draft","vote":"Pending","type":"Informational","title":"# TIP 247: Tcl/Tk Engineering Manual","author":["John K. Ousterhout <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"246":{"url":"./tip/246.md","keywords":"pattern,match,glob,exact,regexp,case sensitive,Tcl","created":"27-Apr-2005","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 246: Unify Pattern Matching","author":["Reinhard Max <[email protected]>"],"is-jest":false},
	"245":{"url":"./tip/245.md","tk-ticket":"1185731","keywords":"Tk","created":"15-Apr-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 245: Discover User Inactivity Time","author":["Pascal Scheffers <[email protected]>","Reinhard Max <[email protected]>","Neil Madden <[email protected]>"],"is-jest":false},
	"244":{"url":"./tip/244.md","created":"22-Mar-2005","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 244: PNG Photo Image Support for Tk","discussions-to":"news:comp.lang.tcl","author":["Michael Kirkham <[email protected]>"],"is-jest":false},
	"243":{"url":"./tip/243.md","tk-ticket":"1167420","keywords":"Tk","created":"16-Mar-2005","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 243: Supply Find Dialog for the Text Widget","author":["Rüdiger Härtel <[email protected]>"],"is-jest":false},
	"242":{"url":"./tip/242.md","tk-ticket":"1156388","created":"03-Mar-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 242: Preselect Filter on tk_get*File Dialogs","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"241":{"url":"./tip/241.md","tcl-ticket":"1152746","keywords":"Tcl,sorted lists,matching","created":"26-Feb-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 241: Case-Insensitive Switches and List Searching and Sorting","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"240":{"url":"./tip/240.md","tcl-ticket":"1315115","obsoletes":"88","keywords":"Tcl","created":"22-Feb-2005","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 240: An Ensemble Command to Manage Processes","author":["Steve Bold <[email protected]>"],"is-jest":false},
	"239":{"url":"./tip/239.md","created":"26-Jan-2005","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 239: Enhance the 'load' Command","author":["Jeff Hobbs <[email protected]>"],"is-jest":false},
	"238":{"url":"./tip/238.md","keywords":"Tk","created":"25-Jan-2005","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 238: Fire Event when Widget Created","author":["Gerald W. Lester <[email protected]>"],"is-jest":false},
	"237":{"url":"./tip/237.md","created":"14-Jan-2005","post-history":"","state":"Final","tcl-branch":"kennykb-numerics-branch","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 237: Arbitrary-Precision Integers for Tcl","author":["Kevin B. Kenny <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"236":{"url":"./tip/236.md","keywords":"Tk,anchor,place","created":"25-Dec-2004","post-history":"","state":"Final","implementation-url":"http://www.eecs.umich.edu/~mckay/canvmoveto.patch.gz","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 236: Absolute Positioning of Canvas Items","author":["Neil McKay <[email protected]>"],"is-jest":false},
	"235":{"url":"./tip/235.md","created":"10-Dec-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 235: Exposing a C API for Ensembles","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"234":{"url":"./tip/234.md","keywords":"Tcl,zip,gzip,deflate","created":"08-Dec-2004","post-history":"","state":"Final","implementation-url":"http://svn.scheffers.net/zlib","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 234: Add Support For Zlib Compression","author":["Pascal Scheffers <[email protected]>"],"is-jest":false},
	"233":{"url":"./tip/233.md","tcl-ticket":"1073863","created":"30-Nov-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 233: Virtualization of Tcl's Sense of Time","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"232":{"url":"./tip/232.md","keywords":"math,expr,Tcl","created":"26-Nov-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 232: Creating New Math Functions for the 'expr' Command","author":["Arjen Markus <[email protected]>","Kevin Kenny <[email protected] >"],"is-jest":false},
	"231":{"url":"./tip/231.md","tk-ticket":"1062022","created":"06-Nov-2004","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 231: Support for [wm attributes] on X11","author":["Joe English <[email protected]>"],"is-jest":false},
	"230":{"url":"./tip/230.md","tcl-ticket":"1163274","created":"02-Nov-2004","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 230: Tcl Channel Transformation Reflection API","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"229":{"url":"./tip/229.md","tcl-ticket":"1159942","created":"03-Nov-2004","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 229: Scripted Control of Name Resolution in Namespaces","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"228":{"url":"./tip/228.md","created":"02-Nov-2004","post-history":"","state":"Draft","implementation-url":"http://sourceforge.net/projects/tclvfs/","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 228: Tcl Filesystem Reflection API","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"227":{"url":"./tip/227.md","tcl-ticket":"1060579","keywords":"Tcl","created":"30-Oct-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 227: Interface to Get and Set the Return Options of an Interpreter","author":["Don Porter <[email protected]>"],"is-jest":false},
	"226":{"url":"./tip/226.md","tcl-ticket":"1060579","keywords":"Tcl","created":"30-Oct-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 226: Interface to Save and Restore Interpreter State","author":["Don Porter <[email protected]>"],"is-jest":false},
	"225":{"url":"./tip/225.md","tcl-ticket":"1052584","created":"25-Oct-2004","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 225: Arithmetic Series with Optimized Space Complexity","author":["Salvatore Sanfilippo <[email protected]>","Miguel Sofer <[email protected]>"],"is-jest":false},
	"224":{"url":"./tip/224.md","":"sensible way.","state":"Rejected","type":"Project","author":["Peter MacDonald <[email protected]>","Robert Seeger <[email protected]>","Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, SL","votes-against":"DGP, AK","rejection-reason":"","created":"28-Sep-2004","title":"# TIP 224: Add New [array] Subcommand 'value'","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-224","votes-present":"FV","is-jest":false},
	"223":{"url":"./tip/223.md","tk-ticket":"1032982","created":"21-Sep-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 223: Full-Screen Toplevel Support for Tk","author":["Mo DeJong <[email protected]>"],"is-jest":false},
	"222":{"url":"./tip/222.md","tk-ticket":"892194","keywords":"Tk","created":"16-Sep-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 222: Add [wm attributes -alpha] Attribute on Windows","author":["Jeff Hobbs <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"221":{"url":"./tip/221.md","tcl-ticket":"1060579","keywords":"bgerror,return,options","created":"15-Sep-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 221: Allow Background Error Handlers to Accept Return Options","author":["Don Porter <[email protected]>"],"is-jest":false},
	"220":{"url":"./tip/220.md","tcl-ticket":"1057093","created":"12-Sep-2004","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 220: Escalate Privileges in VFS Close Callback","author":["Colin McCormack <[email protected]>","Andreas Kupries <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"219":{"url":"./tip/219.md","tcl-ticket":"1025294","created":"09-Sep-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 219: Tcl Channel Reflection API","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"218":{"url":"./tip/218.md","tcl-ticket":"875701","created":"09-Sep-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 218: Tcl Channel Driver Thread State Actions","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>","Larry W. Virden <[email protected]>","David Gravereaux <[email protected]>"],"is-jest":false},
	"217":{"url":"./tip/217.md","tcl-ticket":"1017532","keywords":"Tcl,lsort,parallel lists","created":"26-Aug-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 217: Getting Sorted Indices out of Lsort","author":["James P. Salsman <[email protected]>"],"is-jest":false},
	"216":{"url":"./tip/216.md","keywords":"Tcl, debugging, argument, shell","created":"23-Aug-2004","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 216: Handling Command-Line Options in Tclsh and Wish","author":["Arjen Markus <[email protected]>"],"is-jest":false},
	"215":{"url":"./tip/215.md","tcl-ticket":"1413115","keywords":"Tcl","created":"25-Aug-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 215: Make [incr] Auto-Initialize Undefined Variables","author":["Andreas Leitgeb <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"214":{"url":"./tip/214.md","obsoletes":"117","keywords":"Tcl,info,representation","created":"24-Aug-2004","post-history":"","state":"Withdrawn","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 214: Add New Object Introspection Command","author":["Ulrich Schöbel <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"213":{"url":"./tip/213.md","keywords":"Tk","created":"21-Aug-2004","obsoleted-by":"324","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 213: A Standard Dialog for Font Selection","author":["Donal K. Fellows <[email protected]>","Pat Thoyts <[email protected]>"],"is-jest":false},
	"212":{"url":"./tip/212.md","tcl-ticket":"1008768","keywords":"tcl, dict, update, script","created":"11-Aug-2004","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 212: Temporarily Opening out a Dictionary","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"211":{"url":"./tip/211.md","keywords":"Tcl","created":"10-Aug-2004","obsoleted-by":"280","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 211: Add Full Stack Trace Capability","author":["Robert Seeger <[email protected]>","Robert Seeger <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"210":{"url":"./tip/210.md","tcl-ticket":"999162","keywords":"Tcl,filename","created":"19-Jul-2004","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 210: Add 'tempfile' Subcommand to 'file'","author":["Bob Techentin <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"209":{"url":"./tip/209.md","tcl-ticket":"991742","keywords":"clock, milliseconds, microseconds","created":"12-Jul-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 209: Add [clock milliseconds], and [clock microseconds]","author":["Reinhard Max <[email protected]>"],"is-jest":false},

>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>

|

|


|


|
|

|
|
|

|
|

|

|
|





|
|

|

|

|
|
|

|
|








|





|


|

|


|





|





|
|

|
|







|



|


|
|












|
|
|







|

|
|

|
|




|


|

|

|
|
|
|

|








|










|



|
|


|
|
|
|





|
|
|
|





|
|






|
|
|

|




|
|




|




|


|
|
|


|


|

|


|


|





|


|

|










|







|





|









|





|
|




|
|
|




|

|



|
|
|
|

|

|
|




|











|





|






|


|


|
|
|









|


|




|



|







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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
{"tip": {
	"694":{"url":"./tip/694.md","created":"2024-04-11","votes-against":"","votes-for":"","vote-summary":"","state":"Draft","tcl-version":"any","vote":"Pending","type":"Project","title":"# TIP 694: Define a definite test environment","votes-present":"","author":["chw"],"is-jest":false},
	"693":{"url":"./tip/693.md","created":"27-Mar-2024","votes-against":"none","votes-for":"DP, BG, AK, KW, MC, SL, FV, JN","vote-summary":"Accepted 8/0/0","state":"Final","tcl-version":"8.7 and 9.0","vote":"Done","type":"Project","title":"# TIP 693: Restart the changes files","votes-present":"none","author":["Don Porter <[email protected]>"],"is-jest":false},
	"692":{"url":"./tip/692.md","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"AK, FV, JN, MC, KW, SL","votes-against":"None","created":"21-03-2024","title":"# TIP 692: Revise Tcl_GetAliasObj, remove Tcl_GetAlias()","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-692","votes-present":"None","is-jest":false},
	"691":{"url":"./tip/691.md","state":"Draft","vote-summary":"","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"","votes-against":"","created":"21-03-2024","title":"# TIP 691: Setting -profile for tclsh/wish and the \"source\"/\"open\" commands.","vote":"Pending","tcl-version":"8.7 and 9.0","tcl-branch":"tip-691","votes-present":"","is-jest":false},
	"690":{"url":"./tip/690.md","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>, Rolf Ade <[email protected]>"],"votes-for":"AK, FV, JN, MC, KW, SL","votes-against":"None","created":"20-03-2024","title":"# TIP 690: Make \"clock scan -valid 1\" the default","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-690","votes-present":"None","is-jest":false},
	"689":{"url":"./tip/689.md","state":"Draft","vote-summary":"","type":"Project","author":["Harald Oehlmann <[email protected]>","Jan Nijtmans <[email protected]>","Sergey G. Brester <[email protected]>"],"votes-for":"","votes-against":"","created":"13-03-2024","title":"# TIP 689: \"namespace unknown\" independent on caller namespace","vote":"Pending","tcl-version":"8.7 and 9.0","tcl-branch":"tip-689","votes-present":"","is-jest":false},
	"688":{"url":"./tip/688.md","state":"Final","vote-summary":"3 / 0 / 0","type":"Project","author":["Harald Oehlmann <[email protected]>","Sergey G. Brester <[email protected]>"],"votes-for":"JN, MC, SL","votes-against":"none","created":"27-02-2024","title":"# TIP 688: clock command revision and speedup","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-688","votes-present":"none","is-jest":false},
	"687":{"url":"./tip/687.md","state":"Draft","vote-summary":"","type":"Project","tk-branch":"tip-687","author":["Jan Nijtmans <[email protected]>"],"votes-for":"","votes-against":"","created":"30-1-2024","title":"# TIP 687: locale support for word handling in text and entry","vote":"Pending","tcl-version":"9.1","votes-present":"","is-jest":false},
	"686":{"url":"./tip/686.md","state":"Final","vote-summary":"3 / 0 / 0","type":"Project","tk-branch":"tip-686","author":["Jan Nijtmans <[email protected]>"],"votes-for":"FV, JN, SL","votes-against":"none","created":"29-1-2024","title":"# TIP 686: Make NextWord/SelectNextWord behavior platform-independant","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"685":{"url":"./tip/685.md","state":"Final","vote-summary":"4 / 2 / 0","type":"Project","author":["Harald Oehlmann"],"votes-for":"BG, KW, MC, SL","votes-against":"DP, JN","created":"10-01-2024","obsoleted-by":"652","title":"# TIP 685: rename \"string is unicode\" to \"string is transferable\"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-685","votes-present":"none","is-jest":false},
	"684":{"url":"./tip/684.md","state":"Final","vote-summary":"7 / 0 / 0","type":"Project","tk-branch":"touchpad_events","author":["Marc Culler"],"votes-for":"MC,KW,FV,SL,JN,DF,AK","votes-against":"none","created":"28-11-2023","title":"# TIP 684: Add Support for Touchpad Scrolling to Tk","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"683":{"url":"./tip/683.md","state":"Final","vote-summary":"6 / 0 / 0","type":"Project","tk-branch":"tk-legacy","author":["Jan Nijtmans <[email protected]>"],"votes-for":"AK, DKP, FV, JN, KW, SL","votes-against":"none","created":"17-11-2023","title":"# TIP 683: Remove legacy \"pack\" and \"scrollbar\" syntax","vote":"Done","tcl-version":"9.0","votes-present":"none","is-jest":false},
	"682":{"url":"./tip/682.md","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 682: Create tmp. widget in \"option get\" call","author":["René Zaumseil <r.zaumseil@freenet.de>"],"is-jest":false},
	"681":{"url":"./tip/681.md","state":"Final","vote-summary":"Accepted 4/0/0","type":"Project","tk-branch":"gripsize","author":["Jan Nijtmans <[email protected]>"],"votes-for":"FV, JN, KW, SL","votes-against":"none","created":"07-11-2023","title":"# TIP 681: Ttk \"size\"-related options","vote":"Done","tcl-version":"9.0","votes-present":"none","is-jest":false},
	"680":{"url":"./tip/680.md","state":"Withdrawn","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 680: Enhance definition of a \"number\" in Tcl","author":["Brian Griffin"],"is-jest":false},
	"679":{"url":"./tip/679.md","keywords":"tk, window manager","created":"22-Sep-2023","state":"Draft","tk-branch":"tip-679","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 679: General access to X window properties","author":["Schelte Bron <[email protected]>"],"is-jest":false},
	"678":{"url":"./tip/678.md","keywords":"Tk, Ttk","created":"07-Sep-2023","state":"Final","tk-branch":"treeview-list-detached","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 678: Better API for Detached Treeview Items","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"677":{"url":"./tip/677.md","state":"Final","vote-summary":"4/0/2","type":"Project","author":["Donal Fellows <[email protected]>"],"votes-for":"DKF, BG, MC, KW","votes-against":"","created":"29-Jun-2023","title":"# TIP 677: Constant Variables","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-677","votes-present":"SL, DGP","is-jest":false},
	"676":{"url":"./tip/676.md","created":"23-Jun-2023","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 676: An \"expr\" alternative - \"calc\" command aliased to \"=\"","author":["Colin Macleod <[email protected]>"],"is-jest":false},
	"675":{"url":"./tip/675.md","keywords":"Tk, Ttk, cursor, blink","state":"Final","vote-summary":"4/0/0","tk-branch":"tip-675","type":"Project","author":["Francois Vogel <[email protected]>"],"votes-for":"BG, SL, FV, KW","votes-against":"none","created":"13-Jun-2023","title":"# TIP 675: Control cursor blinking cycle in Ttk widgets.","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"674":{"url":"./tip/674.md","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 674: a new multiple expression command","author":["René Zaumseil <[email protected]>"],"is-jest":false},
	"673":{"url":"./tip/673.md","state":"Final","vote-summary":"Accepted 5/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"AK, BG, DGP, JN, SL","votes-against":"none","created":"07-Jun-2023","title":"# TIP 673: Remove deprecated [trace] subcommands","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-673","votes-present":"none","is-jest":false},
	"672":{"url":"./tip/672.md","created":"2023-06-06","":"","state":"Draft","tcl-branch":"tip-672","tcl-version":"9.1","type":"Project","title":"# TIP 672: Extend $ substitution to include expressions as $(expression)","author":["Eric Taylor"],"is-jest":false},
	"671":{"url":"./tip/671.md","created":"2023-06-04","state":"Draft","tcl-branch":"tip-671","tcl-version":"9.1","type":"Project","title":"# TIP 671: New encoding profile - lossless","author":["Ashok P. Nadkarni <[email protected]>"],"is-jest":false},
	"670":{"url":"./tip/670.md","created":"29-05-2023","state":"Final","tcl-branch":"tip-670","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 670: Simple Extra Procedures for File Access","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"669":{"url":"./tip/669.md","created":"24-05-2023","state":"Draft","tcl-branch":"tip-669","tcl-version":"9.1","type":"Project","title":"# TIP 669: Pipe PIDs as Channel Property","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"668":{"url":"./tip/668.md","created":"11-05-2023","state":"Draft","tcl-branch":"tip-668","tcl-version":"9.1","type":"Project","title":"# TIP 668: Consolidate all Tcl_Attempt* functions.","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"667":{"url":"./tip/667.md","obsoleted-by":"657","state":"Draft","tcl-branch":"tip-667","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 667: Make \"strict\" the default encoding profile.","author":["Nathan Coulter <[email protected]>"],"is-jest":false},
	"666":{"url":"./tip/666.md","state":"Final","vote-summary":"Accepted 5/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"AK, BG, JN, KW, SL","votes-against":"none","created":"03-05-2023","title":"# TIP 666: Change ptrdiff_t → Tcl_Size in Tcl 8.7 (and 9.0)","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-666","votes-present":"none","is-jest":false},
	"665":{"url":"./tip/665.md","state":"Final","vote-summary":"Accepted 4/0/1","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"AK, JN, KW, SL","votes-against":"none","created":"02-05-2023","title":"# TIP 665: Remove support for internal utf-16 for Tcl 8.7 (and 9.0)","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-665","votes-present":"BG","is-jest":false},
	"664":{"url":"./tip/664.md","state":"Withdrawn","vote-summary":"Accepted 7/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"AF, AK, DKF, JN, KW, MC, SL","votes-against":"none","created":"02-05-2023","obsoleted-by":"661","title":"# TIP 664: Enable compiler warnings for missing int → Tcl_Size conversions","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-664","votes-present":"none","is-jest":false},
	"663":{"url":"./tip/663.md","":"Vote-Summary	Accepted 9/0/0","state":"Final","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"DP, BG, KW, AK, FV, JN, JD, MC, SL","votes-against":"none","created":"26-Apr-2023","title":"# TIP 663: Cease distribution of the ChangeLog files","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-663","votes-present":"none","is-jest":false},
	"662":{"url":"./tip/662.md","state":"Final","vote-summary":"Accepted 5/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"AK, BG, DGP, JN, SL","votes-against":"none","created":"26-Apr-2023","title":"# TIP 662: Un-deprecate Tcl_VarEval","vote":"Done","tcl-version":"8.6","tcl-branch":"tip-662","votes-present":"none","is-jest":false},
	"661":{"url":"./tip/661.md","state":"Final","vote-summary":"3 / 0 / 0","type":"Project","author":["Rolf Ade <[email protected]>","Harald Oehlmann <[email protected]>"],"votes-for":"SL, AK, KW","votes-against":"none","created":"25-04-2023","title":"# TIP 661: Disable the Tcl 8 compatibility macros in Tcl 9 by default","vote":"Done","tcl-version":"9.0","tcl-branch":"disabletcl8api","votes-present":"none","is-jest":false},
	"660":{"url":"./tip/660.md","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","author":["Ashok P. Nadkarni <[email protected]>"],"votes-for":"SL, BG, DF, KK, MC, KW, JD, FV, AK","votes-against":"none","created":"30-03-2023","title":"# TIP 660: Use signed types for lengths and indices","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-660","votes-present":"none","is-jest":false},
	"659":{"url":"./tip/659.md","state":"Withdrawn","tcl-branch":"tip-659","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 659: Allow other default profiles than \"strict\"","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"658":{"url":"./tip/658.md","keywords":"tk menu","state":"Final","vote-summary":"Accepted 4/0/0","type":"Project","tk-branch":"tip-658","author":["Schelte Bron <[email protected]>"],"votes-for":"BG, SL, FV, KW","votes-against":"none","created":"16-Mar-2023","title":"# TIP 658: Attach identifiers to Tk menu entries","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"657":{"url":"./tip/657.md","votes-against":"none","votes-for":"AF, AK, JN, KW, MC, SL","vote-summary":"Accepted 6/0/1","state":"Final","tcl-branch":"tip-657","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 657: Make \"-profile strict\" the default in Tcl 9.0","votes-present":"DKF","author":["Jan Nijtmans <[email protected]>","Nathan Coulter <[email protected]>"],"is-jest":false},
	"656":{"url":"./tip/656.md","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Ashok P. Nadkarni <[email protected]>"],"votes-for":"AK, JD, JN, KW, MC, SL","votes-against":"none","created":"2023-02-13","title":"# TIP 656: A revised proposal for encodings","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-656","votes-present":"none","is-jest":false},
	"655":{"url":"./tip/655.md","keywords":"Tk, Aqua","state":"Final","vote-summary":"Accepted 5/0/0","type":"Project","tk-branch":"655","author":["Marc Culler"],"votes-for":"FV, JN, KW, MC, SL","votes-against":"none","created":"28-Jan-2023","title":"# TIP 655: Support the styleMask property for NSWindow and NSPanel in Aqua","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"654":{"url":"./tip/654.md","created":"10-Jan-2023","obsoleted-by":"656","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 654: Profiles for character encoding/decoding behaviour","author":["Nathan Coulter <[email protected]>"],"is-jest":false},
	"653":{"url":"./tip/653.md","state":"Final","vote-summary":"3/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>","Harald Oehlmann <[email protected]>"],"votes-for":"AK, JN, SL","votes-against":"none","created":"08-Jan-2023","title":"# TIP 653: Handle consumed data of channel commands in case of encoding errors","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-653","votes-present":"none","is-jest":false},
	"652":{"url":"./tip/652.md","created":"26-Dec-2022","votes-against":"none","votes-for":"BG, DP, JN, KW, MC, SL","vote-summary":"6 / 0 / 0","state":"Final","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 652:  Remove  \"string is unicode\" and Tcl_CharIsUnicode\"","votes-present":"none","author":["Nathan Coulter <[email protected]>"],"is-jest":false},
	"651":{"url":"./tip/651.md","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","author":["Ashok P. Nadkarni <[email protected]>"],"votes-for":"BG, JN, SL","votes-against":"none","created":"17-Nov-2022","title":"# TIP 651: Expose TclDStringToObj via stubs table","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-651","votes-present":"none","is-jest":false},
	"650":{"url":"./tip/650.md","state":"Final","vote-summary":"Accepted 2/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"BG, JN","votes-against":"none","created":"15-Nov-2022","title":"# TIP 650: New function Tcl_GetWideUIntFromObj()","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-650","votes-present":"none","is-jest":false},
	"649":{"url":"./tip/649.md","keywords":"list","created":"14-Nov-2022","state":"Draft","tcl-branch":"tip-649","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 649: Expose additional list functionality in the C API","author":["Ashok P. Nadkarni <[email protected]>"],"is-jest":false},
	"648":{"url":"./tip/648.md","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"AK, FV, JN, MC, KW, SL","votes-against":"None","created":"04-Nov-2022","title":"# TIP 648: New functions Tcl_NewWideUIntObj()/Tcl_SetWideUIntObj()","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-648","votes-present":"None","is-jest":false},
	"647":{"url":"./tip/647.md","state":"Final","vote-summary":"4 / 0 / 0","type":"Project","tk-branch":"tip-647","author":["Jan Nijtmans <[email protected]>"],"votes-for":"BG, DKF, JN, SL","votes-against":"none","created":"04-11-2022","title":"# TIP 647: Change Tk_ConfigureWidgets signature, abandon TK_CONFIG_OBJS","vote":"Done","tcl-version":"9.0","votes-present":"none","is-jest":false},
	"646":{"url":"./tip/646.md","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"JN, KBK, KW, SL","votes-against":"none","created":"17-Oct-2022","title":"# TIP 646: Change -eofchar handling","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-646","votes-present":"none","is-jest":false},
	"645":{"url":"./tip/645.md","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","tk-branch":"tip-645","author":["Patrick May <[email protected]>"],"votes-for":"JN, KBK, KW, SL","votes-against":"none","created":"11-Oct-2022","title":"# TIP 645: ttk color palette support","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"644":{"url":"./tip/644.md","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","author":["Ashok P. Nadkarni <[email protected]>"],"votes-for":"BG JN SL","votes-against":"none","created":"10-Oct-2022","title":"# TIP 644: Make Tcl_ObjType extensible","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-644","votes-present":"none","is-jest":false},
	"643":{"url":"./tip/643.md","keywords":"encoding","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","author":["Ashok P. Nadkarni <[email protected]>"],"votes-for":"JN, KBK SL","votes-against":"none","created":"09-Oct-2022","title":"# TIP 643: Provide a public API to retrieve nul terminator length for an encoding","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-643","votes-present":"none","is-jest":false},
	"642":{"url":"./tip/642.md","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","tk-branch":"tip-642","author":["Jan Nijtmans <[email protected]>"],"votes-for":"JN, KBK SL","votes-against":"none","created":"05-Oct-2022","title":"# TIP 642: Let TK_OPTION_BOOL/TK_OPTION_STRING_TABLE handle (C99) bool/enum.","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"641":{"url":"./tip/641.md","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"JN, KBK SL","votes-against":"none","created":"02-Oct-2022","title":"# TIP 641: Let Tcl_GetBoolean(FromObj) handle (C99) bool.","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-641","votes-present":"none","is-jest":false},
	"640":{"url":"./tip/640.md","keywords":"Tcl","":"Vote-Summary   Accepted 5/0/0","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"FV, JN, KW, MC, SL","votes-against":"none","created":"21-09-2022","title":"# TIP 640: Remove Tcl_SaveResult","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-640","votes-present":"none","is-jest":false},
	"639":{"url":"./tip/639.md","keywords":"Tk, Aqua","":"Vote-Summary   Accepted 4/0/0","state":"Final","type":"Project","tk-branch":"mac_styles_87","author":["Marc Culler"],"votes-for":"FV, JN, KW, MC","votes-against":"none","created":"18-Sep-2022","title":"# TIP 639: Include the mac_styles features in Tk 8.7","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"638":{"url":"./tip/638.md","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"DP, JN, SL, FV, KK, KW","votes-against":"none","created":"18-Sep-2022","title":"# TIP 638: New public routines Tcl_GetNumber(FromObj)","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-getnumber","votes-present":"none","is-jest":false},
	"637":{"url":"./tip/637.md","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"DP, JN, SL, FV, KK, KW","votes-against":"none","created":"17-Sep-2022","title":"# TIP 637: Make [glob] always -nocomplain","vote":"Done","tcl-version":"9.0","tcl-branch":"novem","votes-present":"none","is-jest":false},
	"636":{"url":"./tip/636.md","":"","state":"Final","type":"Project","author":["Brian Griffin <[email protected]>"],"votes-summary":"4/0/0","votes-for":"SL, DF, KW, BG","votes-against":"none","created":"1-Sep-2022","title":"# TIP 636: Expand List Flexibility with Abstract List Tcl_Obj Type","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-636-tcl9-644","votes-present":"none","is-jest":false},
	"635":{"url":"./tip/635.md","keywords":"upvar,namespace upvar","created":"26-Aug-2022","state":"Withdrawn","tcl-branch":"tip-635","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 635: Introspection for 'upvar' and 'namespace upvar'","author":["Schelte Bron <[email protected]>"],"is-jest":false},
	"634":{"url":"./tip/634.md","keywords":"upvar,trace,array","state":"Final","type":"Project","author":["Schelte Bron <[email protected]>"],"vote-results":"4/0/0 accepted","votes-for":"FV, KW, JN, SL","votes-against":"none","created":"21-Aug-2022","title":"# TIP 634: Remove inconsistency in variable tracing of an array","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-634","votes-present":"none","is-jest":false},
	"633":{"url":"./tip/633.md","keywords":"channel encoding","":"Vote-Summary   Accepted 4/0/1","state":"Final","type":"Project","author":["Harald Oehlmann <[email protected]>"],"votes-for":"JN, KW, MC, SL","votes-against":"none","created":"12-Aug-2022","title":"# TIP 633: configure channel about channel encoding error reporting mode","vote":"Done","tcl-version":"8.7","tcl-branch":"tip633-tcl9-fconfigure-strictencoding","votes-present":"FV","is-jest":false},
	"632":{"url":"./tip/632.md","keywords":"tk image","state":"Final","vote-summary":"Accepted 6/0/0","tk-branch":"rfe-f285ddcd-animated-gif-metadata","type":"Project","author":["Harald Oehlmann <[email protected]>"],"votes-for":"MC, BG, SL, JN, FV, KW","votes-against":"none","created":"12-Aug-2022","tk-ticket":"f285ddcd23","title":"# TIP 632: return gif animated metadata","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"631":{"url":"./tip/631.md","keywords":"list","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Ashok P. Nadkarni <[email protected]>"],"votes-for":"BG, KW, KK, MC, SL, FV","votes-against":"none","created":"6-Aug-2022","title":"# TIP 631: ledit - a generalized insert/delete command for list variables","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-631","votes-present":"none","is-jest":false},
	"630":{"url":"./tip/630.md","keywords":"Tcl","":"Vote-Summary   Accepted 3/0/1","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"JN, KBK, KW","votes-against":"none","created":"05-07-2022","title":"# TIP 630: TclOO commands > 2^31 (for 8.7)","vote":"Done","tcl-version":"8.7","tcl-branch":"tcloo-64bit","votes-present":"FV","is-jest":false},
	"629":{"url":"./tip/629.md","state":"Final","vote-summary":"Accepted 8/0/0","type":"Project","author":["Eric Taylor <[email protected]>","Brian Griffin <[email protected]>"],"votes-for":"SL, MC, KK, AK, JN, FV, KW, BG","votes-against":"none","created":"28-06-2022","title":"# TIP 629: Add a lseq (formally \"range\") command to the core of list commands","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-629","votes-present":"none","is-jest":false},
	"628":{"url":"./tip/628.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"JN, KBK SL","votes-against":"none","created":"22-06-2022","title":"# TIP 628: Shared 8.7/9.0 build environment","vote":"Done","tcl-version":"9.0","tcl-branch":"tcl8-compat","votes-present":"none","is-jest":false},
	"627":{"url":"./tip/627.md","keywords":"Tcl","":"Vote-Summary   Accepted 3/0/1","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"JN, KBK, KW","votes-against":"none","created":"01-06-2022","title":"# TIP 627: New functions for handling commands > 2^31 elements (for 8.7)","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-627","votes-present":"FV","is-jest":false},
	"626":{"url":"./tip/626.md","keywords":"Tcl","created":"24-05-2022","state":"Draft","tcl-branch":"tip-626","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 626: Command arguments > 2^31 elements","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"625":{"url":"./tip/625.md","keywords":"Tcl","":"Vote-Summary   Accepted 3/0/0","state":"Final","type":"Project","author":["Ashok P. Nadkarni <[email protected]>"],"votes-for":"BG, JN, KW","votes-against":"none","created":"17-05-2022","title":"# TIP 625: Re-implementation of lists","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-625","votes-present":"none","is-jest":false},
	"624":{"url":"./tip/624.md","keywords":"Tcl","":"Vote-Summary   Accepted 5/0/1","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"DGP, FV, JN, KBK, SL","votes-against":"none","created":"06-April-2022","title":"# TIP 624: Deprecate Tcl_MakeSafe","vote":"Done","tcl-version":"8.7","tcl-branch":"rfe-655300","votes-present":"MC","is-jest":false},
	"623":{"url":"./tip/623.md","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"DGP, JN, SL","votes-against":"none","created":"24-Mar-2022","title":"# TIP 623: Bless negative index arguments to Tcl_GetRange","vote":"Done","tcl-version":"8.6.13","tcl-branch":"tip-623","votes-present":"none","is-jest":false},
	"622":{"url":"./tip/622.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 5/0/1","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"AK, JN, KBK, KW, SL","votes-against":"none","created":"23-Mar-2022","title":"# TIP 622: Full Unicode for Tcl 8.7","vote":"Done","tcl-version":"8.7","tcl-branch":"full-utf-for-87","votes-present":"JD","is-jest":false},
	"621":{"url":"./tip/621.md","keywords":"Tk, ICU","":"Vote-Summary   Accepted 3/0/1","state":"Final","type":"Project","tk-branch":"glyph_indexing_2","author":["Jan Nijtmans <[email protected]>"],"votes-for":"FV, JN, KW","votes-against":"none","created":"16-Mar-2022","title":"# TIP 621: Glyph clustering for Tk","vote":"Done","tcl-version":"8.7","votes-present":"KBK","is-jest":false},
	"620":{"url":"./tip/620.md","keywords":"Tk, treeview","state":"Final","vote-summary":"Accepted 8/0/0","tk-branch":"pspjuth-treeview","type":"Project","author":["Peter Spjuth <[email protected]>"],"votes-for":"MC, BG, KBK, AKU, SL, JN, FV, KW","votes-against":"none","created":"9-Mar-2022","title":"# TIP 620: Treeview cell padding.","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"619":{"url":"./tip/619.md","keywords":"Tcl Tcl_UniCharToUtf()","state":"Final","vote-summary":"Accepted 4/0/1","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"AK, JN, KW, SL","votes-against":"none","title":"# TIP 619: New TCL\\_COMBINE flag for Tcl\\_UniCharToUtf()","post-history":"","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-619","votes-present":"FV","is-jest":false},
	"618":{"url":"./tip/618.md","keywords":"Tcl Tcl_GetBoolFromObj() Tcl_GetBool()","":"Vote-Summary   Accepted 5/0/0","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"FV, JN, KW, MC, SL","votes-against":"none","title":"# TIP 618: New Tcl\\_GetBool* functions with TCL\\_NULL\\_OK flag","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-618","votes-present":"none","is-jest":false},
	"617":{"url":"./tip/617.md","votes-against":"none","votes-for":"JN, MC, KW","vote-summary":"Accepted 3/0/2","state":"Final","tcl-branch":"tip-617","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 617: Tcl_WCharLen/Tcl_Char16Len","votes-present":"FV, SL","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"616":{"url":"./tip/616.md","votes-against":"none","votes-for":"JN, KBK, KW","vote-summary":"Accepted 3/0/2","state":"Final","tcl-branch":"tip-616","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 616: Tcl lists > 2^31 elements","votes-present":"FV, SL","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"615":{"url":"./tip/615.md","state":"Draft","tcl-branch":"tip-615","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 615: string is index","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"614":{"url":"./tip/614.md","":"","state":"Rejected","vote-summary":"Rejected 1/2/2","type":"Project","tk-branch":"tip614-win-wtssession-change","author":["Harald Oehlmann <[email protected]>"],"votes-for":"JN","votes-against":"FV, KW","created":"14-Jan-2022","tk-ticket":"8a49f43b","title":"# TIP 614: Windows: OS: WTSSESSION change notification","vote":"Done","tcl-version":"8.7","votes-present":"MC, SL","is-jest":false},
	"613":{"url":"./tip/613.md","":"","keywords":"Tcl Tcl_GetIndexFromObj() Tcl_GetIndexFromObjStruct()","state":"Final","vote-summary":"Accepted 7/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"BG, FV, JD, JN, KW, MC, SL","created":"09-Dec-2021","title":"# TIP 613: New INDEX\\_NULL\\_OK flag for Tcl_GetIndexFromObj*()","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-613","votes-present":"none","is-jest":false},
	"612":{"url":"./tip/612.md","keywords":"Tk","created":"9-Dec-2021","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 612: Setting WM_CLASS for main/root window","author":["Benjamin Schnitzler <[email protected]>"],"is-jest":false},
	"611":{"url":"./tip/611.md","created":"2-Sep-2021","post-history":"","state":"Draft","implementation-url":"https://wiki.tcl-lang.org/page/rphoto","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 611: Add subcommands to the \"photo image\" command to rotate and reflect an image","author":["Arjen Markus <[email protected]>, Richard Suchenwirth <[email protected]>"],"is-jest":false},
	"610":{"url":"./tip/610.md","keywords":"Tk, desktop integration","state":"Final","vote-summary":"Accepted 5/0/0","type":"Project","author":["Kevin Walzer <[email protected]>"],"votes-for":"MC, SL, JN, FV, KW","votes-against":"none","created":"21-August-2021","title":"# TIP 610: Icon Badges","tcl-version":"8.7","vote":"Done","votes-present":"none","is-jest":false},
	"609":{"url":"./tip/609.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 4/0/1","type":"Project","author":["Christian Werner <[email protected]>"],"votes-against":"none","votes-for":"AK, JN, KW, SL","created":"06-August-2021","title":"# TIP 609: Enhance Tcl_ThreadQueueEvent()","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-609","votes-present":"FV","is-jest":false},
	"608":{"url":"./tip/608.md","keywords":"Tk,font,WorldChanged,event","":"Vote-Summary    Accepted 5/0/0","state":"Final","type":"Project","author":["Brian Griffin <[email protected]>"],"votes-against":"none","votes-for":"BG, FV, KW, SL, JN","created":"07-Aug-2021","tk-ticket":"3049518","title":"# TIP 608: Add virtual event when font configuration changes","post-history":"","vote":"Done","tcl-version":"8.6","votes-present":"none","is-jest":false},
	"607":{"url":"./tip/607.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 5/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"AK, FV, JN, KW, SL","created":"30-Jul-2021","title":"# TIP 607: -failindex option for encoding convertto/convertfrom","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip607-encoding-failindex","votes-present":"none","is-jest":false},
	"606":{"url":"./tip/606.md","":"","keywords":"Tk","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","tk-branch":"tip-606","author":["René Zaumseil <[email protected]>"],"votes-against":"none","votes-for":"BG, FV, JN, MC, SL, KW","created":"15-Jul-2021","title":"# TIP 606: Export more private Tk functions","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"605":{"url":"./tip/605.md","keywords":"Tcl","":"Vote-Summary    Accepted 7/0/0","state":"Final","type":"Project","author":["René Zaumseil <[email protected]>"],"votes-against":"none","votes-for":"AK, FV, JN, KBK, KW, MC, SL","created":"15-Jul-2021","title":"# TIP 605: Function to get class name from object","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-605","votes-present":"none","is-jest":false},
	"604":{"url":"./tip/604.md","keywords":"Tk, desktop integration","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","author":["Kevin Walzer <[email protected]>"],"votes-for":"MC, JD, KK, FV, DKF, JN, SL, BG, KW","votes-against":"none","created":"03-July-2021","title":"# TIP 604: Printing Support for Text and Canvas Widgets","tcl-version":"8.7","vote":"Done","votes-present":"none","is-jest":false},
	"603":{"url":"./tip/603.md","keywords":"Tcl, file","state":"Final","vote-summary":"Accepted 5/1/1","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-against":"KW","votes-for":"AK, DKF, JN, KBK, SL","created":"19-Jun-2021","title":"# TIP 603: Get 'stat' Information of Open Files","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-603","votes-present":"FV","is-jest":false},
	"602":{"url":"./tip/602.md","votes-against":"none","votes-for":"AK, JN, KBK, KW, MC, SL","vote-summary":"Accepted 6/0/0","state":"Final","tcl-branch":"tip-602","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 602: Remove tilde expansion in file paths.","votes-present":"none","author":["Harald Oehlmann <[email protected]>","Ashok P. Nadkarni <[email protected]>"],"is-jest":false},
	"601":{"url":"./tip/601.md","":"Vote-Summary    Accepted 6/0/0","votes-against":"none","votes-for":"FV, JD, JN, KW, MC, SL","state":"Withdrawn","tcl-branch":"encodings-with-flags","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 601: Make \"encoding convertto/convertfrom\" throw exceptions","votes-present":"none","author":["Harald Oehlmann <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"600":{"url":"./tip/600.md","state":"Draft","vote":"No voting","type":"Informative","title":"# TIP 600: Migration guide for Tcl 8.6/8.7/9.0","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"599":{"url":"./tip/599.md","":"Vote-Summary    Accepted 5/0/0","votes-against":"none","votes-for":"BG, JN, KW, MC, SL","state":"Final","tcl-branch":"build-info","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 599: Extended build information","votes-present":"none","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"598":{"url":"./tip/598.md","votes-against":"none","votes-for":"JN, KW, KK","vote-summary":"Accepted 3/0/5","state":"Final","tcl-branch":"rfe-800716","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 598: export TclWinConvertError","votes-present":"AK, DP, FV, MC, SL","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"597":{"url":"./tip/597.md","votes-against":"none","votes-for":"DGP, JN, MC","vote-summary":"Accepted 3/0/0","state":"Final","tcl-branch":"tip-597","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 597: \"string is unicode\" and better utf-8/utf-16/cesu-8 encodings","votes-present":"none","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"596":{"url":"./tip/596.md","votes-against":"none","votes-for":"BG, JN, KBK, KW, MC","vote-summary":"Accepted 5/0/0","state":"Final","tcl-branch":"rfe-854941","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 596: Stubs support for Embedding Tcl in other applications","votes-present":"none","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"595":{"url":"./tip/595.md","votes-against":"none","votes-for":"AK, DP, JN, KW, KK, MC, SL","vote-summary":"Accepted 7/0/1","state":"Final","tcl-branch":"bug-ea39ab591e","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 595: Unicode-aware/case-sensitive Loadable Library handling","votes-present":"FV","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"594":{"url":"./tip/594.md","keywords":"Tcl, file","":"Vote-Summary    Accepted 4/0/2","state":"Final","type":"Project","author":["Emiliano Gavilán <[email protected]>","aspect <[email protected]>"],"votes-against":"none","votes-for":"FV, JN, KBK, SL","created":"13-Jan-2021","title":"# TIP 594: Modernize \"file stat\" interface","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-594","votes-present":"DGP, MC","is-jest":false},
	"593":{"url":"./tip/593.md","keywords":"Tcl, lists","created":"31-Dec-2020","obsoleted-by":"631","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 593: Efficient List Item Existence-Test-and-Take","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"592":{"url":"./tip/592.md","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Ashok P. Nadkarni <[email protected]>"],"votes-for":"FV, JN, KW, KK, MC, SL","votes-against":"none","created":"12-Dec-2020","title":"# TIP 592: Stop support for Windows XP, Server 2003, Vista, Server 2008","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-592","votes-present":"none","is-jest":false},
	"591":{"url":"./tip/591.md","keywords":"Tk, bindings","state":"Final","vote-summary":"Accepted 5/0/0","type":"Project","tk-branch":"tip-591","author":["Harald Oehlmann <[email protected]>"],"votes-for":"JN, FV, KW, MC, SL","votes-against":"none","created":"13-Nov-2020","title":"# TIP 591: Rotate ttk::notebook window with mousewheel on tab","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"590":{"url":"./tip/590.md","keywords":"package","state":"Final","vote-summary":"Accepted 3/0/2","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"JN, KW, MC","created":"4-Nov-2020","title":"# TIP 590: Recommend lowercase Package Names","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-590","votes-present":"FV, SL","is-jest":false},
	"589":{"url":"./tip/589.md","created":"27-Oct-2020","post-history":"","state":"Withdrawn","tk-branch":"deprecate-bd-bg-fg","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 589: Deprecate \"-fg\", \"-bg\", \"-bd\" options in Tk.","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"588":{"url":"./tip/588.md","keywords":"X11","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","tk-branch":"keysym-unicode","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"DKF, FV, JN, KBK, KW, SL","created":"23-Oct-2020","title":"# TIP 588: Unicode for (X11) keysyms","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"587":{"url":"./tip/587.md","keywords":"Tcl source","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-for":"BG, DGP, DKF, FV, JN, KBK, KW, MC, SL","votes-against":"none","created":"20-Sept-2020","title":"# TIP 587: Default utf-8 for source command","post-history":"","tcl-branch":"tip-587","tcl-version":"9.0","vote":"Done","votes-present":"none","is-jest":false},
	"586":{"url":"./tip/586.md","keywords":"binary","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Christian Werner <[email protected]>"],"votes-against":"none","votes-for":"DKF, FV, JN, KBK, KW, SL","created":"18-Sep-2020","title":"# TIP 586: C String Parsing Support for binary scan","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-586-binary-scan-c-string","votes-present":"none","is-jest":false},
	"585":{"url":"./tip/585.md","keywords":"Tcl Tcl_GetIndexFromObj() Tcl_GetIndexFromObjStruct()","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Francois Vogel <[email protected]>"],"votes-for":"DGP, FV, JN, KW, MC, SL","votes-against":"none","created":"30-Aug-2020","title":"# TIP 585: Promote the INDEX\\_TEMP\\_TABLE flag of Tcl_GetIndexFromObj*() to the public interface","post-history":"","tcl-branch":"tip-585","tcl-version":"8.7","vote":"Done","votes-present":"none","is-jest":false},
	"584":{"url":"./tip/584.md","keywords":"Tk ttk introspection","state":"Final","vote-summary":"Accepted 6/0/0","tk-branch":"tip-584","type":"Project","author":["Francois Vogel <[email protected]>"],"votes-for":"MC, JD, DKF, FV, KW","votes-against":"none","created":"24-Aug-2020","title":"# TIP 584: Better introspection for ttk","post-history":"","tcl-version":"8.7","vote":"Done","votes-present":"none","is-jest":false},
	"583":{"url":"./tip/583.md","keywords":"Tcl","created":"15-Aug-2020","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 583: Add Option to Limit Depth of Execution Step Traces for Procs","author":["Eric Taylor <[email protected]>"],"is-jest":false},
	"582":{"url":"./tip/582.md","keywords":"Tcl","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, KBK, KW, MC, SL, FV","votes-against":"none","created":"13-Aug-2020","title":"# TIP 582: Comments in Expressions","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-582","votes-present":"none","is-jest":false},
	"581":{"url":"./tip/581.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"BG, DKF, FV, JD, JN, KBK, KW, MC, SL","created":"17-July-2020","title":"# TIP 581: Master/Slave","post-history":"","vote":"Done","tcl-version":"8.6","tcl-branch":"tip-581","votes-present":"none","is-jest":false},
	"580":{"url":"./tip/580.md","keywords":"export","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","tk-branch":"tip-580","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"BG, DKF, FV, JD, JN, KBK, KW, MC, SL","created":"14-July-2020","title":"# TIP 580: Export Tk_GetDoublePixelsFromObj and 5 more","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"579":{"url":"./tip/579.md","keywords":"safe interp auto_path access_path","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","author":["Keith Nash <[email protected]>"],"votes-against":"none","votes-for":"JN, KBK, SL","created":"07-Jul-2020","title":"# TIP 579: Improved auto_path for Safe Base interpreters","post-history":"","vote":"Done","version":"31-Aug-2022","tcl-version":"8.7","tcl-branch":"tip-579-8-7","votes-present":"none","is-jest":false},
	"578":{"url":"./tip/578.md","keywords":"Tcl index","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"AK, DKF, FV, JN, KW, SL","created":"10-June-2020","title":"# TIP 578: Death to TCL_DBGX","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"death-to-dbgx","votes-present":"none","is-jest":false},
	"577":{"url":"./tip/577.md","keywords":"Tcl index","":"Vote-Summary    Accepted 5/0/1","state":"Final","type":"Project","tk-branch":"enhanced-index","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"BG, JN, KW, MC, SL","created":"8-June-2020","title":"# TIP 577: Enhanced index values for Tk","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"KBK","is-jest":false},
	"576":{"url":"./tip/576.md","keywords":"Tk listbox","created":"25-May-2020","post-history":"","state":"Draft","tcl-version":"9.1","type":"Project","title":"# TIP 576: Poor-mans Table listbox enhancement","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"575":{"url":"./tip/575.md","votes-against":"none","votes-for":"JN, KW, SL","vote-summary":"Accepted 3/0/0","state":"Final","tcl-branch":"tip-575","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 575: Switchable Tcl\\_UtfCharComplete()/Tcl\\_UtfNext()/Tcl\\_UtfPrev()","votes-present":"none","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"574":{"url":"./tip/574.md","keywords":"Tk Ttk treeview tag","state":"Final","vote-summary":"Accepted 7/0/0","type":"Project","tk-branch":"bug-1bb2f1d7ab","author":["Emiliano Gavilan <[email protected]>, Francois Vogel <[email protected]>"],"votes-against":"none","votes-for":"MC, JD, DKF, BG, KBK, SL, FV","created":"8-May-2020","title":"# TIP 574: Add a 'tag delete' command to the ttk::treeview widget","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"573":{"url":"./tip/573.md","state":"Withdrawn","tcl-branch":"tip-573","tcl-version":"8.7","type":"Project","title":"# TIP 573: Surrogates are invalid","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"572":{"url":"./tip/572.md","state":"Draft","tcl-version":"9.1","type":"Project","title":"# TIP 572: Implement a mechanism to specify the procedure/lambda/method argument call types (Evaluation strategy)","author":["Rami Khaldi <[email protected]>"],"is-jest":false},
	"571":{"url":"./tip/571.md","state":"Withdrawn","tcl-version":"8.6","type":"Project","title":"# TIP 571: Make TclX's profiler work properly with Tcl 8.6","author":["Rami Khaldi <[email protected]>"],"is-jest":false},
	"570":{"url":"./tip/570.md","keywords":"Tk, bindings","created":"18-Mar-2020","post-history":"","state":"Draft","tk-branch":"pspjuth-touch","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 570: Gesture Support for Finger Scrolling and \"Pinch to Zoom\"","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"569":{"url":"./tip/569.md","keywords":"lint","state":"Final","vote-summary":"Accepted 8/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"DP, JD, KK, KW, SL, FV, DF, JN","votes-against":"none","created":"6-Mar-2020","title":"# TIP 569: Eliminate Comments That Serve Lint","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"568":{"url":"./tip/568.md","keywords":"bytearray","state":"Final","vote-summary":"Accepted 6/0/1","type":"Project","author":["Don Porter <[email protected]>"],"votes-against":"none","votes-for":"DP, KK, JN, SL, AK, KW","created":"4-Mar-2020","title":"# TIP 568: Revise ByteArray Routines To Support Proper Value Extraction","post-history":"","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-568","votes-present":"FV","is-jest":false},
	"567":{"url":"./tip/567.md","keywords":"Tcl, TclOO, slots","state":"Final","vote-summary":"4/0/2","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DF, JN, MC, KW","votes-against":"none","created":"22-Feb-2020","title":"# TIP 567: Add Operation to Support Set-like Slots","post-history":"","tcl-branch":"tip-567","vote":"Done","tcl-version":"8.7","votes-present":"DP,SL","is-jest":false},
	"566":{"url":"./tip/566.md","keywords":"lset","created":"19-Feb-2020","post-history":"","state":"Withdrawn","tcl-branch":"lset-index","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 566: Index usage in lset","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"565":{"url":"./tip/565.md","keywords":"Tk canvas","created":"10-Feb-2020","post-history":"","state":"Final","tcl-branch":"bug-3552805fff","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 565: Gracefully ignore non-existent tags in canvas raise/lower","author":["Francois Vogel <[email protected]>"],"is-jest":false},
	"564":{"url":"./tip/564.md","keywords":"Tk Ttk x11 font size","created":"9-Feb-2020","post-history":"","state":"Final","tcl-branch":"bug-dccd82bdc7","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 564: Specify ttk font sizes in points on X11","author":["Francois Vogel <[email protected]>"],"is-jest":false},
	"563":{"url":"./tip/563.md","keywords":"Tk, bindings","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","tk-branch":"tip-563-scrollbar-scrollwheel","author":["Harald Oehlmann <[email protected]>"],"votes-for":"FV, SL, KK, JD, BG, JN, KW","votes-against":"none","created":"02-Feb-2020","title":"# TIP 563: Scrollwheel on Horizontal Scrollbar Scrolls Without Shift too","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"562":{"url":"./tip/562.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 3/0/4","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"DGP, DKF, JN","created":"31-Jan-2020","title":"# TIP 562: Deprecate channel types 1-4","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"deprecate-channel-type-1-4","votes-present":"FV, KBK, KW, SL","is-jest":false},
	"561":{"url":"./tip/561.md","keywords":"Tk","created":"23-Jan-2020","post-history":"","state":"Draft","tk-branch":"tip-561","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 561: Add console Command to Unix","author":["Eric Taylor <[email protected]>"],"is-jest":false},
	"560":{"url":"./tip/560.md","keywords":"Tk, TclOO, configuration, properties, options","created":"23-Jan-2020","post-history":"","state":"Draft","tk-branch":"tip-560","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 560: Megawidget Configure/Property Support","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"559":{"url":"./tip/559.md","keywords":"Tcl, result","state":"Final","vote-summary":"Accepted 8/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-against":"none","votes-for":"DP, JD, MC, KW, SL, FV, DF, JN","created":"13-Jan-2020","title":"# TIP 559: Eliminate public routine `Tcl_FreeResult`","post-history":"","tcl-version":"9.0","vote":"Done","tcl-branch":"tip-599","votes-present":"none","is-jest":false},
	"558":{"url":"./tip/558.md","keywords":"Tcl, TclOO, properties","created":"22-Dec-2019","post-history":"","state":"Final","tcl-branch":"tip-558","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 558: Basic Configure Support for TclOO","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"557":{"url":"./tip/557.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 2/0/3","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"JN, KW","created":"13-Dec-2019","title":"# TIP 557: C++ support for Tcl","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"cplusplus","votes-present":"DGP, FV, SL","is-jest":false},
	"556":{"url":"./tip/556.md","keywords":"Tk","created":"26-Nov-2019","post-history":"","state":"Deferred","tk-branch":"tip-556","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 556: Add oo like widgets to Tk","author":["René Zaumseil <[email protected]>"],"is-jest":false},
	"555":{"url":"./tip/555.md","created":"19-Nov-2019","obsoleted-by":"584","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 555: Enable listing of layouts in ttk::Themes","author":["Manfred Rosenberger<[email protected]>"],"is-jest":false},
	"554":{"url":"./tip/554.md","created":"14-Nov-2019","post-history":"","state":"Draft","tcl-branch":"tip-554","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 554: Library file system for Tcl and Tk core using an C-based VFS","author":["Sean Woods <[email protected]>","Roy Keene"],"is-jest":false},
	"553":{"url":"./tip/553.md","keywords":"Tk, label, listbox, entry","created":"07-Nov-2019","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 553: Ellipses: the Alternative to Scrolling and Wrapping","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"552":{"url":"./tip/552.md","keywords":"Tk, treeview","state":"Final","vote-summary":"Accepted 5/0/0","tk-branch":"pspjuth-treeview","type":"Project","author":["Peter Spjuth <[email protected]>"],"votes-for":"BG, SL, JN, FV, KW","votes-against":"none","created":"19-Sep-2019","title":"# TIP 552: Extended treeview functionality.","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"551":{"url":"./tip/551.md","keywords":"numbers, readability","state":"Final","vote-summary":"Accepted 6/0/2","vote-against":"none","vote-for":"BG,KW,MC,FV,JN,SL","type":"Project","author":["Eric Taylor <[email protected]>"],"created":"16-Sep-2019","title":"# TIP 551: Permit underscore in numerical literals in source code","vote-present":"DP,KK","sponsor":"Brian Griffin <[email protected]>","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-551","is-jest":false},
	"550":{"url":"./tip/550.md","keywords":"Tcl, memory","created":"11-Jun-2019","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 550: Garbage Collection for TclOO","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"549":{"url":"./tip/549.md","keywords":"Tcl","created":"7-June-2019","post-history":"","state":"Withdrawn","tcl-branch":"tip-549","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 549: Make configure --enable-64bit the default","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"548":{"url":"./tip/548.md","keywords":"Tcl","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"JN, DKF, KW, KBK","vote-results":"4/2/0 accepted","created":"3-June-2019","title":"# TIP 548:Support `wchar_t` conversion functions and deprecate `Tcl_WinUtfToTChar()` and `Tcl_WinTCharToUtf()`","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-548","votes-present":"DGP, SL","discussions-to":"Tcl Core list","is-jest":false},
	"547":{"url":"./tip/547.md","keywords":"Tcl","created":"31-May-2019","post-history":"","state":"Final","tcl-branch":"tip-547","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 547: New encodings: UTF-16, UCS-2","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"546":{"url":"./tip/546.md","keywords":"Tcl, traces","created":"20-May-2019","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 546: Typedefs to Support Source-Compatible Migration","author":["Don Porter <[email protected]>"],"is-jest":false},
	"545":{"url":"./tip/545.md","keywords":"Tk, image","state":"Final","type":"Project","tk-branch":"tip-545-svg-options","author":["Harald Oehlmann <[email protected]>"],"vote-results":"6/0/0 accepted","votes-for":"BG, DKF, FV, KW, JN, MC","votes-against":"none","created":"19-May-2019","title":"# TIP 545: image photo SVG options: remove -unit and add target height/width option","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"544":{"url":"./tip/544.md","keywords":"Tcl","created":"15-May-2019","post-history":"","state":"Final","tcl-branch":"tip-544","vote":"Done","tcl-version":"8.7","type":"Project","title":"# TIP 544: Export TclGetIntForIndex()","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"543":{"url":"./tip/543.md","keywords":"Tcl, traces","state":"Final","vote-summary":"Accepted 9/0/0","type":"Project","author":["Don Porter <[email protected]>"],"votes-against":"none","votes-for":"DP, JD, MC, KW, SL, KK, FV, DF, JN","created":"10-May-2019","title":"# TIP 543: Eliminate `TCL_INTERP_DESTROYED` flag value","post-history":"","tcl-version":"9.0","vote":"Done","tcl-branch":"tip-543-9","votes-present":"none","is-jest":false},
	"542":{"url":"./tip/542.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"FV, JN, KBK, KW, MC, SL","created":"10-May-2019","title":"# TIP 542:Support for switchable Full Unicode support","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"utf-max","votes-present":"none","discussions-to":"Tcl Core list","is-jest":false},
	"541":{"url":"./tip/541.md","keywords":"Tcl","created":"8-May-2019","post-history":"","state":"Final","tcl-branch":"bug-2858503fff","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 541: Add support for 'end' index in ttk::combobox current","author":["Francois Vogel <[email protected]>"],"is-jest":false},
	"540":{"url":"./tip/540.md","keywords":"Tcl, Unix, pipeline","created":"03-May-2019","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 540: Add -signal Channel Configure Option to POSIX Pipes","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"539":{"url":"./tip/539.md","tcl-ticket":"2370575","keywords":"Tcl, dict filter, set intersection","created":"27-Nov-2008","obsoleted-by":"341","post-history":"","state":"Withdrawn","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 539: Multiple dict filter patterns","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"538":{"url":"./tip/538.md","keywords":"Tcl","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","vote-results":"5/0/0 accepted","votes-for":"JN, KBK, KW, MC, SL","created":"9-April-2019","title":"# TIP 538: Externalize libtommath","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"digit-bit-60","votes-present":"none","is-jest":false},
	"537":{"url":"./tip/537.md","keywords":"Tcl","created":"7-April-2019","post-history":"","state":"Final","tcl-branch":"regexp-api-64bit","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 537: Enable 64-bit indexes in regexp matching","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"536":{"url":"./tip/536.md","keywords":"Tk","state":"Final","type":"Project","tk-branch":"mac_services","author":["Kevin Walzer <[email protected]>"],"votes-for":"DKF, BG, JN, SL, AK","votes-against":"none","created":"29-March-2019","title":"# TIP 536: Improvements to Mac-specific IPC in Tk","post-history":"","vote":"Done","tcl-version":"8.6","votes-present":"KBK, FV","is-jest":false},
	"535":{"url":"./tip/535.md","keywords":"Tcl","created":"10-March-2019","post-history":"","state":"Final","tcl-branch":"scale-tick-format","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 535: Remove trailing zeroes in scale ticks","author":["François Vogel <[email protected]>"],"is-jest":false},
	"534":{"url":"./tip/534.md","keywords":"Tcl","created":"02-March-2019","post-history":"","state":"Draft","tcl-branch":"dkf-experimental-fast-number-hash","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 534: Faster Hashing of Small Integers","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"533":{"url":"./tip/533.md","keywords":"Tk, menubutton","":"","[menu man page](https":"//www.tcl.tk/man/tcl/TkCmd/menu.htm).","state":"Final","type":"Project","tk-branch":"bug-70e531918e","author":["Marc Culler"],"three arguments":"two coordinates and an index.  That function uses the","[70e531918e](https":"//core.tcl-lang.org/tk/tktview/70e531918e6d99cbdd8b527386fec15872c64216).","created":"13-Jan-2019","by calling <b>":":tk::PostOverPoint</b> which, like the proposed extension, accepts","a method <b>[nsmenu popupmenupositioningitem":"atLocation:inView]</b> which draws the","title":"# TIP 533: Extension of the menu post command","the [bug-70e531918e](https":"//core.tcl-lang.org/tk/timeline?r=bug-70e531918e)","post-history":"","vote":"Done","tcl-version":"8.6","is-jest":false},
	"532":{"url":"./tip/532.md","manual (`man bind`) says":"","moreover the following issues have been solved":"","":"","keywords":"Tk, bind, event, event loop","this has been observed in applications [scid](http":"//scid.sourceforge.net), and","state":"Final","says (`man bind`)":"","type":"Project","tk-branch":"bug6e8afe516d","author":["Gregor Cramer <[email protected]>"],"(same with applications [scid](http":"//scid.sourceforge.net), and","5. legacy implementation cannot handle homogeneous equal sequences properly, see this script":"","votes-for":"DKF, BG, KBK, JN, FV, SL","votes-against":"none","2. immediately after startup of application [scidb](http":"//scidb.sourceforge.net)","created":"09-Jan-2019","title":"# TIP 532: Re-implementation of event loop processing","how to choose the most specific binding, has to be changed":"","4. see following code":"","can be expressed in a different way":"","this problem occurs often in application [scidb](http":"//scidb.sourceforge.net),","post-history":"","vote":"Done","tcl-version":"8.6","[scid vs pc](http":"//scidvspc.sourceforge.net).","the following problems, caused by event ring overflow, have been solved":"","votes-present":"DGP, AK","is-jest":false},
	"531":{"url":"./tip/531.md","":"","keywords":"Tcl, stubs","state":"Rejected","vote-summary":"Rejected 0/4/1","type":"Project","author":["Shannon Noe <[email protected]>"],"votes-against":"JN, KBK, KW, MC","votes-for":"none","created":"14-Dec-2018","title":"# TIP 531: Static Tcl Interpreter Creation Function","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-531","/usr/local/include/tcl8.6/tcldecls.h":"#define Tcl_CreateInterp \\","votes-present":"BG","is-jest":false},
	"530":{"url":"./tip/530.md","created":"13-Dec-2018","post-history":"","state":"Draft","tcl-branch":"tip-530","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 530: Control over performance impact of TIP 280","author":["Leon Manukyan <[email protected]>"],"is-jest":false},
	"529":{"url":"./tip/529.md","keywords":"Tk, image","state":"Final","vote-summary":"Accepted 7/0/1","tk-branch":"tip529-image-metadata-no-match-method","type":"Project","author":["Harald Oehlmann <[email protected]>"],"votes-for":"AK, FV, JD, JN, KW, MC, SL","votes-against":"None","created":"07-Dec-2018","title":"# TIP 529: Add metadata dictionary property to tk photo image","vote":"Done","tcl-version":"8.7","votes-present":"KK","is-jest":false},
	"528":{"url":"./tip/528.md","state":"Final","type":"Project","tk-branch":"offsetof","author":["Jan Nijtmans <[email protected]>"],"votes-for":"DKF, BG, KBK, JN, DGP, FV, SL, AK","votes-against":"none","created":"05-Dec-2018","title":"# TIP 528: Deprecate Tk_Offset()","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"527":{"url":"./tip/527.md","state":"Final","type":"Project","author":["Sergey G. Brester <[email protected]>"],"votes-against":"None","vote-results":"5/0 accepted","votes-for":"KBK, DKF, AK, SL, FV","created":"26-Nov-2018","title":"# TIP 527: New measurement facilities in TCL: New command timerate","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"sebres-8-6-timerate","discussions-to":"news:comp.lang.tcl","is-jest":false},
	"526":{"url":"./tip/526.md","created":"08-Nov-2018","post-history":"","state":"Draft","tcl-branch":"tip-526","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 526: Make [expr] Only Accept One Argument","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"525":{"url":"./tip/525.md","keywords":"Tcl, testing, continuous integration","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"vote-results":"8/0/0 accepted","votes-for":"KBK, SL, AF, DGP, FV, DKF, AK, JN","votes-against":"none","created":"24-Oct-2018","title":"# TIP 525: Make Tcltest Report Overall Success in a Machine-Readable Way","post-history":"","vote":"Done","tcl-version":"8.5","votes-present":"none","is-jest":false},
	"524":{"url":"./tip/524.md","keywords":"Tcl, object orientation, customization","state":"Final","vote-summary":"Accepted 2/0/4","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-against":"none","votes-for":"DKF, JN","created":"23-Oct-2018","title":"# TIP 524: Custom Definition Dialects for TclOO","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-524","votes-present":"BG, KBK, FV, SL","is-jest":false},
	"523":{"url":"./tip/523.md","keywords":"queue, stack, pop","state":"Final","vote-summary":"Accepted 7/0/0","type":"Project","author":["Peter Spjuth <[email protected]>"],"votes-against":"none","votes-for":"DKF, BG, KBK, JN, DGP, FV, SL","created":"22-Oct-2018","title":"# TIP 523: New lpop command","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-523","votes-present":"none","is-jest":false},
	"522":{"url":"./tip/522.md","keywords":"tcltest, error codes","state":"Final","type":"Project","author":["Peter Spjuth <[email protected]>"],"vote-results":"8/0/0 accepted","votes-for":"KBK, SL, AF, DGP, FV, DKF, AK, JN","votes-against":"none","created":"22-Oct-2018","title":"# TIP 522: Test error codes with Tcltest","post-history":"","tcl-branch":"tip-522","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"521":{"url":"./tip/521.md","keywords":"Tcl, floating point, NaN, not a number","state":"Final","type":"Project","author":["Kevin B. Kenny <[email protected]>"],"votes-for":"DKF, BG, KBK, JN, DGP, FV, AK","votes-against":"none","created":"21 October 2018","title":"# TIP 521: Floating Point Classification Functions","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-521","votes-present":"SL","is-jest":false},
	"520":{"url":"./tip/520.md","keywords":"Tcl, floating point, NaN, not a number","created":"18 October 2018","post-history":"","state":"Draft","tcl-branch":"tip-520","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 520: Make NaN Quiet","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"519":{"url":"./tip/519.md","":"","keywords":"TclOO","state":"Final","vote-summary":"Accepted 4/0/2","this tip proposes to extend the `method` subcommand of the `oo":":define` command","type":"Project","author":["Pietro Cerutti <[email protected]>"],"votes-against":"none","votes-for":"DKF, KBK, JN, SL","follows":"","oo":":define RPCClient {","created":"18-Oct-2018","title":"# TIP 519: Inline export/unexport option to TclOO method definition","the class definition in the previous example would then be as follows":"","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-519","votes-present":"BG, FV","is-jest":false},
	"518":{"url":"./tip/518.md","keywords":"Tk","state":"Final","vote-summary":"Accepted 6/0/0","type":"Project","tk-branch":"tip518-event-last-child-unmanaged","author":["Harald Oehlmann <[email protected]>"],"votes-against":"none","votes-for":"DKF, BG, KBK, JN, FV, SL","created":"22-Sep-2018","title":"# TIP 518: Virtual Event when Last Child is not Managed any more","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"517":{"url":"./tip/517.md","keywords":"tk menu","created":"13-Sept-2018","post-history":"","state":"Final","tk-branch":"tip-517","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 517: Add -activerelief Configuration Option to the menu widget","author":["François Vogel <[email protected]>"],"is-jest":false},
	"516":{"url":"./tip/516.md","keywords":"Tcl, TclOO","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"vote-results":"4/0/5 accepted","votes-for":"DKF, JN, JD, AK","votes-against":"none","created":"7-Sept-2018","title":"# TIP 516: More OO Slot Operations","post-history":"","tcl-branch":"tip-516","vote":"Done","tcl-version":"8.7","votes-present":"BG, KBK, DGP, FV, SL","is-jest":false},
	"515":{"url":"./tip/515.md","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"vote-results":"8/0/1 accepted","votes-for":"DKF, KBK, JN, JD, DGP, FV, SL, AK","votes-against":"none","created":"7-Sept-2018","title":"# TIP 515: Level Value Reform","post-history":"","tcl-branch":"tip-515","vote":"Done","tcl-version":"8.7","votes-present":"BG","is-jest":false},
	"514":{"url":"./tip/514.md","keywords":"Tcl","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","vote-results":"3/0/2 accepted","votes-for":"DKF, JN, KBK","created":"20-Aug-2018","title":"# TIP 514: Platform differences in handling int/wide","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-514","votes-present":"JD, SL","is-jest":false},
	"513":{"url":"./tip/513.md","keywords":"Tcl,data structure","created":"02-Aug-2017","post-history":"","state":"Draft","implementation-url":"https://core.tcl-lang.org/tips/doc/main/attach/513/agendas.tcl","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 513: Better support for 'agendas' as arrays, dictionaries or lists","author":["Florian Murr <[email protected]>"],"is-jest":false},
	"512":{"url":"./tip/512.md","keywords":"Tcl","created":"25-June-2018","post-history":"","state":"Final","tcl-branch":"tip-512","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 512: No stub for Tcl_SetExitProc()","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"511":{"url":"./tip/511.md","keywords":"Tcl,threads","state":"Final","type":"Project","author":["Christian Werner <[email protected]>"],"votes-against":"none","vote-results":"4/0/5 accepted","votes-for":"DKF, BG, KBK, JN, JD, SL","created":"14-June-2018","title":"# TIP 511: Implement Tcl_AsyncMarkFromSignal()","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-511","votes-present":"DGP, FV, AK","is-jest":false},
	"510":{"url":"./tip/510.md","":"might be to just co-distribute, just as TDBC is with Tcl","keywords":"Tk","state":"Deferred","vote-summary":"Rejected 1/3/1","type":"Project","tk-branch":"tip-510","author":["René Zaumseil <[email protected]>"],"votes-against":"KBK, JN, FV","votes-for":"DKF","created":"5-Jun-2018","vote-comments":"code not yet ready, needs porting to macOS; alternate","title":"# TIP 510: Add Rbc and Tkpath widgets to Tk","post-history":"","vote":"Done","tcl-version":"9.0","votes-present":"BG","is-jest":false},
	"509":{"url":"./tip/509.md","keywords":"Tcl,threads","state":"Final","type":"Project","author":["Frédéric Bonnet <[email protected]>"],"vote-results":"8/0/1 accepted","votes-for":"DKF, KBK, JN, JD, DGP, FV, SL, AK","votes-against":"none","created":"24-May-2018","title":"# TIP 509: Implement reentrant mutexes on all platforms","post-history":"","tcl-branch":"tip-509","vote":"Done","tcl-version":"8.7","votes-present":"BG","is-jest":false},
	"508":{"url":"./tip/508.md","keywords":"Tcl,array","state":"Final","type":"Project","author":["Frédéric Bonnet <[email protected]>"],"vote-results":"9/0/0 accepted","votes-for":"DKF, BG, KBK, JN, JD, DGP, FV, SL, AK","votes-against":"none","created":"13-May-2018","title":"# TIP 508: New subcommand [array default]","post-history":"","tcl-branch":"tip-508","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"507":{"url":"./tip/507.md","keywords":"Tk","state":"Final","type":"Project","tk-branch":"tip-507","author":["René Zaumseil <[email protected]>"],"votes-for":"DKF, JN, FV, SL, AK","votes-against":"none","created":"9-May-2018","title":"# TIP 507: Include simple SVG support with nanosvg","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"506":{"url":"./tip/506.md","state":"Final","vote-summary":"Accepted 5/0/1","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"DKF, KBK, JN, DGP, SL","votes-against":"none","created":"30-Mar-2018","title":"# TIP 506: Purge RefCount Macros","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-506","votes-present":"BG, FV","is-jest":false},
	"505":{"url":"./tip/505.md","state":"Final","type":"Project","author":["Don Porter <[email protected]>"],"vote-results":"8/0/1 accepted","votes-for":"DKF, KBK, JN, JD, DGP, FV, SL, AK","votes-against":"none","created":"26-Mar-2018","title":"# TIP 505: Make [lreplace] Accept All Out-of-Range Index Values","post-history":"","tcl-branch":"tip-505","vote":"Done","tcl-version":"8.6.9","votes-present":"BG","is-jest":false},
	"504":{"url":"./tip/504.md","keywords":"Tcl,string,insert","state":"Final","type":"Project","author":["Don Porter <[email protected]>"],"votes-against":"none","votes-for":"DKF, JN, DGP, FV, SL, AK","created":"21-Mar-2018","obsoletes":"475","title":"# TIP 504: New subcommand [string insert]","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"dgp-string-insert","votes-present":"none","is-jest":false},
	"503":{"url":"./tip/503.md","created":"05-Feb-2018","post-history":"","state":"Final","tcl-branch":"tip-503","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 503: End Tcl 8.3 Source Compatibility Support","author":["Don Porter <[email protected]>"],"is-jest":false},
	"502":{"url":"./tip/502.md","state":"Final","type":"Project","author":["Don Porter <[email protected]>"],"vote-results":"5/0/0 accepted","votes-for":"DKF, JN, JD, KBK, SL","votes-against":"none","created":"26-Feb-2018","title":"# TIP 502: Index Value Reform","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-502","votes-present":"none","is-jest":false},
	"501":{"url":"./tip/501.md","keywords":"Tcl,string","state":"Final","vote-summary":"Accepted 5/0/1","type":"Project","author":["Sean Woods <[email protected]>"],"votes-against":"none","votes-for":"DKF, KBK, JN, FV, SL","created":"12-Feb-2018","title":"# TIP 501: string is dict","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-501","votes-present":"BG","is-jest":false},
	"500":{"url":"./tip/500.md","keywords":"Tcl, object orientation, visibility","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, AF, JD, SL, AK, KBK","votes-against":"none","created":"10-Feb-2018","title":"# TIP 500: Private Methods and Variables in TclOO","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-500","is-jest":false},
	"499":{"url":"./tip/499.md","keywords":"msgcat, oo","created":"07-Dec-2017","post-history":"","state":"Final","tcl-branch":"tip499-msgcat-custom-preferences","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 499: Custom locale search list for msgcat","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"498":{"url":"./tip/498.md","keywords":"tcl","created":"18-Jan-2016","post-history":"","state":"Draft","tcl-branch":"bug-e593adf103-core-8","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 498: Simplify Tcl_DeleteNamespace","author":["Nathan Coulter <org.tcl-lang.[email protected]>"],"is-jest":false},
	"497":{"url":"./tip/497.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 6/0/1","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"DKF, FV, JN, KBK, KW, SL","created":"23-Jan-2018","title":"# TIP 497: Full support for Unicode planes 1-16.","post-history":"","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-497","votes-present":"DGP","discussions-to":"Tcl Core list","is-jest":false},
	"496":{"url":"./tip/496.md","keywords":"Tk","created":"17-Jan-2018","post-history":"","state":"Final","tk-branch":"tip-496","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 496: Display hints in ::entry ::spinbox ::ttk::entry ::ttk::spinbox and ::ttk::combobox","author":["René Zaumseil <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"495":{"url":"./tip/495.md","keywords":"Tcl,build system,extension building","created":"14-Jan-2018","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 495: Tcl Based Build System for TEA projects","author":["Sean Woods <[email protected]>"],"is-jest":false},
	"494":{"url":"./tip/494.md","keywords":"tcl","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","vote-results":"3/0/2 accepted","votes-for":"DKF, JN, KBK","created":"29-Dec-2017","title":"# TIP 494: More use of size_t/ptrdiff_t in Tcl 9","post-history":"","vote":"Done","tcl-version":"9.0","tcl-branch":"memory-API","votes-present":"JD, SL","is-jest":false},
	"493":{"url":"./tip/493.md","created":"29-Dec-2017","post-history":"","state":"Final","tcl-branch":"tip-493","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 493: Cease Distribution of http 1.0","author":["Don Porter <[email protected]>"],"is-jest":false},
	"492":{"url":"./tip/492.md","keywords":"tk busy","created":"19-Dec-2017","post-history":"","state":"Final","tk-branch":"tip-492","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 492: Introspection for 'tk busy'","author":["François Vogel <[email protected]>"],"is-jest":false},
	"491":{"url":"./tip/491.md","keywords":"threads","created":"11-Dec-2017","post-history":"","state":"Final","tcl-branch":"tip-491","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 491: Threading Support: phasing out non-threaded builds","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"490":{"url":"./tip/490.md","keywords":"msgcat, oo","created":"07-Dec-2017","post-history":"","state":"Final","tcl-branch":"tip490-msgcat-oo-2","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 490: msgcat for TclOO","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"489":{"url":"./tip/489.md","keywords":"canvas, image","created":"02-Dec-2017","post-history":"","state":"Final","tk-branch":"canvas_image","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 489: Add image widget command to the Tk canvas","author":["Scott Pitcher <[email protected]>"],"is-jest":false},
	"488":{"url":"./tip/488.md","keywords":"Tcl, string representation, floating-point","created":"24-Nov-2017","post-history":"","state":"Final","tcl-branch":"tip-488","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 488: Remove tcl_precision","author":["Arjen Markus <[email protected]>"],"is-jest":false},
	"487":{"url":"./tip/487.md","created":"20-Nov-2017","post-history":"","state":"Final","tcl-branch":"tip-487","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 487: Stop support for Pre-XP Windows","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"486":{"url":"./tip/486.md","created":"13-Nov-2017","post-history":"","state":"Draft","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 486: Thread 3.0 is for Tcl 9","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"485":{"url":"./tip/485.md","created":"08-Nov-2017","post-history":"","state":"Final","tcl-branch":"tip-485","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 485: Remove Deprecated API","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"484":{"url":"./tip/484.md","keywords":"Tcl","created":"06-Nov-2017","post-history":"","state":"Final","tcl-branch":"no-wideint","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 484: Merge 'int' and 'wideInt' Obj-type to a single 'int'","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"483":{"url":"./tip/483.md","keywords":"Tk, configuration","created":"03-Nov-2017","post-history":"","state":"Final","tk-branch":"tk-stu-pkg","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 483: Improved TIP #59 implementation for Tk","author":["Stuart Cassoff <[email protected]>"],"is-jest":false},
	"482":{"url":"./tip/482.md","keywords":"Tk, demos, configuration","created":"03-Nov-2017","post-history":"","state":"Final","tk-branch":"tk-stu-pkg","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 482: Record Tk demo directory information","author":["Stuart Cassoff <[email protected]>"],"is-jest":false},
	"481":{"url":"./tip/481.md","keywords":"Tcl","state":"Final","vote-summary":"Accepted 4/0/2","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"JN, KW, KK, MC","created":"27-Oct-2017","title":"# TIP 481: `Tcl_GetStringFromObj()` with `ptrdiff_t` length parameter","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-481","votes-present":"FV, SL","is-jest":false},
	"480":{"url":"./tip/480.md","keywords":"assertion, pragma, type, alias, compilation","created":"25-Oct-2017","post-history":"","state":"Draft","tcl-branch":"tip-480","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 480: Type and Alias Assertions for Tcl","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"479":{"url":"./tip/479.md","keywords":"Tcl,procedure,argument handling","created":"23-Oct-2017","post-history":"","state":"Draft","tcl-branch":"tip479","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 479: Add Named Procedures as a New Command in Tcl (dictargs::proc)","author":["Sean Woods <[email protected]>"],"is-jest":false},
	"478":{"url":"./tip/478.md","keywords":"Tcl","state":"Final","type":"Project","author":["Gerald Lester <[email protected]>","Donal K. Fellows <[email protected]>"],"votes-for":"DKF, AK, JD, SL, JN","votes-against":"none","created":"18-Oct-2017","title":"# TIP 478: Add Expected Class Level Behaviors to oo::class","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-478","is-jest":false},
	"477":{"url":"./tip/477.md","keywords":"Windows nmake build","created":"30-Sep-2017","post-history":"","state":"Final","tcl-branch":"vc-reform","tcl-version":"8.6.8","vote":"Done","type":"Project","title":"# TIP 477: Modernize the nmake build system","author":["Ashok P. Nadkarni <[email protected]>"],"is-jest":false},
	"476":{"url":"./tip/476.md","keywords":"scan, printf","created":"27-Sep-2017","post-history":"PM","state":"Final","tcl-branch":"z_modifier","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 476: Scan/Printf format consistency","author":["Jan Nijtmans ([email protected])"],"is-jest":false},
	"475":{"url":"./tip/475.md","keywords":"Tcl,string,insert","created":"22-Sep-2017","post-history":"","state":"Rejected","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 475: Add [string insert] Command and C API","author":["Andy Goth ([email protected])"],"is-jest":false},
	"474":{"url":"./tip/474.md","keywords":"Tk, events","state":"Final","vote-summary":"Accepted 7/0/2","tk-branch":"tip474","type":"Project","author":["Arjen Markus <[email protected]>","Jan Nijtmans <[email protected]>"],"votes-for":"BG, DKF, FV, JN, KW, MC, SL","votes-against":"none","created":"25-Aug-2017","title":"# TIP 474: Treat the mouse wheel events in a uniform way","post-history":"PM","vote":"Done","tcl-version":"8.7","votes-present":"DGP, KBK","is-jest":false},
	"473":{"url":"./tip/473.md","keywords":"Tcl, missing functionality, bugfix","created":"06-Jun-2017","post-history":"","state":"Final","tcl-branch":"oo-copy-ns","vote":"Done","tcl-version":"8.6.7","type":"Project","title":"# TIP 473: Allow a Defined Target Namespace in oo::copy","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"472":{"url":"./tip/472.md","created":"25-May-2017","post-history":"","state":"Final","tcl-branch":"bsg-0d-radix-prefix","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 472: Add Support for 0d Radix Prefix to Integer Literals","author":["Venkat Iyer <[email protected]>","Brian Griffin <[email protected]>"],"is-jest":false},
	"471":{"url":"./tip/471.md","":"rethink it (talk to TCT to help resolve)","state":"Draft","vote-summary":"Rejected 2/2/3","type":"Project","author":["Mathieu Lafon <[email protected]>"],"votes-for":"DKF, JN","votes-against":"KBK, DGP","created":"05-May-2017","vote-comments":"feature provides insufficient information to be useful,","title":"# TIP 471: Add [info linkedname] Introspection Command","post-history":"","tcl-version":"9.1","vote":"Done","tcl-branch":"info-linkedname","votes-present":"BG, FV, SL","is-jest":false},
	"470":{"url":"./tip/470.md","keywords":"TclOO, metaprogramming","created":"23-Apr-2017","post-history":"","state":"Final","tcl-branch":"tip-470","vote":"Done","tcl-version":"8.7","type":"Project","title":"# TIP 470: Reliable Access to OO Definition Context Object","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"469":{"url":"./tip/469.md","keywords":"Tcl,event handling","created":"16-Apr-2017","post-history":"","state":"Draft","tcl-branch":"tip-469","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 469: A Callback for Channel-Exception Conditions","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"468":{"url":"./tip/468.md","keywords":"Tcl, socket, SOMAXCONN","state":"Final","vote-summary":"Accepted 3/0/0","type":"Project","author":["Shannon Noe <[email protected]>"],"votes-against":"none","votes-for":"JN, KBK, KW, SL","created":"03-Apr-2017","title":"# TIP 468: Support Passing TCP listen Backlog Size Option to TCP Socket Creation","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-468","votes-present":"none","is-jest":false},
	"467":{"url":"./tip/467.md","keywords":"migration","created":"14-Mar-2017","post-history":"","state":"Final","vote":"Done","type":"Process","title":"# TIP 467: Move TIP Collection to Fossil","author":["Mark Janssen <[email protected]>"],"is-jest":false},
	"466":{"url":"./tip/466.md","keywords":"Tk,text widget","created":"10-Mar-2017","post-history":"","state":"Draft","tk-branch":"revised_text","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 466: Revised Implementation of the Text Widget","author":["François Vogel <[email protected]>","Gregor Cramer <[email protected]>"],"is-jest":false},
	"465":{"url":"./tip/465.md","state":"Final","type":"Project","author":["Andreas Leitgeb <[email protected]>"],"vote-results":"4/0/0 accepted","votes-for":"FV, KW, JN, SL","votes-against":"none","created":"03-Mar-2017","title":"# TIP 465: Change Rule 8 of the Dodekalogue to Cut Some Corner Cases","post-history":"","vote":"Done","tcl-version":"9.0","tcl-branch":"tip-465","votes-present":"none","is-jest":false},
	"464":{"url":"./tip/464.md","keywords":"Tk,keyboard,keycode","created":"28-Jan-2017","post-history":"","state":"Final","tcl-branch":"tip-464","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 464: Support for Multimedia Keys on Windows","author":["Ralf Fassel <[email protected]>","Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"463":{"url":"./tip/463.md","keywords":"Tcl, regular expression","created":"11-Feb-2017","post-history":"","state":"Final","tcl-branch":"tip-463","vote":"Done","tcl-version":"8.7","type":"Project","title":"# TIP 463: Command-Driven Substitutions for regsub","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"462":{"url":"./tip/462.md","created":"23-Jan-2017","post-history":"","state":"Final","tcl-branch":"tip-462","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 462: Add New [::tcl::process] Ensemble for Subprocess Management","author":["Frédéric Bonnet <[email protected]>"],"is-jest":false},
	"461":{"url":"./tip/461.md","keywords":"Tcl,expression","state":"Final","type":"Project","author":["Kevin B Kenny <[email protected]>","Kevin B Kenny <[email protected]>","Kevin Kenny <[email protected]>"],"votes-for":"DKF, BG, KBK, JN, DGP, FV, SL, AK","votes-against":"none","created":"24-Jan-2017","title":"# TIP 461: Separate Numeric and String Comparison Operators","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-461","votes-present":"none","is-jest":false},
	"460":{"url":"./tip/460.md","keywords":"Tcl,variable,link,upvar","created":"08-Dec-2016","post-history":"","state":"Draft","tcl-branch":"dah-proc-arg-upvar","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 460: An Alternative to Upvar","author":["Don Hathway <[email protected]>"],"is-jest":false},
	"459":{"url":"./tip/459.md","keywords":"Tcl,package","created":"08-Dec-2016","post-history":"","state":"Final","tcl-branch":"package_files","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 459: Tcl Package Introspection Improvements","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"458":{"url":"./tip/458.md","keywords":"event loop,scalability","created":"24-Nov-2016","post-history":"","state":"Final","tcl-branch":"tip-458","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 458: Add Support for epoll() and kqueue() in the Notifier","author":["Lucio Andrés Illanes Albornoz <[email protected]>","Lucio Andrés Illanes Albornoz <[email protected]>"],"is-jest":false},
	"457":{"url":"./tip/457.md","keywords":"Tcl,procedure,argument handling","created":"21-Nov-2016","post-history":"","state":"Draft","tcl-branch":"tip-457","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 457: Add Support for Named Arguments","author":["Mathieu Lafon <[email protected]>","Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"456":{"url":"./tip/456.md","keywords":"Tcl,socket,SO_REUSEPORT,SO_REUSEADDR","created":"18-Nov-2016","post-history":"","state":"Final","tcl-branch":"tip-456","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 456: Extend the C API to Support Passing Options to TCP Server Creation","author":["LemonBoy <[email protected]>","lime boy <[email protected]>"],"is-jest":false},
	"455":{"url":"./tip/455.md","keywords":"Tcl, event loop","state":"Final","vote-summary":"Accepted 4/0/2","type":"Project","author":["Christian Werner <[email protected]>"],"votes-for":"BG, JN, KW, SL","votes-against":"none","created":"07-Oct-2016","title":"# TIP 455: Extensions to [vwait]: Variable Sets and Scripted Access to Tcl_DoOneEvent","tcl-version":"8.7","vote":"Done","tcl-branch":"tip-455","votes-present":"KBK, MC","is-jest":false},
	"454":{"url":"./tip/454.md","keywords":"Tk","created":"21-Sep-2016","post-history":"","state":"Withdrawn","tcl-version":"8.6.6","vote":"Done","type":"Project","title":"# TIP 454: Automatically Resize Frames After Last Child Removed","author":["Harald Oehlmann <[email protected]>","Harald Oehlmann <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"453":{"url":"./tip/453.md","keywords":"Build tooling","created":"13-Sep-2016","post-history":"","state":"Draft","implementation-url":"https://core.tcl-lang.org/tclconfig/timeline?r=practcl","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 453: Tcl Based Automation for tcl/pkgs","author":["Sean Woods <[email protected]>"],"is-jest":false},
	"452":{"url":"./tip/452.md","state":"Draft","type":"Project","author":["Gerald Lester <[email protected]>","Gerald W. Lester <[email protected]>","Gerald W. Lester <[email protected]>"],"vote-results":"2/4/3 rejection in favour of further work","votes-for":"KBK, JD","votes-against":"DKF, JN, DGP, AK","created":"10-Aug-2016","title":"# TIP 452: Add \"stubs\" Package to or Along Side of TclTest","post-history":"","tcl-branch":"tip-452","vote":"Pending","tcl-version":"9.1","votes-present":"BG, FV, SL","is-jest":false},
	"451":{"url":"./tip/451.md","keywords":"Tcl,event loop","created":"10-Aug-2016","obsoleted-by":"455","post-history":"","state":"Draft","tcl-branch":"updateextended","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 451: Modify [update] to Give Full Script Access to Tcl_DoOneEvent","author":["Colin McCormack <[email protected]>"],"is-jest":false},
	"450":{"url":"./tip/450.md","keywords":"Tcl, binary data","created":"18-Jul-2016","post-history":"","state":"Draft","tcl-branch":"tip-450","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 450: Add [binary] subcommand \"set\" for in-place modification","author":["Arjen Markus <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"449":{"url":"./tip/449.md","keywords":"Tk","created":"07-Jun-2016","post-history":"","state":"Final","tk-branch":"tip-449","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 449: [text] undo/redo to Return Range of Characters","author":["François Vogel <[email protected]>"],"is-jest":false},
	"448":{"url":"./tip/448.md","keywords":"Tcl, C API","created":"24-May-2016","post-history":"","state":"Draft","implementation-url":"http://fossil.etoyoc.com/sandbox/tcllib/artifact/b2b272a285811272","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 448: Update Tcl_SetNotifier to Reinitialize Event Loop","author":["Jeff Rogers <[email protected]>"],"is-jest":false},
	"447":{"url":"./tip/447.md","keywords":"Tcl,tcltest","created":"20-Apr-2016","post-history":"","state":"Final","tcl-branch":"gahr-tip-447","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 447: Execution Time Verbosity Levels in tcltest::configure","author":["Pietro Cerutti <[email protected]>"],"is-jest":false},
	"446":{"url":"./tip/446.md","keywords":"Tk","created":"05-Apr-2016","post-history":"","state":"Final","tk-branch":"tip-446","tcl-version":"8.6.6","vote":"Done","type":"Project","title":"# TIP 446: Introspect Undo/Redo Stack Depths","author":["François Vogel <[email protected]>"],"is-jest":false},
	"445":{"url":"./tip/445.md","state":"Final","vote-summary":"Accepted 4/0/3","type":"Project","author":["Don Porter <[email protected]>"],"votes-for":"DKF, KBK, JN, DGP","votes-against":"none","created":"18-Mar-2016","title":"# TIP 445: Tcl_ObjType Utility Routines","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-445","votes-present":"BG, FV, SL","is-jest":false},
	"444":{"url":"./tip/444.md","created":"23-Feb-2016","post-history":"","state":"Final","tcl-branch":"tip-444","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 444: Add \"weekdays\" unit in clock add","author":["Pietro Cerutti <[email protected]>"],"is-jest":false},
	"443":{"url":"./tip/443.md","keywords":"Tk","created":"09-Feb-2016","post-history":"","state":"Final","tk-branch":"tip-443","tcl-version":"8.6.6","vote":"Done","type":"Project","title":"# TIP 443: More Tag Configuration Options for the Text Widget","author":["François Vogel <[email protected]>"],"is-jest":false},
	"442":{"url":"./tip/442.md","keywords":"Tk","created":"17-Feb-2016","post-history":"","state":"Final","tk-branch":"tip-442","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 442: Display text in progressbars","author":["René Zaumseil <[email protected]>","Kevin B Kenny <[email protected]>","Andreas Leitgeb <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"441":{"url":"./tip/441.md","keywords":"Tk,listbox","created":"18-Jan-2016","post-history":"","state":"Final","tk-branch":"tip-441","tcl-version":"8.6.5","vote":"Done","type":"Project","title":"# TIP 441: Add -justify Configuration Option to the listbox Widget","author":["François Vogel <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"440":{"url":"./tip/440.md","keywords":"language implementation,platform","created":"14-Jan-2016","post-history":"","state":"Final","tcl-branch":"tclPlatformEngine","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 440: Add engine to tcl_platform Array","author":["Joe Mistachkin <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"439":{"url":"./tip/439.md","created":"08-Dec-2015","obsoleted-by":"628","post-history":"","state":"Draft","tcl-branch":"semver","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 439: Semantic Versioning","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"438":{"url":"./tip/438.md","keywords":"Tk,text","created":"01-Nov-2015","post-history":"","state":"Final","tk-branch":"tip-438","tcl-version":"8.6.5","vote":"Done","type":"Project","title":"# TIP 438: Ensure Line Metrics are Up-to-Date","author":["François Vogel <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"437":{"url":"./tip/437.md","keywords":"Tk","created":"14-Jul-2015","post-history":"","state":"Final","tk-branch":"tip-437","vote":"Done","tcl-version":"8.5.18","type":"Project","title":"# TIP 437: Tk panedwindow options for proxy window","author":["Eric Boudaillier <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"436":{"url":"./tip/436.md","created":"30-Jun-2015","post-history":"","state":"Final","implementation-url":"https://core.tcl-lang.org/tcloo/info/5fa1374aa026d4c7","vote":"Done","tcl-version":"8.6.5","type":"Project","title":"# TIP 436: Improve TclOO isa Introspection","author":["Donal Fellows <[email protected]>"],"is-jest":false},
	"435":{"url":"./tip/435.md","created":"16-May-2015","post-history":"","state":"Rejected","vote":"Done","tcl-version":"8.6.5","type":"Project","title":"# TIP 435: Safe Mutex Disposal API","author":["Donal Fellows <[email protected]>","Joe Mistachkin <[email protected]>"],"is-jest":false},
	"434":{"url":"./tip/434.md","created":"26-Feb-2015","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.6","type":"Project","title":"# TIP 434: Specify Event Sources for 'vwait'","author":["Jos Decoster <[email protected]>"],"is-jest":false},
	"433":{"url":"./tip/433.md","created":"25-Feb-2015","post-history":"","state":"Final","tk-branch":"bindScriptCount","tcl-version":"8.6.4","vote":"Done","type":"Project","title":"# TIP 433: Add %M binding substitution","author":["Joe Mistachkin <[email protected]>","Brian Griffin <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"432":{"url":"./tip/432.md","created":"20-Sep-2014","post-history":"","state":"Final","tk-branch":"apn-win-filedialogs","tcl-version":"8.6.3","vote":"Done","type":"Project","title":"# TIP 432: Support for New Windows File Dialogs in Vista and Later","author":["Ashok P. Nadkarni <[email protected]>"],"is-jest":false},
	"431":{"url":"./tip/431.md","keywords":"Tcl, directory, file","state":"Final","type":"Project","author":["Kevin Pasko <[email protected]>"],"votes-for":"DKF, FV, KBK, JN, SL","votes-against":"none","created":"10-Sep-2014","title":"# TIP 431: Add 'tempdir' Subcommand to 'file'","post-history":"","tcl-version":"8.7","vote":"Done","tcl-branch":"tip-431","votes-present":"none","is-jest":false},
	"430":{"url":"./tip/430.md","keywords":"virtual filesystem,zip,tclkit,boot,bootstrap","state":"Final","type":"Project","author":["Sean Woods <[email protected]>","Donal Fellows <[email protected]>","Poor Yorick <[email protected]>","Harald Oehlmann <[email protected]>"],"votes-for":"DKF, KBK, SL, AK, JD, JN (partially)","votes-against":"JN (partially)","created":"03-Sep-2014","present":"JN (partially)","title":"# TIP 430: Add basic ZIP archive support to Tcl","post-history":"","tcl-branch":"core_zip_vfs","vote":"Done","tcl-version":"8.7","is-jest":false},
	"429":{"url":"./tip/429.md","keywords":"Tcl,cat,scriptlet result","created":"27-Jul-2014","post-history":"","state":"Final","tcl-branch":"tip-429","tcl-version":"8.6.2","vote":"Done","type":"Project","title":"# TIP 429: A 'string' Subcommand for Concatenation","author":["Andreas Leitgeb <[email protected]>","Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"428":{"url":"./tip/428.md","keywords":"socket,non-blocking,error reporting,option dictionary","created":"16-Mar-2014","post-history":"","state":"Draft","tcl-branch":"tip-428","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 428: Produce Error Dictionary from 'fconfigure -error'","author":["Harald Oehlmann <[email protected]>","Harald Oehlmann <[email protected]>"],"is-jest":false},
	"427":{"url":"./tip/427.md","keywords":"async socket connect,introspection,IPV6","created":"16-Mar-2014","post-history":"","state":"Final","tcl-branch":"tip-427","tcl-version":"8.6.4","vote":"Done","type":"Project","title":"# TIP 427: Introspection of Asynchronous Socket Connection","author":["Reinhard Max <[email protected]>","Harald Oehlmann <[email protected]>","Reinhard Max <[email protected]>"],"is-jest":false},
	"426":{"url":"./tip/426.md","keywords":"introspection, commands, Tcl, Tk","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"vote-results":"4/2/3 accepted","votes-for":"DKF, BG, JN, JD","votes-against":"DGP, AK","created":"31-Jul-2013","title":"# TIP 426: Determining the \"Type\" of Commands","post-history":"","tcl-branch":"dkf-command-type","tcl-version":"8.7","vote":"Done","votes-present":"KBK, FV, SL","is-jest":false},
	"425":{"url":"./tip/425.md","keywords":"Tcl,platform integration,i18n","created":"17-Jul-2013","post-history":"","state":"Final","tcl-branch":"win-console-panic","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 425: Correct use of UTF-8 in Panic Callback (Windows only)","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"424":{"url":"./tip/424.md","keywords":"Tcl,subprocess,execution","created":"07-Jul-2013","post-history":"","state":"Draft","tcl-branch":"tip-improve-exec","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 424: Improving [exec]","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"423":{"url":"./tip/423.md","keywords":"Tcl, time, millisecond resolution","created":"07-Jun-2013","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 423: Formatting Timestamps with Milliseconds","author":["Thomas Perschak <[email protected]>"],"is-jest":false},
	"422":{"url":"./tip/422.md","keywords":"Tcl, API removal, varargs","created":"02-Jan-2013","post-history":"","state":"Final","tcl-branch":"tip-422","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 422: Don't Use stdarg.h/va_list in Public API","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"421":{"url":"./tip/421.md","state":"Final","type":"Project","author":["Karl Lehenbauer <[email protected]>","Brad Lanam <[email protected]>","Donal K. Fellows <[email protected]>"],"updated":"24-Oct-2017","created":"28-Nov-2012","present":"none","title":"# TIP 421: A Command for Iterating Over Arrays","post-history":"","tcl-branch":"tip-421","tcl-version":"8.7","vote":"Done","for":"DKF, AF, JN, SL, KBK, DGP, AK","against":"none","is-jest":false},
	"420":{"url":"./tip/420.md","created":"15-Nov-2012","post-history":"","state":"Draft","implementation-url":"http://www.etoyoc.com/tclmatrix3d","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 420: 'vexpr', a Vector Expression Command","author":["Sean Woods <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"419":{"url":"./tip/419.md","created":"28-Aug-2012","post-history":"","state":"Draft","implementation-url":"http://wiki.tcl.tk/tkevent","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 419: A New Command for Binding to Tk Events","author":["Jeff Rogers <[email protected]>"],"is-jest":false},
	"418":{"url":"./tip/418.md","keywords":"Tcl,binary data","created":"27-Aug-2012","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 418: Add [binary] Subcommands for In-Place Modification","author":["Jeff Rogers <[email protected]>"],"is-jest":false},
	"417":{"url":"./tip/417.md","keywords":"Tcl, future expansion, extensibility","created":"16-Nov-2012","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 417: Use Explicit Option Names for \"file tempfile\"","author":["Christophe Curis <[email protected]>"],"is-jest":false},
	"416":{"url":"./tip/416.md","created":"31-Oct-2012","post-history":"","state":"Final","tcl-branch":"frq-3579001","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 416: New Options for 'load': -global and -lazy","author":["Christian Delbaere <[email protected]>","Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"415":{"url":"./tip/415.md","keywords":"Tk","state":"Final","vote-summary":"Accepted 5/0/1","type":"Project","tk-branch":"tip-415","author":["Simon Geard <[email protected]>"],"votes-against":"none","votes-for":"DKF, KBK, JN, FV, SL","created":"16-Oct-2012","title":"# TIP 415: Enable Easy Creation of Circular Arc Segments","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"BG","is-jest":false},
	"414":{"url":"./tip/414.md","keywords":"Tcl, library initialisation","state":"Final","type":"Project","author":["Brian Griffin <[email protected]>","Jan Nijtmans <[email protected]>"],"votes-against":"none","vote-results":"5/1/0 accepted","votes-for":"JN, DKF, KW, KBK, DGP","created":"15-Oct-2012","title":"# TIP 414: Add (back) Tcl_InitSubsystems as Public API","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"initsubsystems","votes-present":"SL","is-jest":false},
	"413":{"url":"./tip/413.md","keywords":"Tcl","created":"08-Oct-2012","post-history":"","state":"Final","tcl-branch":"tip-318-update","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 413: Unicode Support for 'string is space' and 'string trim'","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"412":{"url":"./tip/412.md","obsoletes":"399","keywords":"Tcl,localization,msgcat","created":"27-Mar-2012","post-history":"","state":"Final","tcl-branch":"msgcat_dyn_locale","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 412: Dynamic Locale Changing for msgcat with On-Demand File Load","author":["Harald Oehlmann <[email protected]>","Harald Oehlmann <[email protected]>"],"is-jest":false},
	"411":{"url":"./tip/411.md","created":"31-Aug-2012","post-history":"","state":"Draft","implementation-url":"http://sqlitestudio.pl/tcl/patches/tip-411-chan_info.patch","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 411: Improved Channel Introspection via \"chan info\"","author":["Pawel Salawa <[email protected]>"],"is-jest":false},
	"410":{"url":"./tip/410.md","created":"26-Aug-2012","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 410: Three Features of scan Adapted for binary scan/format","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"409":{"url":"./tip/409.md","obsoletes":"391","keywords":"udp,datagram,message","created":"17-Aug-2012","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 409: UDP in Tcl","author":["Alexandre Ferrieux <[email protected]>","Colin McCormack <[email protected]>"],"is-jest":false},
	"408":{"url":"./tip/408.md","created":"17-Aug-2012","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 408: Allow Any Command for expr Functions","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"407":{"url":"./tip/407.md","created":"06-Aug-2012","post-history":"","state":"Draft","vote":"No voting","type":"Informative","title":"# TIP 407: The String Representation of Tcl Lists: the Gory Details","author":["Donal K. Fellows <[email protected]>","Kevin Kenny <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"406":{"url":"./tip/406.md","state":"Final","vote-summary":"Accepted 5/0/1","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DKF, KBK, JN, FV, SL","votes-against":"none","created":"01-Aug-2012","title":"# TIP 406: \"C\" is for Cookie","post-history":"","tcl-version":"8.7","vote":"Done","tcl-branch":"dkf-http-cookies","votes-present":"BG","is-jest":false},
	"405":{"url":"./tip/405.md","tcl-ticket":"3163961","keywords":"Tcl,mapeach,loop,accumulator","created":"31-Jul-2012","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 405: Add Collecting Loops, the 'lmap' and 'dict map' Commands","author":["Trevor Davel <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"404":{"url":"./tip/404.md","tcl-ticket":"3544988","keywords":"msgcat, convention","created":"17-Jul-2011","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 404: Let Message Catalogs get the Locale from their File Name","discussions-to":"Tcl Core list","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"403":{"url":"./tip/403.md","keywords":"Tk","created":"17-Jul-2011","post-history":"","state":"Final","tk-branch":"jn-web-colors","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 403: Web Colors for Tk","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"402":{"url":"./tip/402.md","keywords":"Tcl","state":"Final","type":"Project","author":["Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"FV, KW, JN","vote-results":"3/0/2 accepted","created":"16-Jul-2011","title":"# TIP 402: General Platform UNC Support","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-402","votes-present":"DGP, SL","discussions-to":"Tcl Core list","is-jest":false},
	"401":{"url":"./tip/401.md","created":"29-Apr-2012","post-history":"","state":"Draft","tcl-branch":"tip-401","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 401: Comment Words with Leading {#}","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"400":{"url":"./tip/400.md","keywords":"Tcl, zlib","created":"30-Mar-2012","post-history":"","state":"Final","tcl-branch":"tip-400-impl","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 400: Setting the Compression Dictionary and Other 'zlib' Updates","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"399":{"url":"./tip/399.md","keywords":"Tcl,localization,msgcat","created":"27-Mar-2012","obsoleted-by":"412","post-history":"","state":"Accepted","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 399: Dynamic Locale Changing for msgcat","author":["Harald Oehlmann <[email protected]>"],"is-jest":false},
	"398":{"url":"./tip/398.md","keywords":"close,exit,flush,blocking,nonblocking","created":"24-Feb-2012","post-history":"","state":"Final","tcl-branch":"tip-398-impl","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 398: Quickly Exit with Non-Blocking Blocked Channels","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"397":{"url":"./tip/397.md","keywords":"Tcl, TclOO, copy, clone","created":"13-Feb-2012","post-history":"","state":"Final","implementation-url":"https://core.tcl-lang.org/tcloo/timeline?r=development-rfe3485060","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 397: Extensible Object Copying","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"396":{"url":"./tip/396.md","obsoletes":"372","keywords":"coroutine,yield,yieldto","created":"11-Feb-2012","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 396: Symmetric Coroutines, Multiple Args, and yieldto","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"395":{"url":"./tip/395.md","keywords":"Tcl","state":"Final","type":"Project","author":["Jos Decoster <[email protected]>"],"created":"13-Dec-2011","obsoletes":"347","title":"# TIP 395: New 'string is entier' Command","post-history":"","vote":"Done","tcl-version":"8.6","implementation-url":"http://sites.google.com/site/josdecoster/Home/tip_string_is_entier.diff","discussions-to":"news:comp.lang.tcl","is-jest":false},
	"394":{"url":"./tip/394.md","created":"30-Nov-2011","post-history":"","obsoleted-by":"474","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 394: Platform-Independent Handling of Contemporary Mice","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"393":{"url":"./tip/393.md","created":"25-Apr-2011","post-history":"","state":"Draft","implementation-url":"http://sqlitestudio.pl/tcl/patches/tip-393-lsearch-command.patch","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 393: Add -command Option to lsearch","author":["Pawel Salawa <[email protected]>"],"is-jest":false},
	"392":{"url":"./tip/392.md","keywords":"bignum,runaway,safe,math,precision,integer,tcl","created":"30-Oct-2011","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 392: Allow Bignums to be Disabled at Runtime on a Per-Interp Basis","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"391":{"url":"./tip/391.md","created":"26-Oct-2011","obsoleted-by":"409","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 391: Support for UDP Sockets in Tcl","author":["Jeff Rogers <[email protected]>"],"is-jest":false},
	"390":{"url":"./tip/390.md","created":"27-Oct-2011","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 390: A Logging API for Tcl","author":["Jeff Rogers <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"389":{"url":"./tip/389.md","keywords":"Tcl","created":"23-Aug-2011","post-history":"","state":"Final","tcl-branch":"tip-389","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 389: Full support for Unicode 10.0 and later (part 1)","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"388":{"url":"./tip/388.md","keywords":"Tcl","created":"10-Aug-2011","post-history":"","state":"Final","tcl-branch":"tip-388-impl","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 388: Extending Unicode literals past the BMP","discussions-to":"Tcl Core list","author":["Jan Nijtmans <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"387":{"url":"./tip/387.md","keywords":"Tcl, coroutine","created":"30-May-2011","post-history":"","obsoleted-by":"396","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 387: Unified Yield Command Syntax","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"386":{"url":"./tip/386.md","keywords":"Fossil,DVCS","created":"01-Mar-2011","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 386: Relocation of Tcl/Tk Source Control Repositories","author":["Kevin B. Kenny <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"385":{"url":"./tip/385.md","keywords":"Tcl, traces","created":"13-Feb-2011","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 385: Functional Traces On Variables","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"384":{"url":"./tip/384.md","keywords":"kqueue,inotify,dnotify,gamin,FSevents,fam","created":"02-Dec-2010","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 384: Add File Alteration Monitoring to the Tcl Core","author":["Reinhard Max <[email protected]>","Gerald W. Lester <[email protected]>"],"is-jest":false},
	"383":{"url":"./tip/383.md","keywords":"debugging,coroutine,yielded","state":"Final","type":"Project","author":["Alexandre Ferrieux <[email protected]>","Miguel Sofer <[email protected]>","Donal K. Fellows <[email protected]>"],"votes-for":"DKF, KBK, JN","votes-against":"none","created":"03-Dec-2010","title":"# TIP 383: Injecting Code into Suspended Coroutines","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-383","votes-present":"FV, SL","is-jest":false},
	"382":{"url":"./tip/382.md","keywords":"Tk, dialog","created":"02-Nov-2010","post-history":"","state":"Final","tk-branch":"tip-382","vote":"Done","tcl-version":"8.5.11","type":"Project","title":"# TIP 382: Let tk_getSaveFile ignore file overwrites","author":["Pawel Salawa <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"381":{"url":"./tip/381.md","keywords":"TclOO, iTcl","created":"20-Oct-2010","post-history":"","state":"Final","implementation-url":"https://core.tcl-lang.org/tcloo/timeline?r=development-next2","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 381: Call Chain Introspection and Control","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"380":{"url":"./tip/380.md","tcl-ticket":"3084339","created":"20-Oct-2010","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 380: TclOO Slots for Flexible Declarations","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"379":{"url":"./tip/379.md","keywords":"event","created":"17-Oct-2010","post-history":"","state":"Draft","implementation-url":"http://www.wjduquette.com/notifier/hook-0.1.zip","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 379: Add a Command for Delivering Events Without Tk","author":["Will Duquette <[email protected]>"],"is-jest":false},
	"378":{"url":"./tip/378.md","tcl-ticket":"3081184","created":"04-Oct-2010","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 378: Fixing the Performance of TIP 280","author":["Andreas Kupries <[email protected]>","Jeff Hobbs <[email protected]>"],"is-jest":false},
	"377":{"url":"./tip/377.md","created":"13-Sep-2010","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 377: Portably Determining the Number of Processors in the System","author":["Andreas Kupries <[email protected]>"],"is-jest":false},
	"376":{"url":"./tip/376.md","created":"14-Sep-2010","post-history":"","state":"Final","implementation-url":"https://core.tcl-lang.org/tdbc/","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 376: Bundle sqlite3 and tdbc::sqlite3 Packages","author":["Don Porter <[email protected]>","D. Richard Hipp <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"375":{"url":"./tip/375.md","obsoletes":"373","keywords":"coroutine,yield","created":"12-Aug-2010","obsoleted-by":"396","post-history":"","state":"Draft","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 375: Symmetric Coroutines and Yieldto","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"374":{"url":"./tip/374.md","created":"13-Aug-2010","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 374: Stackless Vwait","author":["Thomas Perschak <[email protected]>","Trevor Davel <[email protected]>"],"is-jest":false},
	"373":{"url":"./tip/373.md","obsoletes":"372","keywords":"coroutine,yield","created":"12-Aug-2010","obsoleted-by":"375","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 373: Improved Yielding Support for Coroutines","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"372":{"url":"./tip/372.md","keywords":"coroutine, yield","created":"11-Aug-2010","obsoleted-by":"396","post-history":"","state":"Draft","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 372: Multi-argument Yield for Coroutines","discussions-to":"http://wiki.tcl.tk/26006","author":["Colin McCormack <[email protected]>"],"is-jest":false},
	"371":{"url":"./tip/371.md","created":"05-Aug-2010","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 371: Improvements for the dict command","author":["Thomas Perschak <[email protected]>","Trevor Davel <[email protected]>"],"is-jest":false},
	"370":{"url":"./tip/370.md","created":"04-Aug-2010","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 370: Extend Tk's selection with a -time option","author":["George Petasis <[email protected]>"],"is-jest":false},
	"369":{"url":"./tip/369.md","tk-ticket":"3023578","keywords":"Tk,user-defined data,dictionary","created":"15-Jul-2010","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 369: Widget cargo command","author":["Russell Davidson <[email protected]>","Trevor Davel <[email protected]>"],"is-jest":false},
	"368":{"url":"./tip/368.md","keywords":"Tk","created":"10-May-2010","obsoleted-by":"441","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 368: Listbox Justification Option","author":["Russell Davidson <[email protected]>"],"is-jest":false},
	"367":{"url":"./tip/367.md","keywords":"Tcl, delete, item","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, DGP, FV, SL, AK","votes-against":"none","created":"18-May-2010","title":"# TIP 367: A Command to Remove Elements from a List","post-history":"","tcl-version":"8.7","vote":"Done","tcl-branch":"tip-367","votes-present":"none","is-jest":false},
	"366":{"url":"./tip/366.md","keywords":"Tk","state":"Rejected","vote-summary":"Rejected 1/1/1","type":"Project","tk-branch":"tip-366","author":["Russell Davidson <[email protected]>"],"votes-against":"JN","votes-for":"KW","created":"29-Apr-2010","title":"# TIP 366: Variable Sized Indicators for Menubuttons","post-history":"","vote":"Done","tcl-version":"9.0","votes-present":"SL","is-jest":false},
	"365":{"url":"./tip/365.md","keywords":"Look at the date","created":"01-Apr-2010","post-history":"","state":"Draft","vote":"No voting","tcl-version":"8.6","type":"Project","title":"# TIP 365: Add Python Compatibility Mode","author":["Donal K. Fellows <[email protected]>"],"is-jest":true},
	"364":{"url":"./tip/364.md","keywords":"Tcl","created":"19-Mar-2010","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 364: Threading Support: Configuration and Package","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"363":{"url":"./tip/363.md","keywords":"expand,{*},vector,math","created":"02-Mar-2010","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 363: Vector Math in the Tcl Core","author":["Karl C. Hansen <[email protected]>"],"is-jest":false},
	"362":{"url":"./tip/362.md","tcl-ticket":"2960976","keywords":"Windows,Tcl","created":"01-Mar-2010","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 362: Simple 32 and 64 bit Registry Support","author":["Damon Courtney <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"361":{"url":"./tip/361.md","created":"03-Feb-2010","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 361: Releasing Channel Buffers","author":["Wayne Cuddy <[email protected]>"],"is-jest":false},
	"360":{"url":"./tip/360.md","tk-ticket":"2920409","keywords":"Tk, X11, menu","created":"24-Dec-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 360: Modernize X11 Menus","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"359":{"url":"./tip/359.md","tk-ticket":"2918731","keywords":"Tk,X11,ewmh,window manager","created":"21-Dec-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 359: Extended Window Manager Hint Support","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"358":{"url":"./tip/358.md","keywords":"Tcl, list extraction, parsing","created":"04-Oct-2009","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 358: Suppress Empty List Element Generation from the Split Command","author":["George Petasis <[email protected]>"],"is-jest":false},
	"357":{"url":"./tip/357.md","tcl-ticket":"2891616","created":"01-Oct-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 357: Export TclLoadFile","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"356":{"url":"./tip/356.md","keywords":"Tcl, C API, subst","created":"17-Sep-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 356: NR-enabled Substitutions for Extensions","author":["Don Porter <[email protected]>"],"is-jest":false},
	"355":{"url":"./tip/355.md","tcl-ticket":"2826430","created":"01-Sep-2009","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 355: Stop Fast Recycling of Channel Names on Unix","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"354":{"url":"./tip/354.md","created":"26-Aug-2009","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 354: Minor Production-Driven TclOO Revisions","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"353":{"url":"./tip/353.md","tcl-ticket":"2823282","created":"29-Jul-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 353: NR-enabled Expressions for Extensions","author":["Don Porter <[email protected]>"],"is-jest":false},
	"352":{"url":"./tip/352.md","created":"14-Jul-2009","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 352: Tcl Style Guide","author":["Ray Johnson <[email protected]>","Donal K. Fellows <[email protected]>","Mark Janssen <[email protected]>"],"is-jest":false},
	"351":{"url":"./tip/351.md","created":"09-Jul-2009","post-history":"","state":"Final","tcl-branch":"tip-351","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 351: Add Striding Support to lsearch","author":["Peter da Silva <[email protected]>","Donal K. Fellows <[email protected]>","Harald Oehlmann <[email protected]>","Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"350":{"url":"./tip/350.md","obsoletes":"308","created":"18-Apr-2009","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 350: Tcl Database Connectivity - Corrigenda","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"349":{"url":"./tip/349.md","created":"17-Apr-2009","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 349: New \"-cargo\" option for every Tk widget","author":["Zbigniew Baniewski <[email protected]>"],"is-jest":false},
	"348":{"url":"./tip/348.md","tcl-ticket":"2868499","keywords":"Tcl,debugging","created":"26-Feb-2009","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 348: Substituted 'errorstack' / 'traceback'","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"347":{"url":"./tip/347.md","keywords":"Tcl","created":"09-Feb-2009","obsoleted-by":"395","post-history":"","state":"Withdrawn","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 347: Align 'string is ...' to Type-Conversion Functions in 'expr'","discussions-to":"news:comp.lang.tcl","author":["Jos Decoster <[email protected]>"],"is-jest":false},
	"346":{"url":"./tip/346.md","keywords":"Tcl,encoding,convertto,strict,Unicode","":"Vote-Summary   Accepted 5/0/0","state":"Final","type":"Project","author":["Alexandre Ferrieux <[email protected]>","Jan Nijtmans <[email protected]>"],"votes-against":"none","votes-for":"FV, JN, KW, MC, SL","created":"02-Feb-2009","obsoleted-by":"654","title":"# TIP 346: Error on Failed String Encodings","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-346","votes-present":"none","is-jest":false},
	"345":{"url":"./tip/345.md","tcl-ticket":"2564363","keywords":"Tcl,encoding,invalid UTF-8","created":"05-Feb-2009","post-history":"","state":"Final","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 345: Kill the 'identity' Encoding","discussions-to":"Tcl Core List","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"344":{"url":"./tip/344.md","state":"Final","vote-summary":"Accepted 3/0/1","type":"Project","author":["Alexandre Ferrieux <[email protected]>"],"votes-for":"JN, KW, SL","votes-against":"none","created":"31-Dec-2008","title":"# TIP 344: Bring TCP_NODELAY and SO_KEEPALIVE to socket options","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-344","votes-present":"FV","is-jest":false},
	"343":{"url":"./tip/343.md","tcl-ticket":"2368084","keywords":"Tcl,binary","created":"03-Dec-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 343: A Binary Specifier for [format/scan]","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"342":{"url":"./tip/342.md","keywords":"dictionary, default value","state":"Final","type":"Project","author":["Lars Hellström <[email protected]>"],"votes-for":"DKF, JN, DGP, SL, AK","votes-against":"none","created":"27-Nov-2008","title":"# TIP 342: Dict Get With Default","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-342","votes-present":"FV","is-jest":false},
	"341":{"url":"./tip/341.md","tcl-ticket":"2370575","keywords":"Tcl, set intersection","created":"27-Nov-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 341: Multiple 'dict filter' Patterns","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"340":{"url":"./tip/340.md","keywords":"Tcl_SetResult","created":"14-Nov-2008","post-history":"","state":"Withdrawn","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 340: Const Qualification of Tcl_SetResult's Argument","author":["Jan Nijtmans <[email protected]>"],"is-jest":false},
	"339":{"url":"./tip/339.md","created":"14-Nov-2008","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 339: Case-Insensitive Package Names","author":["Andreas Kupries <[email protected]>"],"is-jest":false},
	"338":{"url":"./tip/338.md","keywords":"Tcl, Tk, tclsh, wish","created":"22-Oct-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 338: Embedder Access to Startup Scripts of *_Main()","author":["Don Porter <[email protected]>"],"is-jest":false},
	"337":{"url":"./tip/337.md","created":"21-Oct-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 337: Make TclBackgroundException() Public","author":["Don Porter <[email protected]>"],"is-jest":false},
	"336":{"url":"./tip/336.md","created":"21-Oct-2008","post-history":"","state":"Final","tcl-branch":"tip-330-336","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 336: Supported Access To interp->errorline","author":["Don Porter <[email protected]>"],"is-jest":false},
	"335":{"url":"./tip/335.md","keywords":"numLevels,embedding,terminate,async,thread,safe,gc","created":"13-Oct-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 335: An API for Detecting Active Interpreters","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"334":{"url":"./tip/334.md","keywords":"empty list","created":"13-Oct-2008","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.6","type":"Project","title":"# TIP 334: Make 'lrepeat' Accept Zero as a Count","author":["Michael Thomas Greer <[email protected]>"],"is-jest":false},
	"333":{"url":"./tip/333.md","keywords":"Tcl,resolution","created":"13-Oct-2008","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 333: New Variable and Namespace Resolving Interface","author":["Arnulf Wiedemann <[email protected]>"],"is-jest":false},
	"332":{"url":"./tip/332.md","tcl-ticket":"219159","obsoletes":"301","keywords":"Tcl,channel,close,socket,shutdown","created":"25-Sep-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 332: Half-Close for Bidirectional Channels","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"331":{"url":"./tip/331.md","created":"22-Sep-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 331: Allow [lset] to Extend Lists","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"330":{"url":"./tip/330.md","created":"22-Sep-2008","post-history":"","state":"Final","tcl-branch":"tip-330-336","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 330: Eliminate interp->result from the Public Headers","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"329":{"url":"./tip/329.md","obsoletes":"89","created":"22-Sep-2008","post-history":"","state":"Final","implementation-url":"http://www.crypt.co.za/pub/try-1.tcl","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 329: Try/Catch/Finally syntax","discussions-to":"http://wiki.tcl.tk/21608","author":["Trevor Davel <[email protected]>"],"is-jest":false},
	"328":{"url":"./tip/328.md","keywords":"Coroutine,continuation,event-loop,NRE","created":"07-Sep-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 328: Coroutines","author":["Miguel Sofer <[email protected]>","Neil Madden <[email protected]>"],"is-jest":false},
	"327":{"url":"./tip/327.md","keywords":"tailcall,NRE","created":"20-Sep-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 327: Proper Tailcalls","author":["Miguel Sofer <[email protected]>","David S. Cargo <[email protected]>"],"is-jest":false},
	"326":{"url":"./tip/326.md","tcl-ticket":"2082681","keywords":"Tcl, lsort, sorting","created":"01-Sep-2008","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 326: Add -stride Option to lsort","author":["Kieran Elby <[email protected]>"],"is-jest":false},
	"325":{"url":"./tip/325.md","keywords":"Tk, desktop integration","state":"Final","vote-summary":"Accepted 5/0/0","type":"Project","author":["David N. Welton <[email protected]>, Kevin Walzer <[email protected]>"],"votes-for":"SL, JN, MC, FV, KW","votes-against":"none","created":"25-Aug-2008","title":"# TIP 325: System Tray and System Notification Access","post-history":"","tcl-version":"8.7","vote":"Done","votes-present":"none","is-jest":false},
	"324":{"url":"./tip/324.md","tk-ticket":"1477426","obsoletes":"213","keywords":"Tk","created":"08-Aug-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 324: A Standard Dialog For Font Selection","author":["Adrian Robert <[email protected]>","Daniel A. Steffen <[email protected]>"],"is-jest":false},
	"323":{"url":"./tip/323.md","created":"06-Aug-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 323: Do Nothing Gracefully","author":["Colin McCormack <[email protected]>","Don Porter <[email protected]>","Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"322":{"url":"./tip/322.md","created":"13-Jul-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 322: Publish the NRE API","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"321":{"url":"./tip/321.md","tk-ticket":"1997907","keywords":"Tk,BLT,busy","created":"26-Jun-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 321: Add a [tk busy] Command","author":["Jos Decoster <[email protected]>"],"is-jest":false},
	"320":{"url":"./tip/320.md","tcl-ticket":"2005460","keywords":"TclOO","created":"13-Jun-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 320: Improved Variable Handling in the Core Object System","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"319":{"url":"./tip/319.md","created":"04-Jun-2008","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 319: Implement Backwards Compatibility for ttk Themed Widgets in tk Widgets","author":["Eric Taylor <[email protected]>"],"is-jest":false},
	"318":{"url":"./tip/318.md","created":"13-May-2008","post-history":"","state":"Final","tcl-branch":"tip-318-update","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 318: Extend Default Whitespace in 'string trim' Beyond ASCII","author":["Bill Poser <[email protected]>"],"is-jest":false},
	"317":{"url":"./tip/317.md","tcl-ticket":"1956530","keywords":"base64,uuencode,hex,transfer encoding","created":"03-May-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 317: Extend binary Ensemble with Binary Encodings","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"316":{"url":"./tip/316.md","created":"02-May-2008","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 316: Portable Access Functions for Stat Buffers","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"315":{"url":"./tip/315.md","created":"04-Apr-2008","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 315: Add pathSeparator to tcl_platform Array","author":["Hai Vu <[email protected]>"],"is-jest":false},
	"314":{"url":"./tip/314.md","tcl-ticket":"1901783","created":"26-Feb-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 314: Ensembles with Parameters","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"313":{"url":"./tip/313.md","tcl-ticket":"1894241","keywords":"Tcl","created":"14-Feb-2008","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 313: Inexact Searching in Sorted List","author":["Peter Spjuth <[email protected]>"],"is-jest":false},
	"312":{"url":"./tip/312.md","keywords":"variable,trace","state":"Final","type":"Project","author":["René Zaumseil <[email protected]>","Larry W. Virden <[email protected]>"],"votes-for":"DKF, JN, SL, AK","votes-against":"none","created":"26-Jan-2008","title":"# TIP 312: Add More Link Types","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-312-new","votes-present":"DGP, FV","is-jest":false},
	"311":{"url":"./tip/311.md","created":"08-Jan-2008","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 311: Tcl/Tk 8.6 Release Calendar","author":["Don Porter <[email protected]>","Larry W. Virden <[email protected]>","Joe Mistachkin <[email protected]>","Pat Thoyts <[email protected]>","Miguel Sofer <[email protected]>","Lars Hellström <[email protected]>","Alexandre Ferrieux <[email protected]>","Arnulf Wiedemann <[email protected]>","Trevor Davel <[email protected]>","Donal K. Fellows <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"310":{"url":"./tip/310.md","keywords":"expr","created":"07-Jan-2008","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 310: Add a New Pseudo-Random Number Generator","author":["Arjen Markus <[email protected]>"],"is-jest":false},
	"309":{"url":"./tip/309.md","keywords":"expr, parse","created":"07-Jan-2008","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 309: Expose the Expression Parsing","author":["Arjen Markus <[email protected]>"],"is-jest":false},
	"308":{"url":"./tip/308.md","created":"15-Nov-2007","obsoleted-by":"350","post-history":"","state":"Final","vote":"Done","type":"Informative","title":"# TIP 308: Tcl Database Connectivity (TDBC)","author":["Kevin B. Kenny <[email protected]>","Artur Trzewik <[email protected]>","Andreas Leitgeb <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"307":{"url":"./tip/307.md","tcl-ticket":"1723738","keywords":"Tcl, result, transfer, interpreter, API rename","created":"28-Sep-2007","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 307: Make TclTransferResult() Public","author":["Erik Leunissen <[email protected]>"],"is-jest":false},
	"306":{"url":"./tip/306.md","keywords":"automatic,Tk,widget,naming","created":"11-Jun-2007","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 306: Auto-Naming Widgets","author":["Koen Danckaert <[email protected]>","Richard Suchenwirth <[email protected]>"],"is-jest":false},
	"305":{"url":"./tip/305.md","created":"21-Feb-2007","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 305: ANSI Escape Sequence Support for Windows's Console Channel Driver","discussions-to":"news:comp.lang.tcl","author":["David Gravereaux <[email protected]>"],"is-jest":false},
	"304":{"url":"./tip/304.md","tcl-ticket":"1978495","keywords":"Tcl,exec,process,subprocess,pipeline,channel","created":"07-Feb-2007","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 304: A Standalone [chan pipe] Primitive for Advanced Child IPC","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"303":{"url":"./tip/303.md","keywords":"Tcl, lindex","created":"29-Jan-2007","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 303: Enhance 'llength' Command to Support Nested Lists","author":["Wolf-Dieter Busch <[email protected]>"],"is-jest":false},
	"302":{"url":"./tip/302.md","keywords":"Tcl,time changes","created":"13-Dec-2006","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 302: Fix \"after\"'s Sensitivity To Adjustments Of System Clock","author":["Alexandre Ferrieux <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"301":{"url":"./tip/301.md","created":"11-Dec-2006","obsoleted-by":"332","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 301: Split Bidirectional Channels For Half-Close","author":["Alexandre Ferrieux <[email protected]>"],"is-jest":false},
	"300":{"url":"./tip/300.md","tk-ticket":"1602955","keywords":"Tk","created":"25-Nov-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 300: Examine Glyph Substitution in the 'font actual' Command","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"299":{"url":"./tip/299.md","tk-ticket":"1602534","keywords":"Tcl, expression, integer, square root","created":"24-Nov-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 299: Add isqrt() Math Function","author":["Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"298":{"url":"./tip/298.md","tcl-ticket":"1601243","keywords":"Tcl,Tcl_Obj","created":"22-Nov-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 298: Revise Shared Value Rules for Tcl_GetBignumAndClearObj","author":["Don Porter <[email protected]>"],"is-jest":false},
	"297":{"url":"./tip/297.md","keywords":"Tcl, number, expression","created":"20-Nov-2006","post-history":"","obsoleted-by":"502,514,515","state":"Withdrawn","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 297: Integer Type Introspection and Conversion","author":["Don Porter <[email protected]>"],"is-jest":false},
	"296":{"url":"./tip/296.md","keywords":"Tcl,lrange,lreplace","created":"06-Nov-2006","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 296: Enhanced Syntax for Pair-Wise Indices","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"295":{"url":"./tip/295.md","keywords":"Tcl,lrange","created":"06-Nov-2006","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 295: Enhance Arguments to lrange","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"294":{"url":"./tip/294.md","keywords":"Tcl,number,cast,rename","created":"03-Nov-2006","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 294: The \"entier\" Function: It's Spelt \"entire\"","author":["Lars Hellström <[email protected]>","Richard Suchenwirth <[email protected]>"],"is-jest":false},
	"293":{"url":"./tip/293.md","obsoletes":"157","created":"02-Nov-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 293: Argument Expansion with Leading {*}","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"292":{"url":"./tip/292.md","keywords":"Tcl, expr","created":"01-Nov-2006","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 292: Allow Unquoted Strings in Expressions","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"291":{"url":"./tip/291.md","tcl-ticket":"1600701","keywords":"Tcl,Critcl,TEApot","created":"26-Oct-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 291: Add the 'platform' Package to Tcl","author":["Steve Landers <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"290":{"url":"./tip/290.md","tcl-ticket":"1587317","keywords":"Tcl,error,trap","created":"29-Oct-2006","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 290: Registration of Custom Error Handler Scripts","author":["Eckhard Lehmann <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"289":{"url":"./tip/289.md","keywords":"Tcl","created":"26-Oct-2006","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 289: Revision of [lrepeat] Argument Order","author":["Peter Spjuth <[email protected]>","<[email protected]>"],"is-jest":false},
	"288":{"url":"./tip/288.md","keywords":"Tcl,proc","state":"Rejected","vote-summary":"Rejected 1/0/2","type":"Project","author":["Peter Spjuth <[email protected]>","Andreas Leitgeb <[email protected]>"],"votes-against":"none","votes-for":"JN","created":"03-Oct-2006","title":"# TIP 288: Allow \"args\" Anywhere in Procedure Formal Arguments","post-history":"","vote":"Done","tcl-branch":"aspect-tip288","tcl-version":"9.0","votes-present":"FV, SL","is-jest":false},
	"287":{"url":"./tip/287.md","tcl-ticket":"1586860","keywords":"Tcl,channel,chan,pendinginput,pendingoutput","created":"26-Oct-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 287: Add a Commands for Determining Size of Buffered Data","author":["Michael A. Cleverly <[email protected]>"],"is-jest":false},
	"286":{"url":"./tip/286.md","tk-ticket":"1152376","keywords":"Tk","created":"18-Oct-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 286: Add 'xposition' Command to Menu Widgets","author":["Schelte Bron <[email protected]>"],"is-jest":false},
	"285":{"url":"./tip/285.md","tcl-ticket":"1499394","keywords":"eval,cancel,unwind,terminate,runaway,async,thread,safe","created":"04-Jun-2006","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 285: Script Cancellation with [interp cancel] and Tcl_CancelEval","author":["Joe Mistachkin <[email protected]>","Dawson Cowals <[email protected]>"],"is-jest":false},
	"284":{"url":"./tip/284.md","created":"01-Oct-2006","post-history":"","state":"Draft","tcl-branch":"tip-284","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 284: New 'invoke' and 'namespace invoke' Commands","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"283":{"url":"./tip/283.md","tcl-ticket":"1577282","created":"01-Oct-2006","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 283: Modify Ensemble Command Resolution Behaviour","author":["Miguel Sofer <[email protected]>","Neil Madden <[email protected]>"],"is-jest":false},
	"282":{"url":"./tip/282.md","tcl-ticket":"1969722","keywords":"expr,operator,assignment","created":"13-Oct-2006","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 282: Enhanced Expression Syntax","author":["Will Duquette <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"281":{"url":"./tip/281.md","keywords":"POSIX,channel driver,errorCode","created":"08-Oct-2006","post-history":"","state":"Draft","implementation-url":"http://iocpsock.cvs.sourceforge.net/iocpsock/iocpsock/tclWinError.c?revision=HEAD&view=markup","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 281: Improvements in System Error Handling","author":["David Gravereaux <[email protected]>"],"is-jest":false},
	"280":{"url":"./tip/280.md","tcl-ticket":"1571568","obsoletes":"211","keywords":"Tcl","created":"10-Aug-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 280: Add Full Stack Trace Capability With Location Introspection","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"279":{"url":"./tip/279.md","created":"05-Oct-2006","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 279: Adding an Extensible Object System to the Core","author":["Gustaf Neumann <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"278":{"url":"./tip/278.md","created":"03-Oct-2006","post-history":"","state":"Final","tcl-branch":"tip-278","tcl-version":"9.0","discussions to":"Tcl Core List","vote":"Done","type":"Project","title":"# TIP 278: Fix Variable Name Resolution Quirks","author":["Miguel Sofer <[email protected]>","Miguel Sofer <[email protected]>","Kevin Kenny <[email protected]>","Jan Nijtmans <[email protected]>"],"is-jest":false},
	"277":{"url":"./tip/277.md","created":"01-Oct-2006","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 277: Create Namespaces as Needed","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"276":{"url":"./tip/276.md","keywords":"Tcl,global,variable,upvar,namespace upvar","created":"01-Oct-2006","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 276: Specify and Unify Variable Linking Commands","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"275":{"url":"./tip/275.md","tcl-ticket":"1565751","keywords":"Tcl,binary,unsigned","created":"27-Sep-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 275: Support Unsigned Values in binary Command","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"274":{"url":"./tip/274.md","tcl-ticket":"1556802","keywords":"Tcl,expr","created":"15-Sep-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 274: Right-Associativity for the Exponentiation Operator","author":["Arjen Markus <[email protected]>","David Smith <[email protected]>","Richard Suchenwirth <[email protected]>","Don Porter <[email protected]>","Sérgio Loureiro <[email protected]>"],"is-jest":false},
	"273":{"url":"./tip/273.md","obsoletes":"176","created":"30-Aug-2006","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 273: Add Tcl_Expr... Support to Tcl_Get... Functions","author":["Carsten Gosvig <[email protected]>"],"is-jest":false},
	"272":{"url":"./tip/272.md","tcl-ticket":"1545151","keywords":"Tcl, lreverse","created":"23-Aug-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 272: String and List Reversal Operations","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"271":{"url":"./tip/271.md","tk-ticket":"1520742","created":"11-Jul-2006","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 271: Windows-Style Open and Save File Dialog on Unix","author":["Matthew Middleton <[email protected]>","susanta kumar mishra <[email protected]>"],"is-jest":false},
	"270":{"url":"./tip/270.md","created":"19-Jun-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 270: Utility C Routines for String Formatting","author":["Don Porter <[email protected]>"],"is-jest":false},
	"269":{"url":"./tip/269.md","tcl-ticket":"1491459","keywords":"Tcl,lists,strings","created":"19-May-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 269: Add 'string is list' to the 'string is' Subcommand","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"268":{"url":"./tip/268.md","tcl-ticket":"1520767","created":"28-Apr-2006","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 268: Enhance 'package' Version Handling","author":["Jeff Hobbs <[email protected]>","Hemang Lavana <[email protected]>","Andreas Kupries <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"267":{"url":"./tip/267.md","tcl-ticket":"1476191","created":"25-Apr-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 267: Allow 'exec' to Ignore Stderr","author":["Nathan Bell <[email protected]>"],"is-jest":false},
	"266":{"url":"./tip/266.md","keywords":"Tcl,unknown,expression","created":"11-Apr-2006","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 266: Numbers are Commands","author":["Kristoffer Lawson <[email protected]>","Michal Malecki <[email protected]>","Wolf-Dieter Busch <[email protected]>","Paul Nash <[email protected]>"],"is-jest":false},
	"265":{"url":"./tip/265.md","tcl-ticket":"1446696","keywords":"Command line parsing, C implementation","created":"03-Apr-2006","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 265: A Convenient C-side Command Option Parser for Tcl","author":["Sam Bromley <[email protected]>"],"is-jest":false},
	"264":{"url":"./tip/264.md","keywords":"Tk, C API","created":"01-Apr-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 264: Add Function to Retrieve the Interpreter of a Window","author":["George Petasis <[email protected]>"],"is-jest":false},
	"263":{"url":"./tip/263.md","created":"01-Apr-2006","post-history":"","state":"Draft","tcl-version":"9.2","vote":"Pending","type":"Project","title":"# TIP 263: Quantum Tcl","author":["Lars Hellström <[email protected]>"],"is-jest":true},
	"262":{"url":"./tip/262.md","keywords":"Tk,option","state":"Final","type":"Project","tk-branch":"tip-262","author":["Eric Taylor <[email protected]>","Donal K. Fellows <[email protected]>"],"votes-for":"DKF, FV, KBK, JN, SL","votes-against":"none","created":"18-Mar-2006","title":"# TIP 262: Background Images for Frames","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"261":{"url":"./tip/261.md","tcl-ticket":"1437008","created":"20-Dec-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 261: Return Imported Commands from [namespace import]","author":["Martin Lemburg <[email protected]>","<[email protected]>"],"is-jest":false},
	"260":{"url":"./tip/260.md","created":"04-Jan-2006","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 260: Add Underline Option to Canvas Text Items","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"259":{"url":"./tip/259.md","created":"12-Dec-2005","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 259: Making 'exec' Optionally Binary Safe","author":["Andreas Leitgeb <[email protected]>"],"is-jest":false},
	"258":{"url":"./tip/258.md","tcl-ticket":"1413934","keywords":"encoding","created":"01-Oct-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 258: Enhanced Interface for Encodings","author":["Don Porter <[email protected]>"],"is-jest":false},
	"257":{"url":"./tip/257.md","obsoletes":"50","created":"26-Sep-2005","post-history":"","state":"Final","tcl-branch":"tip-257-implementation-branch","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 257: Object Orientation for Tcl","author":["Donal K. Fellows <[email protected]>","Will Duquette <[email protected]>","Steve Landers <[email protected]>","Jeff Hobbs <[email protected]>","Kevin Kenny <[email protected]>","Miguel Sofer <[email protected]>","Richard Suchenwirth <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"256":{"url":"./tip/256.md","tk-ticket":"1247835","created":"12-Aug-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 256: Implement Tabular and Wordprocessor Style Tabbing","author":["Vince Darley <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"255":{"url":"./tip/255.md","tcl-ticket":"1309020","created":"21-Jul-2005","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 255: Add 'min' and 'max' [expr] Functions","author":["Jeff Hobbs <[email protected]>"],"is-jest":false},
	"254":{"url":"./tip/254.md","tcl-ticket":"1242844","created":"21-Jul-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 254: New Types for Tcl_LinkVar","author":["Rene Meyer <[email protected]>"],"is-jest":false},
	"253":{"url":"./tip/253.md","created":"05-Jul-2005","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 253: Consolidate Package-Related Commands","author":["Brian Schmidt <[email protected]>"],"is-jest":false},
	"252":{"url":"./tip/252.md","created":"28-Jun-2005","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 252: Add New 'string' Command Options","author":["Brian Schmidt <[email protected]>"],"is-jest":false},
	"251":{"url":"./tip/251.md","created":"28-Jun-2005","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 251: Enhance the 'list' Command","author":["Brian Schmidt <[email protected]>","Sérgio Loureiro <[email protected]>"],"is-jest":false},
	"250":{"url":"./tip/250.md","tcl-ticket":"1275435","created":"19-Jun-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 250: Efficient Access to Namespace Variables","author":["Will Duquette <[email protected]>","miguel sofer <[email protected]>"],"is-jest":false},
	"249":{"url":"./tip/249.md","created":"13-Jun-2005","post-history":"","state":"Draft","vote":"No voting","type":"Informative","title":"# TIP 249: Unification of Tcl's Parsing of Numbers","author":["Kevin B. Kenny <[email protected]>","David S. Cargo <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"248":{"url":"./tip/248.md","obsoletes":"172","created":"08-Jun-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 248: Integrate Tile into Tk as Ttk","author":["Jeff Hobbs <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"247":{"url":"./tip/247.md","created":"01-Jun-2005","post-history":"","state":"Draft","vote":"Pending","type":"Informational","title":"# TIP 247: Tcl/Tk Engineering Manual","author":["John K. Ousterhout <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"246":{"url":"./tip/246.md","keywords":"pattern,match,glob,exact,regexp,case sensitive,Tcl","created":"27-Apr-2005","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 246: Unify Pattern Matching","author":["Reinhard Max <[email protected]>"],"is-jest":false},
	"245":{"url":"./tip/245.md","tk-ticket":"1185731","keywords":"Tk","created":"15-Apr-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 245: Discover User Inactivity Time","author":["Pascal Scheffers <[email protected]>","Reinhard Max <[email protected]>","Neil Madden <[email protected]>"],"is-jest":false},
	"244":{"url":"./tip/244.md","created":"22-Mar-2005","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 244: PNG Photo Image Support for Tk","discussions-to":"news:comp.lang.tcl","author":["Michael Kirkham <[email protected]>"],"is-jest":false},
	"243":{"url":"./tip/243.md","tk-ticket":"1167420","keywords":"Tk","created":"16-Mar-2005","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 243: Supply Find Dialog for the Text Widget","author":["Rüdiger Härtel <[email protected]>"],"is-jest":false},
	"242":{"url":"./tip/242.md","tk-ticket":"1156388","created":"03-Mar-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 242: Preselect Filter on tk_get*File Dialogs","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"241":{"url":"./tip/241.md","tcl-ticket":"1152746","keywords":"Tcl,sorted lists,matching","created":"26-Feb-2005","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 241: Case-Insensitive Switches and List Searching and Sorting","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"240":{"url":"./tip/240.md","tcl-ticket":"1315115","obsoletes":"88","keywords":"Tcl","created":"22-Feb-2005","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 240: An Ensemble Command to Manage Processes","author":["Steve Bold <[email protected]>"],"is-jest":false},
	"239":{"url":"./tip/239.md","created":"26-Jan-2005","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 239: Enhance the 'load' Command","author":["Jeff Hobbs <[email protected]>"],"is-jest":false},
	"238":{"url":"./tip/238.md","keywords":"Tk","created":"25-Jan-2005","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 238: Fire Event when Widget Created","author":["Gerald W. Lester <[email protected]>"],"is-jest":false},
	"237":{"url":"./tip/237.md","created":"14-Jan-2005","post-history":"","state":"Final","tcl-branch":"kennykb-numerics-branch","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 237: Arbitrary-Precision Integers for Tcl","author":["Kevin B. Kenny <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"236":{"url":"./tip/236.md","keywords":"Tk,anchor,place","created":"25-Dec-2004","post-history":"","state":"Final","implementation-url":"http://www.eecs.umich.edu/~mckay/canvmoveto.patch.gz","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 236: Absolute Positioning of Canvas Items","author":["Neil McKay <[email protected]>"],"is-jest":false},
	"235":{"url":"./tip/235.md","created":"10-Dec-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 235: Exposing a C API for Ensembles","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"234":{"url":"./tip/234.md","keywords":"Tcl,zip,gzip,deflate","created":"08-Dec-2004","post-history":"","state":"Final","implementation-url":"http://svn.scheffers.net/zlib","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 234: Add Support For Zlib Compression","author":["Pascal Scheffers <[email protected]>"],"is-jest":false},
	"233":{"url":"./tip/233.md","tcl-ticket":"1073863","created":"30-Nov-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 233: Virtualization of Tcl's Sense of Time","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"232":{"url":"./tip/232.md","keywords":"math,expr,Tcl","created":"26-Nov-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 232: Creating New Math Functions for the 'expr' Command","author":["Arjen Markus <[email protected]>","Kevin Kenny <[email protected] >"],"is-jest":false},
	"231":{"url":"./tip/231.md","tk-ticket":"1062022","created":"06-Nov-2004","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 231: Support for [wm attributes] on X11","author":["Joe English <[email protected]>"],"is-jest":false},
	"230":{"url":"./tip/230.md","tcl-ticket":"1163274","created":"02-Nov-2004","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 230: Tcl Channel Transformation Reflection API","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"229":{"url":"./tip/229.md","tcl-ticket":"1159942","created":"03-Nov-2004","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 229: Scripted Control of Name Resolution in Namespaces","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"228":{"url":"./tip/228.md","created":"02-Nov-2004","post-history":"","state":"Draft","implementation-url":"http://sourceforge.net/projects/tclvfs/","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 228: Tcl Filesystem Reflection API","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"227":{"url":"./tip/227.md","tcl-ticket":"1060579","keywords":"Tcl","created":"30-Oct-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 227: Interface to Get and Set the Return Options of an Interpreter","author":["Don Porter <[email protected]>"],"is-jest":false},
	"226":{"url":"./tip/226.md","tcl-ticket":"1060579","keywords":"Tcl","created":"30-Oct-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 226: Interface to Save and Restore Interpreter State","author":["Don Porter <[email protected]>"],"is-jest":false},
	"225":{"url":"./tip/225.md","tcl-ticket":"1052584","created":"25-Oct-2004","obsoleted-by":"629","post-history":"","state":"Withdrawn","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 225: Arithmetic Series with Optimized Space Complexity","author":["Salvatore Sanfilippo <[email protected]>","Miguel Sofer <[email protected]>","Brian Griffin <[email protected]>","Eric Taylor <[email protected]>"],"is-jest":false},
	"224":{"url":"./tip/224.md","":"sensible way.","state":"Rejected","type":"Project","author":["Peter MacDonald <[email protected]>","Robert Seeger <[email protected]>","Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, SL","votes-against":"DGP, AK","rejection-reason":"","created":"28-Sep-2004","title":"# TIP 224: Add New [array] Subcommand 'value'","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-224","votes-present":"FV","is-jest":false},
	"223":{"url":"./tip/223.md","tk-ticket":"1032982","created":"21-Sep-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 223: Full-Screen Toplevel Support for Tk","author":["Mo DeJong <[email protected]>"],"is-jest":false},
	"222":{"url":"./tip/222.md","tk-ticket":"892194","keywords":"Tk","created":"16-Sep-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 222: Add [wm attributes -alpha] Attribute on Windows","author":["Jeff Hobbs <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"221":{"url":"./tip/221.md","tcl-ticket":"1060579","keywords":"bgerror,return,options","created":"15-Sep-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 221: Allow Background Error Handlers to Accept Return Options","author":["Don Porter <[email protected]>"],"is-jest":false},
	"220":{"url":"./tip/220.md","":"Vote-Summary    Accepted 3/0/3","state":"Final","type":"Project","author":["Colin McCormack <[email protected]>","Andreas Kupries <[email protected]>","Vince Darley <[email protected]>"],"votes-for":"JN, KBK, SL","votes-against":"none","created":"12-Sep-2004","title":"# TIP 220: Escalate Privileges in VFS Close Callback","post-history":"","vote":"Done","tcl-version":"8.7","tcl-branch":"tip-220","votes-present":"DGP, FV, MC","is-jest":false},
	"219":{"url":"./tip/219.md","tcl-ticket":"1025294","created":"09-Sep-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 219: Tcl Channel Reflection API","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"218":{"url":"./tip/218.md","tcl-ticket":"875701","created":"09-Sep-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 218: Tcl Channel Driver Thread State Actions","author":["Andreas Kupries <[email protected]>","Andreas Kupries <[email protected]>","Larry W. Virden <[email protected]>","David Gravereaux <[email protected]>"],"is-jest":false},
	"217":{"url":"./tip/217.md","tcl-ticket":"1017532","keywords":"Tcl,lsort,parallel lists","created":"26-Aug-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 217: Getting Sorted Indices out of Lsort","author":["James P. Salsman <[email protected]>"],"is-jest":false},
	"216":{"url":"./tip/216.md","keywords":"Tcl, debugging, argument, shell","created":"23-Aug-2004","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 216: Handling Command-Line Options in Tclsh and Wish","author":["Arjen Markus <[email protected]>"],"is-jest":false},
	"215":{"url":"./tip/215.md","tcl-ticket":"1413115","keywords":"Tcl","created":"25-Aug-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 215: Make [incr] Auto-Initialize Undefined Variables","author":["Andreas Leitgeb <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"214":{"url":"./tip/214.md","obsoletes":"117","keywords":"Tcl,info,representation","created":"24-Aug-2004","post-history":"","state":"Withdrawn","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 214: Add New Object Introspection Command","author":["Ulrich Schöbel <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"213":{"url":"./tip/213.md","keywords":"Tk","created":"21-Aug-2004","obsoleted-by":"324","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 213: A Standard Dialog for Font Selection","author":["Donal K. Fellows <[email protected]>","Pat Thoyts <[email protected]>"],"is-jest":false},
	"212":{"url":"./tip/212.md","tcl-ticket":"1008768","keywords":"tcl, dict, update, script","created":"11-Aug-2004","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 212: Temporarily Opening out a Dictionary","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"211":{"url":"./tip/211.md","keywords":"Tcl","created":"10-Aug-2004","obsoleted-by":"280","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 211: Add Full Stack Trace Capability","author":["Robert Seeger <[email protected]>","Robert Seeger <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"210":{"url":"./tip/210.md","tcl-ticket":"999162","keywords":"Tcl,filename","created":"19-Jul-2004","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 210: Add 'tempfile' Subcommand to 'file'","author":["Bob Techentin <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"209":{"url":"./tip/209.md","tcl-ticket":"991742","keywords":"clock, milliseconds, microseconds","created":"12-Jul-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 209: Add [clock milliseconds], and [clock microseconds]","author":["Reinhard Max <[email protected]>"],"is-jest":false},
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
	"200":{"url":"./tip/200.md","keywords":"Tcl","created":"20-May-2004","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 200: Listing the Values in an Array","author":["Donal K. Fellows <[email protected]>","Dossy Shiobara <[email protected]>"],"is-jest":false},
	"199":{"url":"./tip/199.md","keywords":"Tcl,Tk,shell,interactive","created":"12-May-2004","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 199: Specification of Alternatives to .wishrc/.tclshrc","author":["R. Timothy Edwards <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"198":{"url":"./tip/198.md","created":"12-May-2004","post-history":"","state":"Rejected","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 198: Image Command XPM Extension","author":["R. Timothy Edwards <[email protected]>","Don Porter <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"197":{"url":"./tip/197.md","keywords":"Tk","created":"12-May-2004","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 197: Unfocussed Text Widget Cursor Control","author":["R. Timothy Edwards <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"196":{"url":"./tip/196.md","created":"11-May-2004","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 196: Tcl Commands as Values","author":["Robert Suetterlin <[email protected]>"],"is-jest":false},
	"195":{"url":"./tip/195.md","tcl-ticket":"1040206","obsoletes":"105","keywords":"Tcl","created":"02-May-2004","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 195: A Unique Prefix Handling Command","author":["Peter Spjuth <[email protected]>","Peter Spjuth <[email protected]>"],"is-jest":false},
	"194":{"url":"./tip/194.md","tcl-ticket":"944803","keywords":"Tcl,lambda,anonymous,command,function,functional programming","created":"30-Apr-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 194: Procedures as Values via '''apply'''","author":["Miguel Sofer <[email protected]>","Joe Mistachkin <[email protected]>"],"is-jest":false},
	"193":{"url":"./tip/193.md","keywords":"Tcl","created":"29-Apr-2004","post-history":"","state":"Draft","vote":"Pending","tcl-version":"8.7","type":"Project","title":"# TIP 193: Simple Syntax Help System","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"192":{"url":"./tip/192.md","keywords":"Tcl","created":"27-Mar-2004","post-history":"","state":"Draft","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 192: Lazy Lists","author":["Salvatore Sanfilippo <[email protected]>","Theo Verelst <[email protected]>"],"is-jest":false},
	"191":{"url":"./tip/191.md","created":"24-Mar-2004","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 191: Managing Tcl Packages and Modules in a Multi-Version Environment","author":["Andreas Kupries <[email protected]>","Joe English <[email protected]>","Larry Virden <[email protected]>"],"is-jest":false},
	"190":{"url":"./tip/190.md","created":"24-Mar-2004","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 190: Implementation Choices for Tcl Modules","author":["Andreas Kupries <[email protected]>","Jean-Claude Wippler <[email protected]>","Jeff Hobbs <[email protected]>"],"is-jest":false},
	"189":{"url":"./tip/189.md","tcl-ticket":"942881","created":"24-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 189: Tcl Modules","author":["Andreas Kupries <[email protected]>","Jean-Claude Wippler <[email protected]>","Jeff Hobbs <[email protected]>","Don Porter <[email protected]>","Larry W. Virden <[email protected]>","Daniel A. Steffen <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"188":{"url":"./tip/188.md","tcl-ticket":"940915","keywords":"Tcl","created":"23-Apr-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 188: Add 'string is wideinteger' to the 'string is' Subcommand","discussions-to":"news:comp.lang.tcl","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"187":{"url":"./tip/187.md","keywords":"Tcl,lambda,anonymous,command,function","created":"20-Apr-2004","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 187: Procedures as Values","author":["Salvatore Sanfilippo <[email protected]>","Miguel Sofer <[email protected]>","Paul Nash <[email protected]>"],"is-jest":false},
	"186":{"url":"./tip/186.md","keywords":"Tk","created":"16-Apr-2004","post-history":"","state":"Draft","implementation-url":"http://pdqi.com/configure.diff.gz","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 186: Expose the Type and Modified-State of Widget Options","author":["Peter MacDonald <[email protected]>","Peter MacDonald <[email protected]>"],"is-jest":false},
	"185":{"url":"./tip/185.md","keywords":"Tcl, absent value","created":"08-Apr-2004","post-history":"","state":"Rejected","vote":"Done","type":"Project","tcl-version":"8.6","title":"# TIP 185: Null Handling","author":["John H. Harris <[email protected]>"],"is-jest":false},
	"184":{"url":"./tip/184.md","tcl-ticket":"600812","keywords":"Tcl, upvar, global","created":"27-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 184: Avoid Creating Unusable Variables","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"183":{"url":"./tip/183.md","tcl-ticket":"577093","keywords":"Tcl","created":"24-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 183: Add a Binary Flag to [open]","author":["Andreas Leitgeb <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"182":{"url":"./tip/182.md","tcl-ticket":"1165062","created":"23-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 182: Add [expr bool] Math Function","author":["Joe Mistachkin <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"181":{"url":"./tip/181.md","tcl-ticket":"958222","created":"23-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 181: Add a [namespace unknown] Command","author":["Neil Madden <[email protected]>"],"is-jest":false},
	"180":{"url":"./tip/180.md","keywords":"Tk","created":"22-Mar-2003","post-history":"","state":"Draft","vote":"Pending","type":"Project","tcl-version":"8.7","title":"# TIP 180: Add a Megawidget Support Core Package","author":["Damon Courtney <[email protected]>"],"is-jest":false},
	"179":{"url":"./tip/179.md","keywords":"Tk","created":"22-Mar-2004","post-history":"","state":"Final","implementation-url":"ftp://ftp.model.com/pub/tcl/pw_hide_TIP.tgz","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 179: Add -hide Option to panedwindow Widget","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"178":{"url":"./tip/178.md","tcl-ticket":"920731ffffffffffffff","created":"21-Mar-2004","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 178: [info pid] and [info tid] Subcommands","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"177":{"url":"./tip/177.md","keywords":"Tk","created":"17-Mar-2004","post-history":"","state":"Final","implementation-url":"ftp://ftp.model.com/pub/tcl/pw_stretch_TIP.tgz","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 177: Add -stretch Option to panedwindow Widget","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"176":{"url":"./tip/176.md","tcl-ticket":"1165695","created":"16-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 176: Add String Index Values","author":["Damon Courtney <[email protected]>","Don Porter <[email protected]>","Damon Courtney <[email protected]>"],"is-jest":false},
	"175":{"url":"./tip/175.md","created":"15-Mar-2004","post-history":"","state":"Withdrawn","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 175: Add an -async Option to [open]","author":["Neil Madden <[email protected]>"],"is-jest":false},
	"174":{"url":"./tip/174.md","tcl-ticket":"1578137","created":"15-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 174: Math Operators as Commands","author":["Kristoffer Lawson <[email protected]>","Donal K. Fellows <[email protected]>","David S. Cargo <[email protected]>","Peter Spjuth <[email protected]>","Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"173":{"url":"./tip/173.md","created":"11-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 173: Internationalisation and Refactoring of the 'clock' Command","discussions-to":"news:comp.lang.tcl","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"172":{"url":"./tip/172.md","created":"08-Mar-2004","obsoleted-by":"248","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"No voting","type":"Project","title":"# TIP 172: Improve UNIX Tk Look and Feel","author":["David N. Welton <[email protected]>"],"is-jest":false},
	"171":{"url":"./tip/171.md","created":"05-Mar-2004","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 171: Change Default <MouseWheel> Bindings Behavior","author":["Jeff Hobbs <[email protected]>","Keith Vetter <[email protected]>"],"is-jest":false},
	"170":{"url":"./tip/170.md","created":"30-Jan-2004","post-history":"","state":"Draft","implementation-url":"http://nac.sf.net/","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 170: Better Support for Nested Lists","author":["Sergey Babkin <[email protected]>","Don Porter <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"169":{"url":"./tip/169.md","tk-ticket":"994629","created":"28-Jan-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 169: Add Peer Text Widgets","author":["Brian Griffin <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"168":{"url":"./tip/168.md","tk-ticket":"886240","created":"25-Jan-2004","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 168: Cubic Bezier Curves on the Canvas","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"167":{"url":"./tip/167.md","created":"19-Nov-2003","post-history":"","state":"Draft","tk-branch":"tip-167","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 167: Add a New Option for Context Help for Windows","author":["Ramon Ribó <[email protected]>"],"is-jest":false},
	"166":{"url":"./tip/166.md","keywords":"Tk,image get,image put","created":"19-Nov-2003","post-history":"","state":"Final","tk-branch":"tip-166","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 166: Reading and Writing the Photo Image Alpha Channel","author":["Donal K. Fellows <[email protected]>","Simon Bachmann <[email protected]>"],"is-jest":false},
	"165":{"url":"./tip/165.md","tk-ticket":"1008975","keywords":"Tk,substitution","created":"17-Nov-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 165: A User-Data Field for Virtual Events","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"164":{"url":"./tip/164.md","keywords":"Tk,canvas","state":"Final","type":"Project","tk-branch":"tip-164","author":["Arjen Markus <[email protected]>","Dimitrios Zachariadis <[email protected]>","Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, FV, SL, AK","votes-against":"none","created":"17-Nov-2003","title":"# TIP 164: Add Rotate Subcommand to the Canvas Widget","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"163":{"url":"./tip/163.md","tcl-ticket":"745851","created":"14-Nov-2003","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 163: A [dict merge] Subcommand","author":["Joe English <[email protected]>"],"is-jest":false},
	"162":{"url":"./tip/162.md","created":"23-Oct-2003","post-history":"","state":"Final","tcl-branch":"rmax-ipv6-branch","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 162: IPv6 Sockets for Tcl","author":["Rafael Martínez Torres <[email protected]>","Donal K. Fellows <[email protected]>","Reinhard Max <[email protected]>"],"is-jest":false},
	"161":{"url":"./tip/161.md","created":"19-Oct-2003","post-history":"","state":"Final","tk-branch":"tip-161","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 161: Change Default for Menu's -tearoff Option to False","author":["Mark Roseman <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"160":{"url":"./tip/160.md","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, SL, AK","votes-against":"none","created":"17-Oct-2003","title":"# TIP 160: Improvements to Terminal and Serial Channel Handling","post-history":"","tcl-version":"8.7","vote":"Done","tcl-branch":"tip-160","votes-present":"FV","is-jest":false},
	"159":{"url":"./tip/159.md","tk-ticket":"815751","created":"01-Oct-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 159: Extending Tk 'wm' Command to Support Coloured Icons","author":["Georgios Petasis <[email protected]>"],"is-jest":false},
	"158":{"url":"./tip/158.md","tk-ticket":"797404","created":"20-Sep-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 158: Distinguish the two 'Enter' keys on Windows","discussions-to":"news:comp.lang.tcl","author":["Wolfgang Großbauer <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"157":{"url":"./tip/157.md","obsoletes":"144","created":"20-Sep-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 157: Argument Expansion with Leading {expand}","author":["Kevin B. Kenny <[email protected]>","Peter Spjuth <[email protected]>","Donal K. Fellows <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"156":{"url":"./tip/156.md","tcl-ticket":"809825","created":"20-Sep-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 156: Language-Neutral Root Locale for Msgcat","discussions-to":"news:comp.lang.tcl","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"155":{"url":"./tip/155.md","tk-ticket":"791292","created":"08-Sep-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 155: Fix Some of the Text Widget's Limitations","author":["Vince Darley <[email protected]>"],"is-jest":false},
	"154":{"url":"./tip/154.md","created":"03-Sep-2003","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 154: Add Named Colors to Tk","author":["Damon Courtney <[email protected]>"],"is-jest":false},
	"153":{"url":"./tip/153.md","created":"26-Aug-2003","post-history":"","state":"Final","implementation-url":"http://www.eecs.umich.edu/~mckay/computer/winfotop.patch","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 153: Enhancing the [winfo toplevel] Command","author":["Neil McKay <[email protected]>"],"is-jest":false},
	"152":{"url":"./tip/152.md","keywords":"Tk","obsoletes":"25","created":"26-Aug-2003","post-history":"","state":"Final","implementation-url":"http://hem.fyristorg.com/matben/download/MovableAlerts.dmg","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 152: New -detail Option for tk_messageBox","author":["Mats Bengtsson <[email protected]>"],"is-jest":false},
	"151":{"url":"./tip/151.md","created":"22-Aug-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 151: Remove -e: Command Line Option from tclsh and wish","author":["Don Porter <[email protected]>","Don Porter <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"150":{"url":"./tip/150.md","created":"25-Jul-2003","keywords":"tk, send","post-history":"","state":"Deferred","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 150: Implement the Tk send Command for Windows","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"149":{"url":"./tip/149.md","created":"13-Aug-2003","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 149: Allow \"enabled\" as Synonym for \"normal\" in -state Option","author":["Michael A. Cleverly <[email protected]>"],"is-jest":false},
	"148":{"url":"./tip/148.md","tcl-ticket":"489537","created":"08-Aug-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 148: Correct [list]-Quoting of the '#' Character","author":["Don Porter <[email protected]>"],"is-jest":false},
	"147":{"url":"./tip/147.md","tk-ticket":"659218","created":"05-Aug-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 147: Make Grid's Column/Row Configure Easier","author":["Peter Spjuth <[email protected]>"],"is-jest":false},
	"146":{"url":"./tip/146.md","created":"05-Aug-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 146: Add Overall Anchoring to the Grid Geometry Manager","author":["Peter Spjuth <[email protected]>"],"is-jest":false},
	"145":{"url":"./tip/145.md","tk-ticket":"780617","obsoletes":"64","created":"31-Jul-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 145: Enhanced Tk Font Handling","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"144":{"url":"./tip/144.md","created":"26-Jul-2003","obsoleted-by":"157","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 144: Argument Expansion Syntax","author":["Peter Spjuth <[email protected]>","Donal K. Fellows <[email protected]>","<[email protected]>"],"is-jest":false},
	"143":{"url":"./tip/143.md","tcl-ticket":"926771","created":"25-Jul-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 143: An Interpreter Resource Limiting Framework","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"142":{"url":"./tip/142.md","keywords":"namespace, command lookup, search path","created":"23-Jul-2003","post-history":"","state":"Withdrawn","vote":"Pending","type":"Project","tcl-version":"8.5","title":"# TIP 142: Search Path Variable to Lookup Command Names in Namespaces","author":["Ulrich Schoebel <[email protected]>"],"is-jest":false},
	"141":{"url":"./tip/141.md","tk-ticket":"657656","created":"18-Jul-2003","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 141: Multiple Initial-Files in [tk_getOpenFile]","author":["David N. Welton <[email protected]>"],"is-jest":false},
	"140":{"url":"./tip/140.md","created":"04-Jun-2003","post-history":"","state":"Deferred","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 140: Tracing Namespace Modifications","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"139":{"url":"./tip/139.md","created":"03-Jun-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 139: Publish Part of Tcl's Namespace API","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"138":{"url":"./tip/138.md","tcl-ticket":"731356","keywords":"thread specific data, hash table, memory allocation","created":"29-May-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 138: New TCL_HASH_KEY_SYSTEM_HASH option for Tcl hash tables","author":["Kevin Kenny <[email protected]>","Joe Mistachkin <[email protected]>"],"is-jest":false},
	"137":{"url":"./tip/137.md","tcl-ticket":"742683","created":"29-May-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 137: Specifying Script Encodings for [source] and tclsh","author":["Anton Kovalenko <[email protected]>"],"is-jest":false},
	"136":{"url":"./tip/136.md","created":"25-May-2003","post-history":"","state":"Final","implementation-url":"http://homepage.ntlworld.com/whiteowl/tcl/tcl843-lrepeat.patch","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 136: Large List Initialisation","author":["Simon Geard <[email protected]>"],"is-jest":false},
	"135":{"url":"./tip/135.md","created":"17-May-2003","keywords":"dde","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 135: Change 'dde servername -exact' Option to -force","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"134":{"url":"./tip/134.md","created":"12-May-2003","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 134: Subsystem Per-Thread Data Interfaces","author":["Colin McCormack <[email protected]>"],"is-jest":false},
	"133":{"url":"./tip/133.md","created":"08-Apr-2003","post-history":"","state":"Draft","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 133: Extending [expr] Operators","author":["Richard Suchenwirth <[email protected]>"],"is-jest":false},
	"132":{"url":"./tip/132.md","keywords":"floating point,IEEE,precision","created":"31-Mar-2003","post-history":"","state":"Final","tcl-branch":"kennykb-numerics-branch","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 132: Revised Floating-Point Conversions in Tcl","author":["Kevin Kenny <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"131":{"url":"./tip/131.md","created":"01-Apr-2003","post-history":"","state":"Draft","tcl-version":"8.5","vote":"No voting","type":"Project","title":"# TIP 131: Read My Mind and Do What I Mean","author":["Joe English <[email protected]>"],"is-jest":true},
	"130":{"url":"./tip/130.md","tcl-ticket":"690354","created":"23-Mar-2003","post-history":"","state":"Final","vote":"Done","type":"Project","tcl-version":"8.5","title":"# TIP 130: Unique DDE server names.","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"129":{"url":"./tip/129.md","tcl-ticket":"858211","keywords":"IEEE,binary data,Tcl","created":"14-Mar-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 129: New Format Codes for the [binary] Command","author":["Arjen Markus <[email protected]>","Torsten Reincke <[email protected]>"],"is-jest":false},
	"128":{"url":"./tip/128.md","created":"13-Mar-2003","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 128: Ability to Install a Custom Memory Allocator","author":["Christophe Cap <[email protected]>","Mike Jackson <[email protected]>"],"is-jest":false},
	"127":{"url":"./tip/127.md","tcl-ticket":"693836","created":"26-Feb-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 127: Add an -index Option to [lsearch]","author":["Michael Schlenker <[email protected]>"],"is-jest":false},
	"126":{"url":"./tip/126.md","created":"30-Jan-2003","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.0","type":"Project","title":"# TIP 126: Rich Strings for Representation Persistence","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"125":{"url":"./tip/125.md","tk-ticket":"998125","keywords":"reparent,Tk","created":"20-Jan-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 125: Converting between Frame and Toplevel Windows","author":["Brian Griffin <[email protected]>","Donal K. Fellows <[email protected]>","Sacha Schär <[email protected]>"],"is-jest":false},
	"124":{"url":"./tip/124.md","tcl-ticket":"656997","created":"20-Dec-2002","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 124: High-Resolution Absolute Time Values From [clock]","author":["Mark Harrison <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"123":{"url":"./tip/123.md","tcl-ticket":"655176","keywords":"mathematics,evaluation","created":"16-Dec-2002","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 123: Adding an Exponentiation Operator to the [expr] Command","author":["Arjen Markus <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"122":{"url":"./tip/122.md","created":"12-Dec-2002","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 122: Use tcl_{non,}wordchars Throughout Tcl/Tk","author":["Martin Weber <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"121":{"url":"./tip/121.md","tcl-ticket":"649313","created":"05-Dec-2002","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 121: Controlled Application Shutdown via Tcl_Exit","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"120":{"url":"./tip/120.md","tcl-ticket":"649859","created":"04-Dec-2002","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 120: Restricted DDE Services","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"119":{"url":"./tip/119.md","tk-ticket":"1611359","created":"18-Nov-2002","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 119: Angled Text on a Canvas","author":["Simon Geard <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},







|
|





|





|

|







|


|












|



|









|



|


|






|







496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
	"200":{"url":"./tip/200.md","keywords":"Tcl","created":"20-May-2004","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 200: Listing the Values in an Array","author":["Donal K. Fellows <[email protected]>","Dossy Shiobara <[email protected]>"],"is-jest":false},
	"199":{"url":"./tip/199.md","keywords":"Tcl,Tk,shell,interactive","created":"12-May-2004","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 199: Specification of Alternatives to .wishrc/.tclshrc","author":["R. Timothy Edwards <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"198":{"url":"./tip/198.md","created":"12-May-2004","post-history":"","state":"Rejected","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 198: Image Command XPM Extension","author":["R. Timothy Edwards <[email protected]>","Don Porter <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"197":{"url":"./tip/197.md","keywords":"Tk","created":"12-May-2004","post-history":"","state":"Final","vote":"Done","tcl-version":"8.6","type":"Project","title":"# TIP 197: Unfocussed Text Widget Cursor Control","author":["R. Timothy Edwards <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"196":{"url":"./tip/196.md","created":"11-May-2004","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 196: Tcl Commands as Values","author":["Robert Suetterlin <[email protected]>"],"is-jest":false},
	"195":{"url":"./tip/195.md","tcl-ticket":"1040206","obsoletes":"105","keywords":"Tcl","created":"02-May-2004","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 195: A Unique Prefix Handling Command","author":["Peter Spjuth <[email protected]>","Peter Spjuth <[email protected]>"],"is-jest":false},
	"194":{"url":"./tip/194.md","tcl-ticket":"944803","keywords":"Tcl,lambda,anonymous,command,function,functional programming","created":"30-Apr-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 194: Procedures as Values via '''apply'''","author":["Miguel Sofer <[email protected]>","Joe Mistachkin <[email protected]>"],"is-jest":false},
	"193":{"url":"./tip/193.md","keywords":"Tcl","created":"29-Apr-2004","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 193: Simple Syntax Help System","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"192":{"url":"./tip/192.md","keywords":"Tcl","created":"27-Mar-2004","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 192: Lazy Lists","author":["Salvatore Sanfilippo <[email protected]>","Theo Verelst <[email protected]>"],"is-jest":false},
	"191":{"url":"./tip/191.md","created":"24-Mar-2004","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 191: Managing Tcl Packages and Modules in a Multi-Version Environment","author":["Andreas Kupries <[email protected]>","Joe English <[email protected]>","Larry Virden <[email protected]>"],"is-jest":false},
	"190":{"url":"./tip/190.md","created":"24-Mar-2004","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 190: Implementation Choices for Tcl Modules","author":["Andreas Kupries <[email protected]>","Jean-Claude Wippler <[email protected]>","Jeff Hobbs <[email protected]>"],"is-jest":false},
	"189":{"url":"./tip/189.md","tcl-ticket":"942881","created":"24-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 189: Tcl Modules","author":["Andreas Kupries <[email protected]>","Jean-Claude Wippler <[email protected]>","Jeff Hobbs <[email protected]>","Don Porter <[email protected]>","Larry W. Virden <[email protected]>","Daniel A. Steffen <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"188":{"url":"./tip/188.md","tcl-ticket":"940915","keywords":"Tcl","created":"23-Apr-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 188: Add 'string is wideinteger' to the 'string is' Subcommand","discussions-to":"news:comp.lang.tcl","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"187":{"url":"./tip/187.md","keywords":"Tcl,lambda,anonymous,command,function","created":"20-Apr-2004","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 187: Procedures as Values","author":["Salvatore Sanfilippo <[email protected]>","Miguel Sofer <[email protected]>","Paul Nash <[email protected]>"],"is-jest":false},
	"186":{"url":"./tip/186.md","keywords":"Tk","created":"16-Apr-2004","post-history":"","state":"Draft","implementation-url":"http://pdqi.com/configure.diff.gz","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 186: Expose the Type and Modified-State of Widget Options","author":["Peter MacDonald <[email protected]>","Peter MacDonald <[email protected]>"],"is-jest":false},
	"185":{"url":"./tip/185.md","keywords":"Tcl, absent value","created":"08-Apr-2004","post-history":"","state":"Rejected","vote":"Done","type":"Project","tcl-version":"8.6","title":"# TIP 185: Null Handling","author":["John H. Harris <[email protected]>"],"is-jest":false},
	"184":{"url":"./tip/184.md","tcl-ticket":"600812","keywords":"Tcl, upvar, global","created":"27-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 184: Avoid Creating Unusable Variables","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"183":{"url":"./tip/183.md","tcl-ticket":"577093","keywords":"Tcl","created":"24-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 183: Add a Binary Flag to [open]","author":["Andreas Leitgeb <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"182":{"url":"./tip/182.md","tcl-ticket":"1165062","created":"23-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 182: Add [expr bool] Math Function","author":["Joe Mistachkin <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"181":{"url":"./tip/181.md","tcl-ticket":"958222","created":"23-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 181: Add a [namespace unknown] Command","author":["Neil Madden <[email protected]>"],"is-jest":false},
	"180":{"url":"./tip/180.md","keywords":"Tk","created":"22-Mar-2003","post-history":"","state":"Draft","vote":"Pending","type":"Project","tcl-version":"9.1","title":"# TIP 180: Add a Megawidget Support Core Package","author":["Damon Courtney <[email protected]>"],"is-jest":false},
	"179":{"url":"./tip/179.md","keywords":"Tk","created":"22-Mar-2004","post-history":"","state":"Final","implementation-url":"ftp://ftp.model.com/pub/tcl/pw_hide_TIP.tgz","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 179: Add -hide Option to panedwindow Widget","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"178":{"url":"./tip/178.md","tcl-ticket":"920731ffffffffffffff","created":"21-Mar-2004","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 178: [info pid] and [info tid] Subcommands","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"177":{"url":"./tip/177.md","keywords":"Tk","created":"17-Mar-2004","post-history":"","state":"Final","implementation-url":"ftp://ftp.model.com/pub/tcl/pw_stretch_TIP.tgz","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 177: Add -stretch Option to panedwindow Widget","author":["Brian Griffin <[email protected]>"],"is-jest":false},
	"176":{"url":"./tip/176.md","tcl-ticket":"1165695","created":"16-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 176: Add String Index Values","author":["Damon Courtney <[email protected]>","Don Porter <[email protected]>","Damon Courtney <[email protected]>"],"is-jest":false},
	"175":{"url":"./tip/175.md","created":"15-Mar-2004","post-history":"","state":"Withdrawn","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 175: Add an -async Option to [open]","author":["Neil Madden <[email protected]>"],"is-jest":false},
	"174":{"url":"./tip/174.md","tcl-ticket":"1578137","created":"15-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 174: Math Operators as Commands","author":["Kristoffer Lawson <[email protected]>","Donal K. Fellows <[email protected]>","David S. Cargo <[email protected]>","Peter Spjuth <[email protected]>","Kevin B. Kenny <[email protected]>"],"is-jest":false},
	"173":{"url":"./tip/173.md","created":"11-Mar-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 173: Internationalisation and Refactoring of the 'clock' Command","discussions-to":"news:comp.lang.tcl","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"172":{"url":"./tip/172.md","created":"08-Mar-2004","obsoleted-by":"248","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"No voting","type":"Project","title":"# TIP 172: Improve UNIX Tk Look and Feel","author":["David N. Welton <[email protected]>"],"is-jest":false},
	"171":{"url":"./tip/171.md","created":"05-Mar-2004","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 171: Change Default <MouseWheel> Bindings Behavior","author":["Jeff Hobbs <[email protected]>","Keith Vetter <[email protected]>"],"is-jest":false},
	"170":{"url":"./tip/170.md","created":"30-Jan-2004","obsoleted-by":"157","post-history":"","state":"Draft","implementation-url":"http://nac.sf.net/","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 170: Better Support for Nested Lists","author":["Sergey Babkin <[email protected]>","Don Porter <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"169":{"url":"./tip/169.md","tk-ticket":"994629","created":"28-Jan-2004","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 169: Add Peer Text Widgets","author":["Brian Griffin <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"168":{"url":"./tip/168.md","tk-ticket":"886240","created":"25-Jan-2004","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 168: Cubic Bezier Curves on the Canvas","author":["Lars Hellström <[email protected]>"],"is-jest":false},
	"167":{"url":"./tip/167.md","state":"Rejected","vote-summary":"Rejected 1/2/1","type":"Project","tk-branch":"tip-167","author":["Ramon Ribó <[email protected]>"],"votes-for":"KW","votes-against":"FV, JN","created":"19-Nov-2003","title":"# TIP 167: Add a New Option for Context Help for Windows","post-history":"","vote":"Done","tcl-version":"9.0","votes-present":"SL","is-jest":false},
	"166":{"url":"./tip/166.md","keywords":"Tk,image get,image put","created":"19-Nov-2003","post-history":"","state":"Final","tk-branch":"tip-166","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 166: Reading and Writing the Photo Image Alpha Channel","author":["Donal K. Fellows <[email protected]>","Simon Bachmann <[email protected]>"],"is-jest":false},
	"165":{"url":"./tip/165.md","tk-ticket":"1008975","keywords":"Tk,substitution","created":"17-Nov-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 165: A User-Data Field for Virtual Events","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"164":{"url":"./tip/164.md","keywords":"Tk,canvas","state":"Final","type":"Project","tk-branch":"tip-164","author":["Arjen Markus <[email protected]>","Dimitrios Zachariadis <[email protected]>","Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, FV, SL, AK","votes-against":"none","created":"17-Nov-2003","title":"# TIP 164: Add Rotate Subcommand to the Canvas Widget","post-history":"","vote":"Done","tcl-version":"8.7","votes-present":"none","is-jest":false},
	"163":{"url":"./tip/163.md","tcl-ticket":"745851","created":"14-Nov-2003","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 163: A [dict merge] Subcommand","author":["Joe English <[email protected]>"],"is-jest":false},
	"162":{"url":"./tip/162.md","created":"23-Oct-2003","post-history":"","state":"Final","tcl-branch":"rmax-ipv6-branch","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 162: IPv6 Sockets for Tcl","author":["Rafael Martínez Torres <[email protected]>","Donal K. Fellows <[email protected]>","Reinhard Max <[email protected]>"],"is-jest":false},
	"161":{"url":"./tip/161.md","created":"19-Oct-2003","post-history":"","state":"Final","tk-branch":"tip-161","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 161: Change Default for Menu's -tearoff Option to False","author":["Mark Roseman <[email protected]>","François Vogel <[email protected]>"],"is-jest":false},
	"160":{"url":"./tip/160.md","state":"Final","type":"Project","author":["Donal K. Fellows <[email protected]>"],"votes-for":"DKF, JN, SL, AK","votes-against":"none","created":"17-Oct-2003","title":"# TIP 160: Improvements to Terminal and Serial Channel Handling","post-history":"","tcl-version":"8.7","vote":"Done","tcl-branch":"tip-160","votes-present":"FV","is-jest":false},
	"159":{"url":"./tip/159.md","tk-ticket":"815751","created":"01-Oct-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 159: Extending Tk 'wm' Command to Support Coloured Icons","author":["Georgios Petasis <[email protected]>"],"is-jest":false},
	"158":{"url":"./tip/158.md","tk-ticket":"797404","created":"20-Sep-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 158: Distinguish the two 'Enter' keys on Windows","discussions-to":"news:comp.lang.tcl","author":["Wolfgang Großbauer <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"157":{"url":"./tip/157.md","obsoletes":"144","created":"20-Sep-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 157: Argument Expansion with Leading {expand}","author":["Kevin B. Kenny <[email protected]>","Peter Spjuth <[email protected]>","Donal K. Fellows <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"156":{"url":"./tip/156.md","tcl-ticket":"809825","created":"20-Sep-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 156: Language-Neutral Root Locale for Msgcat","discussions-to":"news:comp.lang.tcl","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"155":{"url":"./tip/155.md","tk-ticket":"791292","created":"08-Sep-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 155: Fix Some of the Text Widget's Limitations","author":["Vince Darley <[email protected]>"],"is-jest":false},
	"154":{"url":"./tip/154.md","created":"03-Sep-2003","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 154: Add Named Colors to Tk","author":["Damon Courtney <[email protected]>"],"is-jest":false},
	"153":{"url":"./tip/153.md","created":"26-Aug-2003","post-history":"","state":"Final","implementation-url":"http://www.eecs.umich.edu/~mckay/computer/winfotop.patch","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 153: Enhancing the [winfo toplevel] Command","author":["Neil McKay <[email protected]>"],"is-jest":false},
	"152":{"url":"./tip/152.md","keywords":"Tk","obsoletes":"25","created":"26-Aug-2003","post-history":"","state":"Final","implementation-url":"http://hem.fyristorg.com/matben/download/MovableAlerts.dmg","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 152: New -detail Option for tk_messageBox","author":["Mats Bengtsson <[email protected]>"],"is-jest":false},
	"151":{"url":"./tip/151.md","created":"22-Aug-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 151: Remove -e: Command Line Option from tclsh and wish","author":["Don Porter <[email protected]>","Don Porter <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"150":{"url":"./tip/150.md","created":"25-Jul-2003","keywords":"tk, send","post-history":"","state":"Deferred","tcl-version":"8.7","vote":"Done","type":"Project","title":"# TIP 150: Implement the Tk send Command for Windows","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"149":{"url":"./tip/149.md","created":"13-Aug-2003","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 149: Allow \"enabled\" as Synonym for \"normal\" in -state Option","author":["Michael A. Cleverly <[email protected]>"],"is-jest":false},
	"148":{"url":"./tip/148.md","tcl-ticket":"489537","created":"08-Aug-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 148: Correct [list]-Quoting of the '#' Character","author":["Don Porter <[email protected]>"],"is-jest":false},
	"147":{"url":"./tip/147.md","tk-ticket":"659218","created":"05-Aug-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 147: Make Grid's Column/Row Configure Easier","author":["Peter Spjuth <[email protected]>"],"is-jest":false},
	"146":{"url":"./tip/146.md","created":"05-Aug-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 146: Add Overall Anchoring to the Grid Geometry Manager","author":["Peter Spjuth <[email protected]>"],"is-jest":false},
	"145":{"url":"./tip/145.md","tk-ticket":"780617","obsoletes":"64","created":"31-Jul-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 145: Enhanced Tk Font Handling","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"144":{"url":"./tip/144.md","created":"26-Jul-2003","obsoleted-by":"157","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 144: Argument Expansion Syntax","author":["Peter Spjuth <[email protected]>","Donal K. Fellows <[email protected]>","<[email protected]>"],"is-jest":false},
	"143":{"url":"./tip/143.md","tcl-ticket":"926771","created":"25-Jul-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 143: An Interpreter Resource Limiting Framework","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"142":{"url":"./tip/142.md","keywords":"namespace, command lookup, search path","created":"23-Jul-2003","post-history":"","state":"Withdrawn","vote":"Pending","type":"Project","tcl-version":"8.5","title":"# TIP 142: Search Path Variable to Lookup Command Names in Namespaces","author":["Ulrich Schoebel <[email protected]>"],"is-jest":false},
	"141":{"url":"./tip/141.md","tk-ticket":"657656","created":"18-Jul-2003","post-history":"","state":"Final","vote":"Done","tcl-version":"8.5","type":"Project","title":"# TIP 141: Multiple Initial-Files in [tk_getOpenFile]","author":["David N. Welton <[email protected]>"],"is-jest":false},
	"140":{"url":"./tip/140.md","created":"04-Jun-2003","post-history":"","state":"Deferred","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 140: Tracing Namespace Modifications","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"139":{"url":"./tip/139.md","created":"03-Jun-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 139: Publish Part of Tcl's Namespace API","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"138":{"url":"./tip/138.md","tcl-ticket":"731356","keywords":"thread specific data, hash table, memory allocation","created":"29-May-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 138: New TCL_HASH_KEY_SYSTEM_HASH option for Tcl hash tables","author":["Kevin Kenny <[email protected]>","Joe Mistachkin <[email protected]>"],"is-jest":false},
	"137":{"url":"./tip/137.md","tcl-ticket":"742683","created":"29-May-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 137: Specifying Script Encodings for [source] and tclsh","author":["Anton Kovalenko <[email protected]>"],"is-jest":false},
	"136":{"url":"./tip/136.md","obsoletes":"170","created":"25-May-2003","post-history":"","state":"Final","implementation-url":"http://homepage.ntlworld.com/whiteowl/tcl/tcl843-lrepeat.patch","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 136: Large List Initialisation","author":["Simon Geard <[email protected]>"],"is-jest":false},
	"135":{"url":"./tip/135.md","created":"17-May-2003","keywords":"dde","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 135: Change 'dde servername -exact' Option to -force","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"134":{"url":"./tip/134.md","created":"12-May-2003","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 134: Subsystem Per-Thread Data Interfaces","author":["Colin McCormack <[email protected]>"],"is-jest":false},
	"133":{"url":"./tip/133.md","created":"08-Apr-2003","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 133: Extending [expr] Operators","author":["Richard Suchenwirth <[email protected]>"],"is-jest":false},
	"132":{"url":"./tip/132.md","keywords":"floating point,IEEE,precision","created":"31-Mar-2003","post-history":"","state":"Final","tcl-branch":"kennykb-numerics-branch","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 132: Revised Floating-Point Conversions in Tcl","author":["Kevin Kenny <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"131":{"url":"./tip/131.md","created":"01-Apr-2003","post-history":"","state":"Draft","tcl-version":"8.5","vote":"No voting","type":"Project","title":"# TIP 131: Read My Mind and Do What I Mean","author":["Joe English <[email protected]>"],"is-jest":true},
	"130":{"url":"./tip/130.md","tcl-ticket":"690354","created":"23-Mar-2003","post-history":"","state":"Final","vote":"Done","type":"Project","tcl-version":"8.5","title":"# TIP 130: Unique DDE server names.","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"129":{"url":"./tip/129.md","tcl-ticket":"858211","keywords":"IEEE,binary data,Tcl","created":"14-Mar-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 129: New Format Codes for the [binary] Command","author":["Arjen Markus <[email protected]>","Torsten Reincke <[email protected]>"],"is-jest":false},
	"128":{"url":"./tip/128.md","created":"13-Mar-2003","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 128: Ability to Install a Custom Memory Allocator","author":["Christophe Cap <[email protected]>","Mike Jackson <[email protected]>"],"is-jest":false},
	"127":{"url":"./tip/127.md","tcl-ticket":"693836","created":"26-Feb-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 127: Add an -index Option to [lsearch]","author":["Michael Schlenker <[email protected]>"],"is-jest":false},
	"126":{"url":"./tip/126.md","created":"30-Jan-2003","post-history":"","state":"Draft","vote":"Pending","tcl-version":"9.1","type":"Project","title":"# TIP 126: Rich Strings for Representation Persistence","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"125":{"url":"./tip/125.md","tk-ticket":"998125","keywords":"reparent,Tk","created":"20-Jan-2003","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 125: Converting between Frame and Toplevel Windows","author":["Brian Griffin <[email protected]>","Donal K. Fellows <[email protected]>","Sacha Schär <[email protected]>"],"is-jest":false},
	"124":{"url":"./tip/124.md","tcl-ticket":"656997","created":"20-Dec-2002","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 124: High-Resolution Absolute Time Values From [clock]","author":["Mark Harrison <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"123":{"url":"./tip/123.md","tcl-ticket":"655176","keywords":"mathematics,evaluation","created":"16-Dec-2002","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 123: Adding an Exponentiation Operator to the [expr] Command","author":["Arjen Markus <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"122":{"url":"./tip/122.md","created":"12-Dec-2002","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 122: Use tcl_{non,}wordchars Throughout Tcl/Tk","author":["Martin Weber <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"121":{"url":"./tip/121.md","tcl-ticket":"649313","created":"05-Dec-2002","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 121: Controlled Application Shutdown via Tcl_Exit","author":["Joe Mistachkin <[email protected]>"],"is-jest":false},
	"120":{"url":"./tip/120.md","tcl-ticket":"649859","created":"04-Dec-2002","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 120: Restricted DDE Services","author":["Pat Thoyts <[email protected]>"],"is-jest":false},
	"119":{"url":"./tip/119.md","tk-ticket":"1611359","created":"18-Nov-2002","post-history":"","state":"Final","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 119: Angled Text on a Canvas","author":["Simon Geard <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
	"93":{"url":"./tip/93.md","created":"28-Dec-2001","post-history":"","state":"Final","implementation-url":"http://faqchest.dynhost.com/prgm/ptk-l/ptk-01/ptk-0112/ptk-011201/ptk01122716_24437.html","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 93: Get/Delete Enhancement for the Tk Text Widget","author":["Craig Votava <[email protected]>","Donal K. Fellows <[email protected]>","Jeff Hobbs <[email protected]>"],"is-jest":false},
	"92":{"url":"./tip/92.md","keywords":"package require, namespace, pkg_mkIndex","created":"13-May-2002","post-history":"","state":"Withdrawn","tcl-version":"8.4","vote":"Pending","type":"Project","title":"# TIP 92: Move Package Load Decisions to Application Developer","author":["Clif Flynt <[email protected]>"],"is-jest":false},
	"91":{"url":"./tip/91.md","created":"03-May-2002","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 91: Backward Compatibility for Channel Types with 32-bit SeekProcs","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"90":{"url":"./tip/90.md","tcl-ticket":"531640","created":"15-Mar-2002","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 90: Enable [return -code] in Control Structure Procs","author":["Don Porter <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"89":{"url":"./tip/89.md","created":"11-Mar-2002","obsoleted-by":"329","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 89: Try/Catch Exception Handling in the Core","discussions-to":"news:comp.lang.tcl","author":["Tom Wilkason <[email protected]>","Frank Pilhofer <[email protected]>"],"is-jest":false},
	"88":{"url":"./tip/88.md","created":"11-Mar-2002","obsoleted-by":"240","post-history":"","state":"Rejected","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 88: Extend Tcl Process Id Control via 'pid'","author":["Jeff Hobbs <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"87":{"url":"./tip/87.md","tcl-ticket":"522849","keywords":"Tcl_SetRecusionLimit,recursion limit","created":"19-Feb-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 87: Allow Tcl Access to the Recursion Limit","discussions-to":"news:comp.lang.tcl","author":["Stephen Trier <[email protected]>","Richard Suchenwirth <[email protected]>"],"is-jest":false},
	"86":{"url":"./tip/86.md","created":"08-Feb-2002","post-history":"","state":"Draft","implementation-url":"http://pdqi.com/download/tclline-8.4.9.diff.gz","tcl-version":"8.7","vote":"Pending","type":"Project","title":"# TIP 86: Improved Debugger Support","author":["Peter MacDonald <[email protected]>","Peter MacDonald <[email protected]>"],"is-jest":false},
	"85":{"url":"./tip/85.md","tcl-ticket":"521362","keywords":"test,string comparison,floating-point","created":"31-Jan-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 85: Custom Comparisons in Tcltest","author":["Arjen Markus <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"84":{"url":"./tip/84.md","tk-ticket":"564642","created":"26-Feb-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 84: Add control for mouse movement filtering","author":["Jyrki Alakuijala <[email protected]>","Jeff Hobbs <[email protected]>"],"is-jest":false},
	"83":{"url":"./tip/83.md","created":"24-Jan-2002","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 83: Augment Tcl_EvalFile with Tcl_EvalChannel and Tcl_EvalUrl","author":["Marian Szczepkowski <[email protected]>","<[email protected]>"],"is-jest":false},
	"82":{"url":"./tip/82.md","created":"10-Jan-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 82: Add -offrelief Option to Checkbutton and Radiobutton","author":["D. Richard Hipp <[email protected]>"],"is-jest":false},
	"81":{"url":"./tip/81.md","created":"07-Jan-2002","post-history":"","state":"Withdrawn","vote":"Pending","type":"Process","title":"# TIP 81: [incr Tcl] Functional Areas for Maintainer Assignments","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"80":{"url":"./tip/80.md","created":"02-Jan-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 80: Additional Options for 'lsearch'","discussions-to":"news:comp.lang.tcl","author":["Tom Wilkason <[email protected]>","Tom Wilkason <[email protected]>"],"is-jest":false},
	"79":{"url":"./tip/79.md","keywords":"trace,Tcl_Obj","created":"03-Jan-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 79: Add Deletion Callback to Tcl_CreateObjTrace","discussions-to":"news:comp.lang.tcl","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"78":{"url":"./tip/78.md","created":"15-Dec-2001","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 78: TEA 2.0 Definitions","author":["Andreas Kupries <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"77":{"url":"./tip/77.md","created":"07-Dec-2001","post-history":"","obsoleted-by":"111","state":"Withdrawn","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 77: Support for Nested Paired Item Lists","author":["Christian Williams <[email protected]>"],"is-jest":false},
	"76":{"url":"./tip/76.md","created":"29-Nov-2001","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 76: Make 'regsub' Return a String","author":["Bruce Hartweg <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"75":{"url":"./tip/75.md","tcl-ticket":"848578","keywords":"switch,regexp,parentheses","created":"28-Nov-2001","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 75: Refer to Sub-RegExps Inside 'switch -regexp' Bodies","discussions-to":"http://purl.org/mini/cgi-bin/chat.cgi","author":["Donal K. Fellows <[email protected]>","János Holányi <[email protected]>","Salvatore Sanfilippo <[email protected]>"],"is-jest":false},
	"74":{"url":"./tip/74.md","tk-ticket":"481148","created":"12-Nov-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 74: wm stackorder command","author":["Mo DeJong <[email protected]>"],"is-jest":false},
	"73":{"url":"./tip/73.md","created":"03-Nov-2001","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 73: Export Tcl_GetTime in the Public API","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"72":{"url":"./tip/72.md","created":"05-Nov-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 72: 64-Bit Value Support for Tcl on 32-Bit Platforms","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"71":{"url":"./tip/71.md","created":"26-Oct-2001","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 71: Tk Bitmap Image Improvements","author":["Chris Nelson <[email protected]>","Kevin Kenny <[email protected]>","Eric Melski <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"70":{"url":"./tip/70.md","created":"20-Oct-2001","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 70: A Relational Switch Control Structure","author":["Bhushit Joshipura <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"69":{"url":"./tip/69.md","created":"16-Oct-2001","post-history":"","state":"Draft","tcl-version":"9.0","vote":"Pending","type":"Project","title":"# TIP 69: Improvements for the Tcl Hash Table","discussions-to":"news:comp.lang.tcl","author":["George A. Howlett <[email protected]>","Don Porter <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"68":{"url":"./tip/68.md","created":"16-Oct-2001","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 68: Dynamic Trace Result Handling","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"67":{"url":"./tip/67.md","created":"09-Oct-2001","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 67: Allow Subclassing of tk_getOpenFile, tk_getSaveFile on UNIX","author":["Chris Nelson <[email protected]>","Al Zielaskowski <[email protected]>"],"is-jest":false},
	"66":{"url":"./tip/66.md","keywords":"installation,initialisation,embedded,resources","created":"02-Oct-2001","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 66: Stand-alone and Embedded Tcl/Tk Applications","author":["Arjen Markus <[email protected]>"],"is-jest":false},
	"65":{"url":"./tip/65.md","created":"18-Sep-2001","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 65: Enhanced [info args]","author":["Glenn Jackman <[email protected]>","Don Porter <[email protected]>","Glenn Jackman <[email protected]>"],"is-jest":false},
	"64":{"url":"./tip/64.md","created":"27-Sep-2001","obsoleted-by":"145","post-history":"","state":"Deferred","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 64: Improvements to Windows Font Handling","author":["Chris Nelson <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"63":{"url":"./tip/63.md","created":"27-Sep-2001","post-history":"","state":"Final","implementation-url":"ftp://ftp.ucsd.edu/pub/alpha/tcl/compoundmenu.diff","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 63: Add -compound Option to Menu Entries","author":["Vince Darley <[email protected]>"],"is-jest":false},
	"62":{"url":"./tip/62.md","created":"18-Sep-2001","post-history":"","state":"Final","implementation-url":"http://www.employees.org/~hlavana/tcl/","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 62: Add Support for Command Tracing","author":["Hemang Lavana <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"61":{"url":"./tip/61.md","created":"12-Sep-2001","post-history":"","state":"Deferred","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 61: Make TK_NO_SECURITY Run-Time Switchable","author":["Jeff Hobbs <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"60":{"url":"./tip/60.md","created":"06-Sep-2001","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 60: EXTERN Macro Change to Support a Wider Set of Attributes","author":["David Gravereaux <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"59":{"url":"./tip/59.md","tcl-ticket":"507083","created":"04-Sep-2001","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 59: Embed Build Information in Tcl Binary Library","author":["Andreas Kupries <[email protected]>"],"is-jest":false},
	"58":{"url":"./tip/58.md","created":"02-Sep-2001","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 58: Extend [set] to Assign Multiple Values to Multiple Variables","author":["Anselm Lingnau <[email protected]>"],"is-jest":false},
	"57":{"url":"./tip/57.md","created":"30-Aug-2001","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 57: Move TclX's [lassign] into the Tcl Core","author":["Donal K. Fellows <[email protected]>","Agnar Renolen <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"56":{"url":"./tip/56.md","tcl-ticket":"455151","created":"28-Aug-2001","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 56: Standardize Call Interface to Tcl_Eval* Functions","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"55":{"url":"./tip/55.md","created":"16-Aug-2001","post-history":"","state":"Draft","vote":"No voting","type":"Informative","title":"# TIP 55: Package Format for Tcl Extensions","author":["Steve Cassidy <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"54":{"url":"./tip/54.md","created":"16-Aug-2001","post-history":"","state":"Withdrawn","vote":"Pending","type":"Process","title":"# TIP 54: Using PURLs to Unite the Tcl Webspace","author":["Andreas Kupries <[email protected]>","Jeff Hobbs <[email protected]>"],"is-jest":false},
	"53":{"url":"./tip/53.md","keywords":"bytecode,compiler","created":"14-Aug-2001","post-history":"","state":"Withdrawn","tcl-version":"8.4","vote":"Pending","type":"Project","title":"# TIP 53: Addition of 'assert' Command","author":["Gerald W. Lester <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"52":{"url":"./tip/52.md","keywords":"namespace,lookup,hierarchy","created":"09-Aug-2001","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 52: Hierarchical Namespace Lookup of Commands and Variables","discussions-to":"news:comp.lang.tcl","author":["David Cuthbert <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"51":{"url":"./tip/51.md","created":"04-Aug-2001","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 51: Native Menubutton on Macintosh","author":["Mats Bengtsson <[email protected]>"],"is-jest":false},
	"50":{"url":"./tip/50.md","created":"27-Jul-2001","post-history":"","state":"Final","vote":"Done","type":"Informative","title":"# TIP 50: Bundle [incr Tcl] with the Core Tcl distribution","author":["Kevin Kenny <[email protected]>","Mark Harrison <[email protected]>","Jeff Hobbs <[email protected]>","Andreas Kupries <[email protected]>","Karl Lehenbauer <[email protected]>","Michael McLennan <[email protected]>","Don Porter <[email protected]>","Brent Welch <[email protected]>"],"is-jest":false},







|
















|











|







603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
	"93":{"url":"./tip/93.md","created":"28-Dec-2001","post-history":"","state":"Final","implementation-url":"http://faqchest.dynhost.com/prgm/ptk-l/ptk-01/ptk-0112/ptk-011201/ptk01122716_24437.html","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 93: Get/Delete Enhancement for the Tk Text Widget","author":["Craig Votava <[email protected]>","Donal K. Fellows <[email protected]>","Jeff Hobbs <[email protected]>"],"is-jest":false},
	"92":{"url":"./tip/92.md","keywords":"package require, namespace, pkg_mkIndex","created":"13-May-2002","post-history":"","state":"Withdrawn","tcl-version":"8.4","vote":"Pending","type":"Project","title":"# TIP 92: Move Package Load Decisions to Application Developer","author":["Clif Flynt <[email protected]>"],"is-jest":false},
	"91":{"url":"./tip/91.md","created":"03-May-2002","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 91: Backward Compatibility for Channel Types with 32-bit SeekProcs","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"90":{"url":"./tip/90.md","tcl-ticket":"531640","created":"15-Mar-2002","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 90: Enable [return -code] in Control Structure Procs","author":["Don Porter <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"89":{"url":"./tip/89.md","created":"11-Mar-2002","obsoleted-by":"329","post-history":"","state":"Withdrawn","tcl-version":"8.6","vote":"Pending","type":"Project","title":"# TIP 89: Try/Catch Exception Handling in the Core","discussions-to":"news:comp.lang.tcl","author":["Tom Wilkason <[email protected]>","Frank Pilhofer <[email protected]>"],"is-jest":false},
	"88":{"url":"./tip/88.md","created":"11-Mar-2002","obsoleted-by":"240","post-history":"","state":"Rejected","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 88: Extend Tcl Process Id Control via 'pid'","author":["Jeff Hobbs <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"87":{"url":"./tip/87.md","tcl-ticket":"522849","keywords":"Tcl_SetRecusionLimit,recursion limit","created":"19-Feb-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 87: Allow Tcl Access to the Recursion Limit","discussions-to":"news:comp.lang.tcl","author":["Stephen Trier <[email protected]>","Richard Suchenwirth <[email protected]>"],"is-jest":false},
	"86":{"url":"./tip/86.md","created":"08-Feb-2002","post-history":"","state":"Draft","implementation-url":"http://pdqi.com/download/tclline-8.4.9.diff.gz","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 86: Improved Debugger Support","author":["Peter MacDonald <[email protected]>","Peter MacDonald <[email protected]>"],"is-jest":false},
	"85":{"url":"./tip/85.md","tcl-ticket":"521362","keywords":"test,string comparison,floating-point","created":"31-Jan-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 85: Custom Comparisons in Tcltest","author":["Arjen Markus <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"84":{"url":"./tip/84.md","tk-ticket":"564642","created":"26-Feb-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 84: Add control for mouse movement filtering","author":["Jyrki Alakuijala <[email protected]>","Jeff Hobbs <[email protected]>"],"is-jest":false},
	"83":{"url":"./tip/83.md","created":"24-Jan-2002","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 83: Augment Tcl_EvalFile with Tcl_EvalChannel and Tcl_EvalUrl","author":["Marian Szczepkowski <[email protected]>","<[email protected]>"],"is-jest":false},
	"82":{"url":"./tip/82.md","created":"10-Jan-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 82: Add -offrelief Option to Checkbutton and Radiobutton","author":["D. Richard Hipp <[email protected]>"],"is-jest":false},
	"81":{"url":"./tip/81.md","created":"07-Jan-2002","post-history":"","state":"Withdrawn","vote":"Pending","type":"Process","title":"# TIP 81: [incr Tcl] Functional Areas for Maintainer Assignments","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"80":{"url":"./tip/80.md","created":"02-Jan-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 80: Additional Options for 'lsearch'","discussions-to":"news:comp.lang.tcl","author":["Tom Wilkason <[email protected]>","Tom Wilkason <[email protected]>"],"is-jest":false},
	"79":{"url":"./tip/79.md","keywords":"trace,Tcl_Obj","created":"03-Jan-2002","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 79: Add Deletion Callback to Tcl_CreateObjTrace","discussions-to":"news:comp.lang.tcl","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"78":{"url":"./tip/78.md","created":"15-Dec-2001","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 78: TEA 2.0 Definitions","author":["Andreas Kupries <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"77":{"url":"./tip/77.md","created":"07-Dec-2001","post-history":"","obsoleted-by":"111","state":"Withdrawn","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 77: Support for Nested Paired Item Lists","author":["Christian Williams <[email protected]>"],"is-jest":false},
	"76":{"url":"./tip/76.md","created":"29-Nov-2001","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 76: Make 'regsub' Return a String","author":["Bruce Hartweg <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"75":{"url":"./tip/75.md","tcl-ticket":"848578","keywords":"switch,regexp,parentheses","created":"28-Nov-2001","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 75: Refer to Sub-RegExps Inside 'switch -regexp' Bodies","discussions-to":"http://purl.org/mini/cgi-bin/chat.cgi","author":["Donal K. Fellows <[email protected]>","János Holányi <[email protected]>","Salvatore Sanfilippo <[email protected]>"],"is-jest":false},
	"74":{"url":"./tip/74.md","tk-ticket":"481148","created":"12-Nov-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 74: wm stackorder command","author":["Mo DeJong <[email protected]>"],"is-jest":false},
	"73":{"url":"./tip/73.md","created":"03-Nov-2001","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 73: Export Tcl_GetTime in the Public API","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"72":{"url":"./tip/72.md","created":"05-Nov-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 72: 64-Bit Value Support for Tcl on 32-Bit Platforms","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"71":{"url":"./tip/71.md","created":"26-Oct-2001","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 71: Tk Bitmap Image Improvements","author":["Chris Nelson <[email protected]>","Kevin Kenny <[email protected]>","Eric Melski <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"70":{"url":"./tip/70.md","created":"20-Oct-2001","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 70: A Relational Switch Control Structure","author":["Bhushit Joshipura <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"69":{"url":"./tip/69.md","created":"16-Oct-2001","post-history":"","state":"Draft","tcl-version":"9.1","vote":"Pending","type":"Project","title":"# TIP 69: Improvements for the Tcl Hash Table","discussions-to":"news:comp.lang.tcl","author":["George A. Howlett <[email protected]>","Don Porter <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"68":{"url":"./tip/68.md","created":"16-Oct-2001","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 68: Dynamic Trace Result Handling","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"67":{"url":"./tip/67.md","created":"09-Oct-2001","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 67: Allow Subclassing of tk_getOpenFile, tk_getSaveFile on UNIX","author":["Chris Nelson <[email protected]>","Al Zielaskowski <[email protected]>"],"is-jest":false},
	"66":{"url":"./tip/66.md","keywords":"installation,initialisation,embedded,resources","created":"02-Oct-2001","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 66: Stand-alone and Embedded Tcl/Tk Applications","author":["Arjen Markus <[email protected]>"],"is-jest":false},
	"65":{"url":"./tip/65.md","created":"18-Sep-2001","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 65: Enhanced [info args]","author":["Glenn Jackman <[email protected]>","Don Porter <[email protected]>","Glenn Jackman <[email protected]>"],"is-jest":false},
	"64":{"url":"./tip/64.md","created":"27-Sep-2001","obsoleted-by":"145","post-history":"","state":"Deferred","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 64: Improvements to Windows Font Handling","author":["Chris Nelson <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"63":{"url":"./tip/63.md","created":"27-Sep-2001","post-history":"","state":"Final","implementation-url":"ftp://ftp.ucsd.edu/pub/alpha/tcl/compoundmenu.diff","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 63: Add -compound Option to Menu Entries","author":["Vince Darley <[email protected]>"],"is-jest":false},
	"62":{"url":"./tip/62.md","created":"18-Sep-2001","post-history":"","state":"Final","implementation-url":"http://www.employees.org/~hlavana/tcl/","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 62: Add Support for Command Tracing","author":["Hemang Lavana <[email protected]>","Vince Darley <[email protected]>"],"is-jest":false},
	"61":{"url":"./tip/61.md","created":"12-Sep-2001","post-history":"","state":"Deferred","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 61: Make TK_NO_SECURITY Run-Time Switchable","author":["Jeff Hobbs <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"60":{"url":"./tip/60.md","created":"06-Sep-2001","post-history":"","state":"Rejected","tcl-version":"8.6","vote":"Done","type":"Project","title":"# TIP 60: EXTERN Macro Change to Support a Wider Set of Attributes","author":["David Gravereaux <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"59":{"url":"./tip/59.md","tcl-ticket":"507083","created":"04-Sep-2001","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 59: Embed Build Information in Tcl Binary Library","author":["Andreas Kupries <[email protected]>"],"is-jest":false},
	"58":{"url":"./tip/58.md","created":"02-Sep-2001","post-history":"","state":"Rejected","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 58: Extend [set] to Assign Multiple Values to Multiple Variables","author":["Anselm Lingnau <[email protected]>"],"is-jest":false},
	"57":{"url":"./tip/57.md","obsoletes":"170","created":"30-Aug-2001","post-history":"","state":"Final","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 57: Move TclX's [lassign] into the Tcl Core","author":["Donal K. Fellows <[email protected]>","Agnar Renolen <[email protected]>","Don Porter <[email protected]>"],"is-jest":false},
	"56":{"url":"./tip/56.md","tcl-ticket":"455151","created":"28-Aug-2001","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 56: Standardize Call Interface to Tcl_Eval* Functions","author":["Miguel Sofer <[email protected]>"],"is-jest":false},
	"55":{"url":"./tip/55.md","created":"16-Aug-2001","post-history":"","state":"Draft","vote":"No voting","type":"Informative","title":"# TIP 55: Package Format for Tcl Extensions","author":["Steve Cassidy <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"54":{"url":"./tip/54.md","created":"16-Aug-2001","post-history":"","state":"Withdrawn","vote":"Pending","type":"Process","title":"# TIP 54: Using PURLs to Unite the Tcl Webspace","author":["Andreas Kupries <[email protected]>","Jeff Hobbs <[email protected]>"],"is-jest":false},
	"53":{"url":"./tip/53.md","keywords":"bytecode,compiler","created":"14-Aug-2001","post-history":"","state":"Withdrawn","tcl-version":"8.4","vote":"Pending","type":"Project","title":"# TIP 53: Addition of 'assert' Command","author":["Gerald W. Lester <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"52":{"url":"./tip/52.md","keywords":"namespace,lookup,hierarchy","created":"09-Aug-2001","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 52: Hierarchical Namespace Lookup of Commands and Variables","discussions-to":"news:comp.lang.tcl","author":["David Cuthbert <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"51":{"url":"./tip/51.md","created":"04-Aug-2001","post-history":"","state":"Withdrawn","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 51: Native Menubutton on Macintosh","author":["Mats Bengtsson <[email protected]>"],"is-jest":false},
	"50":{"url":"./tip/50.md","created":"27-Jul-2001","post-history":"","state":"Final","vote":"Done","type":"Informative","title":"# TIP 50: Bundle [incr Tcl] with the Core Tcl distribution","author":["Kevin Kenny <[email protected]>","Mark Harrison <[email protected]>","Jeff Hobbs <[email protected]>","Andreas Kupries <[email protected]>","Karl Lehenbauer <[email protected]>","Michael McLennan <[email protected]>","Don Porter <[email protected]>","Brent Welch <[email protected]>"],"is-jest":false},
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
	"38":{"url":"./tip/38.md","created":"27-Jun-2001","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 38: Add Support for Default Bindtags","author":["Bryan Oakley <[email protected]>"],"is-jest":false},
	"37":{"url":"./tip/37.md","created":"19-Jun-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 37: Uniform Rows and Columns in Grid","author":["Peter Spjuth <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"36":{"url":"./tip/36.md","created":"13-Jun-2001","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 36: Library Access to 'Subst' Functionality","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"35":{"url":"./tip/35.md","tcl-ticket":"438509","created":"06-Jun-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 35: Enhanced Support for Serial Communications","author":["Rolf Schroedter <[email protected]>"],"is-jest":false},
	"34":{"url":"./tip/34.md","created":"03-May-2001","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 34: Modernize TEA Build System","author":["Mo DeJong <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"33":{"url":"./tip/33.md","created":"15-May-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 33: Add 'lset' Command to Assign to List Elements","discussions-to":"news:comp.lang.tcl,mailto:[email protected]","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"32":{"url":"./tip/32.md","keywords":"trace,Tcl_Obj","created":"23-Mar-2001","post-history":"","state":"Final","tcl-version":"8.4a4","vote":"Done","type":"Project","title":"# TIP 32: Add Tcl_Obj-enabled counterpart to Tcl_CreateTrace","discussions-to":"news:comp.lang.tcl","author":["David Cuthbert <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"31":{"url":"./tip/31.md","created":"12-Mar-2001","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 31: CVS tags in the Tcl and Tk repositories","author":["Don Porter <[email protected]>","miguel sofer <[email protected]>","Jeff Hobbs <[email protected]>","Kevin Kenny <[email protected]>","David Gravereaux <[email protected]>","Donal K. Fellows <[email protected]>","Andreas Kupries <[email protected]>","Donal K. Fellows <[email protected]>","<[email protected]>","Kevin Kenny <[email protected] >"],"is-jest":false},
	"30":{"url":"./tip/30.md","created":"09-Mar-2001","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 30: Tk Toolkit Maintainer Assignments","author":["Don Porter <[email protected]>","Donal K. Fellows <[email protected]>","Jan Nijtmans <[email protected]>","Todd M. Helfter <[email protected]>","Chengye Mao <[email protected]>","George B. Smith <[email protected]>","Miguel Bañón <[email protected]>","Daniel Steffen <[email protected]>","Peter Spjuth <[email protected]>","Jeff Hobbs <[email protected]>","Vince Darley <[email protected]>","Donal K. Fellows <[email protected]>","Benjamin Riefenstahl <[email protected]>","Pat Thoyts <[email protected]>","Vince Darley <[email protected]>","Peter Spjuth <[email protected]>"],"is-jest":false},
	"29":{"url":"./tip/29.md","created":"07-Mar-2001","post-history":"","state":"Rejected","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 29: Allow array syntax for Tcl lists","discussions-to":"news:comp.lang.tcl,mailto:[email protected]","author":["Kevin Kenny <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"28":{"url":"./tip/28.md","created":"23-Feb-2001","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 28: How to be a good maintainer for Tcl/Tk","author":["Don Porter <[email protected]>"],"is-jest":false},
	"27":{"url":"./tip/27.md","created":"25-Feb-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 27: CONST Qualification on Pointers in Tcl API's","discussions-to":"news:comp.lang.tcl,mailto:[email protected]","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"26":{"url":"./tip/26.md","obsoletes":"19","created":"20-Feb-2001","post-history":"","state":"Final","implementation-url":"https://core.tcl-lang.org/tips/raw/assets/26.patch","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 26: Enhancements for the Tk Text Widget","discussions-to":"news:comp.lang.tcl","author":["Ludwig Callewaert <[email protected]>","Ludwig Callewaert <[email protected]>"],"is-jest":false},
	"25":{"url":"./tip/25.md","created":"07-Feb-2001","post-history":"","obsoleted-by":"152","state":"Withdrawn","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 25: Native tk_messageBox  on Macintosh","author":["Mats Bengtsson <[email protected]>"],"is-jest":false},
	"24":{"url":"./tip/24.md","created":"29-Jan-2001","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 24: Tcl Maintainer Assignments","author":["Don Porter <[email protected]>","Donal K. Fellows <[email protected]>","Kevin B. Kenny <[email protected]>","Jeff Hobbs <[email protected]>","Pavel Goran <[email protected]>","Daniel A. Steffen <[email protected]>","miguel sofer <[email protected]>"],"is-jest":false},
	"23":{"url":"./tip/23.md","created":"22-Jan-2001","post-history":"","state":"Accepted","vote":"Done","type":"Process","title":"# TIP 23: Tk Toolkit Functional Areas for Maintainer Assignments","author":["Kevin Kenny <[email protected]>","Jim Ingham <[email protected]>","Don Porter <[email protected]>","Daniel A. Steffen <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"22":{"url":"./tip/22.md","keywords":"lindex,multiple arguments,sublists","created":"19-Jan-2001","post-history":"","state":"Final","tcl-version":"8.4a2","vote":"Done","type":"Project","title":"# TIP 22: Multiple Index Arguments to lindex","discussions-to":"news:comp.lang.tcl,mailto:[email protected]","author":["David Cuthbert <[email protected]>","Kevin Kenny <[email protected]>","Don Porter <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"21":{"url":"./tip/21.md","created":"14-Jan-2001","post-history":"","state":"Final","implementation-url":"http://www.hwaci.com/sw/asym_pad_patch_2.txt","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 21: Asymmetric Padding in the Pack and Grid Geometry Managers","author":["D. Richard Hipp <[email protected]>"],"is-jest":false},
	"20":{"url":"./tip/20.md","created":"08-Jan-2001","post-history":"","state":"Deferred","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 20: Add C Locale-Exact CType Functions","author":["Jeffrey Hobbs <[email protected]>"],"is-jest":false},
	"19":{"url":"./tip/19.md","created":"03-Jan-2001","post-history":"","obsoleted-by":"26","state":"Final","tcl-version":"8.4a2","vote":"Done","type":"Project","title":"# TIP 19: Add a Text Changed Flag to Tk's Text Widget","author":["Neil McKay <[email protected]>"],"is-jest":false},
	"18":{"url":"./tip/18.md","created":"12-Dec-2000","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 18: Add Labels to Frames","author":["Peter Spjuth <[email protected]>"],"is-jest":false},
	"17":{"url":"./tip/17.md","created":"17-Nov-2000","post-history":"","state":"Final","tcl-version":"8.4.0","vote":"Done","type":"Project","title":"# TIP 17: Redo Tcl's filesystem","author":["Vince Darley <[email protected]>"],"is-jest":false},
	"16":{"url":"./tip/16.md","created":"21-Nov-2000","post-history":"","state":"Accepted","vote":"Done","type":"Process","title":"# TIP 16: Tcl Functional Areas for Maintainer Assignments","author":["Don Porter <[email protected]>","Daniel Steffen <[email protected]>"],"is-jest":false},
	"15":{"url":"./tip/15.md","keywords":"Tcl,expr,function,introspection","created":"22-Nov-2000","post-history":"","state":"Final","tcl-version":"8.4.0","vote":"Done","type":"Project","title":"# TIP 15: Functions to List and Detail Math Functions","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},







|
|





|

|







658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
	"38":{"url":"./tip/38.md","created":"27-Jun-2001","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Pending","type":"Project","title":"# TIP 38: Add Support for Default Bindtags","author":["Bryan Oakley <[email protected]>"],"is-jest":false},
	"37":{"url":"./tip/37.md","created":"19-Jun-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 37: Uniform Rows and Columns in Grid","author":["Peter Spjuth <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"36":{"url":"./tip/36.md","created":"13-Jun-2001","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 36: Library Access to 'Subst' Functionality","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
	"35":{"url":"./tip/35.md","tcl-ticket":"438509","created":"06-Jun-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 35: Enhanced Support for Serial Communications","author":["Rolf Schroedter <[email protected]>"],"is-jest":false},
	"34":{"url":"./tip/34.md","created":"03-May-2001","post-history":"","state":"Withdrawn","tcl-version":"8.5","vote":"Done","type":"Project","title":"# TIP 34: Modernize TEA Build System","author":["Mo DeJong <[email protected]>","Andreas Kupries <[email protected]>"],"is-jest":false},
	"33":{"url":"./tip/33.md","created":"15-May-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 33: Add 'lset' Command to Assign to List Elements","discussions-to":"news:comp.lang.tcl,mailto:[email protected]","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"32":{"url":"./tip/32.md","keywords":"trace,Tcl_Obj","created":"23-Mar-2001","post-history":"","state":"Final","tcl-version":"8.4a4","vote":"Done","type":"Project","title":"# TIP 32: Add Tcl_Obj-enabled counterpart to Tcl_CreateTrace","discussions-to":"news:comp.lang.tcl","author":["David Cuthbert <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"31":{"url":"./tip/31.md","created":"12-Mar-2001","post-history":"","obsoleted-by":"386","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 31: CVS tags in the Tcl and Tk repositories","author":["Don Porter <[email protected]>","miguel sofer <[email protected]>","Jeff Hobbs <[email protected]>","Kevin Kenny <[email protected]>","David Gravereaux <[email protected]>","Donal K. Fellows <[email protected]>","Andreas Kupries <[email protected]>","Donal K. Fellows <[email protected]>","<[email protected]>","Kevin Kenny <[email protected] >"],"is-jest":false},
	"30":{"url":"./tip/30.md","created":"09-Mar-2001","post-history":"","obsoleted-by":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 30: Tk Toolkit Maintainer Assignments","author":["Don Porter <[email protected]>","Donal K. Fellows <[email protected]>","Jan Nijtmans <[email protected]>","Todd M. Helfter <[email protected]>","Chengye Mao <[email protected]>","George B. Smith <[email protected]>","Miguel Bañón <[email protected]>","Daniel Steffen <[email protected]>","Peter Spjuth <[email protected]>","Jeff Hobbs <[email protected]>","Vince Darley <[email protected]>","Donal K. Fellows <[email protected]>","Benjamin Riefenstahl <[email protected]>","Pat Thoyts <[email protected]>","Vince Darley <[email protected]>","Peter Spjuth <[email protected]>"],"is-jest":false},
	"29":{"url":"./tip/29.md","created":"07-Mar-2001","post-history":"","state":"Rejected","tcl-version":"9.0","vote":"Done","type":"Project","title":"# TIP 29: Allow array syntax for Tcl lists","discussions-to":"news:comp.lang.tcl,mailto:[email protected]","author":["Kevin Kenny <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"28":{"url":"./tip/28.md","created":"23-Feb-2001","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 28: How to be a good maintainer for Tcl/Tk","author":["Don Porter <[email protected]>"],"is-jest":false},
	"27":{"url":"./tip/27.md","created":"25-Feb-2001","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 27: CONST Qualification on Pointers in Tcl API's","discussions-to":"news:comp.lang.tcl,mailto:[email protected]","author":["Kevin Kenny <[email protected]>"],"is-jest":false},
	"26":{"url":"./tip/26.md","obsoletes":"19","created":"20-Feb-2001","post-history":"","state":"Final","implementation-url":"https://core.tcl-lang.org/tips/raw/assets/26.patch","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 26: Enhancements for the Tk Text Widget","discussions-to":"news:comp.lang.tcl","author":["Ludwig Callewaert <[email protected]>","Ludwig Callewaert <[email protected]>"],"is-jest":false},
	"25":{"url":"./tip/25.md","created":"07-Feb-2001","post-history":"","obsoleted-by":"152","state":"Withdrawn","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 25: Native tk_messageBox  on Macintosh","author":["Mats Bengtsson <[email protected]>"],"is-jest":false},
	"24":{"url":"./tip/24.md","created":"29-Jan-2001","post-history":"","obsoleted-by":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 24: Tcl Maintainer Assignments","author":["Don Porter <[email protected]>","Donal K. Fellows <[email protected]>","Kevin B. Kenny <[email protected]>","Jeff Hobbs <[email protected]>","Pavel Goran <[email protected]>","Daniel A. Steffen <[email protected]>","miguel sofer <[email protected]>"],"is-jest":false},
	"23":{"url":"./tip/23.md","created":"22-Jan-2001","post-history":"","state":"Accepted","vote":"Done","type":"Process","title":"# TIP 23: Tk Toolkit Functional Areas for Maintainer Assignments","author":["Kevin Kenny <[email protected]>","Jim Ingham <[email protected]>","Don Porter <[email protected]>","Daniel A. Steffen <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"22":{"url":"./tip/22.md","obsoletes":"170","keywords":"lindex,multiple arguments,sublists","created":"19-Jan-2001","post-history":"","state":"Final","tcl-version":"8.4a2","vote":"Done","type":"Project","title":"# TIP 22: Multiple Index Arguments to lindex","discussions-to":"news:comp.lang.tcl,mailto:[email protected]","author":["David Cuthbert <[email protected]>","Kevin Kenny <[email protected]>","Don Porter <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"21":{"url":"./tip/21.md","created":"14-Jan-2001","post-history":"","state":"Final","implementation-url":"http://www.hwaci.com/sw/asym_pad_patch_2.txt","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 21: Asymmetric Padding in the Pack and Grid Geometry Managers","author":["D. Richard Hipp <[email protected]>"],"is-jest":false},
	"20":{"url":"./tip/20.md","created":"08-Jan-2001","post-history":"","state":"Deferred","vote":"Pending","tcl-version":"8.5","type":"Project","title":"# TIP 20: Add C Locale-Exact CType Functions","author":["Jeffrey Hobbs <[email protected]>"],"is-jest":false},
	"19":{"url":"./tip/19.md","created":"03-Jan-2001","post-history":"","obsoleted-by":"26","state":"Final","tcl-version":"8.4a2","vote":"Done","type":"Project","title":"# TIP 19: Add a Text Changed Flag to Tk's Text Widget","author":["Neil McKay <[email protected]>"],"is-jest":false},
	"18":{"url":"./tip/18.md","created":"12-Dec-2000","post-history":"","state":"Final","tcl-version":"8.4","vote":"Done","type":"Project","title":"# TIP 18: Add Labels to Frames","author":["Peter Spjuth <[email protected]>"],"is-jest":false},
	"17":{"url":"./tip/17.md","created":"17-Nov-2000","post-history":"","state":"Final","tcl-version":"8.4.0","vote":"Done","type":"Project","title":"# TIP 17: Redo Tcl's filesystem","author":["Vince Darley <[email protected]>"],"is-jest":false},
	"16":{"url":"./tip/16.md","created":"21-Nov-2000","post-history":"","state":"Accepted","vote":"Done","type":"Process","title":"# TIP 16: Tcl Functional Areas for Maintainer Assignments","author":["Don Porter <[email protected]>","Daniel Steffen <[email protected]>"],"is-jest":false},
	"15":{"url":"./tip/15.md","keywords":"Tcl,expr,function,introspection","created":"22-Nov-2000","post-history":"","state":"Final","tcl-version":"8.4.0","vote":"Done","type":"Project","title":"# TIP 15: Functions to List and Detail Math Functions","author":["Donal K. Fellows <[email protected]>"],"is-jest":false},
588
589
590
591
592
593
594
595
596
	"5":{"url":"./tip/5.md","created":"17-Oct-2000","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 5: Make TkClassProcs and TkSetClassProcs Public and Extensible","author":["Eric Melski <[email protected]>"],"is-jest":false},
	"4":{"url":"./tip/4.md","created":"26-Oct-2000","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 4: Tcl Release and Distribution Philosophy","discussions-to":"news:comp.lang.tcl","author":["Brent Welch <[email protected]>","Donal K. Fellows <[email protected]>","Larry W. Virden <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"3":{"url":"./tip/3.md","created":"14-Sep-2000","obsoleted-by":"467","post-history":"","state":"Accepted","vote":"Done","type":"Process","title":"# TIP 3: TIP Format","author":["Andreas Kupries <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"2":{"url":"./tip/2.md","created":"12-Sep-2000","post-history":"","state":"Draft","vote":"Pending","type":"Process","title":"# TIP 2: TIP Guidelines","author":["Andreas Kupries <[email protected]>","Donal K. Fellows <[email protected]>","Don Porter <[email protected]>","Mo DeJong <[email protected]>","Larry W. Virden <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"1":{"url":"./tip/1.md","created":"14-Sep-2000","obsoleted-by":"386","post-history":"","state":"Withdrawn","vote":"No voting","type":"Informational","title":"# TIP 1: TIP Index","author":["TIP Editor <[email protected]>"],"is-jest":false},
	"0":{"url":"./tip/0.md","created":"11-Dec-2000","post-history":"","state":"Final","vote":"Done","type":"Process","title":"# TIP 0: Tcl Core Team Basic Rules","author":["John Ousterhout <[email protected]>"],"is-jest":false},
	"@min": 0,
	"@max": 591
}, "@timestamp": 1605448199}







|
|
691
692
693
694
695
696
697
698
699
	"5":{"url":"./tip/5.md","created":"17-Oct-2000","post-history":"","state":"Final","vote":"Done","tcl-version":"8.4","type":"Project","title":"# TIP 5: Make TkClassProcs and TkSetClassProcs Public and Extensible","author":["Eric Melski <[email protected]>"],"is-jest":false},
	"4":{"url":"./tip/4.md","created":"26-Oct-2000","post-history":"","state":"Draft","vote":"Pending","type":"Informative","title":"# TIP 4: Tcl Release and Distribution Philosophy","discussions-to":"news:comp.lang.tcl","author":["Brent Welch <[email protected]>","Donal K. Fellows <[email protected]>","Larry W. Virden <[email protected]>","Larry W. Virden <[email protected]>"],"is-jest":false},
	"3":{"url":"./tip/3.md","created":"14-Sep-2000","obsoleted-by":"467","post-history":"","state":"Accepted","vote":"Done","type":"Process","title":"# TIP 3: TIP Format","author":["Andreas Kupries <[email protected]>","Donal K. Fellows <[email protected]>"],"is-jest":false},
	"2":{"url":"./tip/2.md","created":"12-Sep-2000","post-history":"","state":"Draft","vote":"Pending","type":"Process","title":"# TIP 2: TIP Guidelines","author":["Andreas Kupries <[email protected]>","Donal K. Fellows <[email protected]>","Don Porter <[email protected]>","Mo DeJong <[email protected]>","Larry W. Virden <[email protected]>","Kevin Kenny <[email protected]>"],"is-jest":false},
	"1":{"url":"./tip/1.md","created":"14-Sep-2000","obsoleted-by":"386","post-history":"","state":"Withdrawn","vote":"No voting","type":"Informational","title":"# TIP 1: TIP Index","author":["TIP Editor <[email protected]>"],"is-jest":false},
	"0":{"url":"./tip/0.md","created":"11-Dec-2000","post-history":"","state":"Final","vote":"Done","type":"Process","title":"# TIP 0: Tcl Core Team Basic Rules","author":["John Ousterhout <[email protected]>"],"is-jest":false},
	"@min": 0,
	"@max": 694
}, "@timestamp": 1713812926}

Changes to index.md.

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
<option value='d'>Docs</option>
<option value='t'>Tickets</option>
</select>
<input type="submit" value="Search">
</div></form>
<p>

<style title="filtering">
/*
 * DO NOT MANUALLY PUT ANY STYLES IN HERE!
 *
 * This is manipulated by JS and it makes a lot of assumptions about the
 * structure of this stylesheet. Use a different stylesheet instead!
 */
</style>
<script>
var sheet = (function(){
    for (var i=0; i<document.styleSheets.length; i++) {
        var s = document.styleSheets[i];
        if (s.title == "filtering") {
            return s;
        }
    }
})();
function toggleFacet(f) {
    r = sheet.cssRules;
    if (!r) return
    boxes = document.getElementsByClassName("toggler-"+f);
    none = true;
    for (i=0; i<boxes.length; i++) {
        if (boxes[i].checked) {
            none=false;
            break;
        }
    }
    var i = r.length;
    while (i--) {
        if (r[i].selectorText && r[i].selectorText.substr(1,f.length).toLowerCase() === f) {
            sheet.deleteRule(i);
        }
    }
    if (!none) {
        for (i=0; i<boxes.length; i++) {
            if (boxes[i].checked) {
                // sheet.insertRule("."+f+"-"+boxes[i].dataset.value + " {display:table-row;}", 0);
	    } else {
                sheet.insertRule("."+f+"-"+boxes[i].dataset.value + " {display:none;}", 0);
            }
        }
    }
}
</script>

State:

    <input class="toggler-state"
        data-value="accepted"
        type="checkbox"
        onclick="toggleFacet('state')">Accepted</button>


    <input class="toggler-state"
        data-value="deferred"
        type="checkbox"
        onclick="toggleFacet('state')">Deferred</button>


    <input class="toggler-state"
        data-value="draft"
        type="checkbox"
        onclick="toggleFacet('state')">Draft</button>


    <input class="toggler-state"
        data-value="final"
        type="checkbox"
        onclick="toggleFacet('state')">Final</button>


    <input class="toggler-state"
        data-value="obsoleted"
        type="checkbox"
        onclick="toggleFacet('state')">Obsoleted</button>


    <input class="toggler-state"
        data-value="rejected"
        type="checkbox"
        onclick="toggleFacet('state')">Rejected</button>


    <input class="toggler-state"
        data-value="voting"
        type="checkbox"
        onclick="toggleFacet('state')">Voting</button>


    <input class="toggler-state"
        data-value="withdrawn"
        type="checkbox"
        onclick="toggleFacet('state')">Withdrawn</button>

<br>
Type:

    <input class="toggler-type"
        data-value="informational"
        type="checkbox"
        onclick="toggleFacet('type')">Informational</button>


    <input class="toggler-type"
        data-value="process"
        type="checkbox"
        onclick="toggleFacet('type')">Process</button>


    <input class="toggler-type"
        data-value="project"
        type="checkbox"
        onclick="toggleFacet('type')">Project</button>


    <input class="toggler-type"
        data-value="humor"
        type="checkbox"
        onclick="toggleFacet('type')">Humor</button>

<br>
Version:

    <input class="toggler-version"
        data-value="80"
        type="checkbox"
        onclick="toggleFacet('version')">8.0</button>


    <input class="toggler-version"
        data-value="84"
        type="checkbox"
        onclick="toggleFacet('version')">8.4</button>


    <input class="toggler-version"
        data-value="85"
        type="checkbox"
        onclick="toggleFacet('version')">8.5</button>


    <input class="toggler-version"
        data-value="86"
        type="checkbox"
        onclick="toggleFacet('version')">8.6</button>


    <input class="toggler-version"
        data-value="87"
        type="checkbox"
        onclick="toggleFacet('version')">8.7</button>


    <input class="toggler-version"
        data-value="90"
        type="checkbox"
        onclick="toggleFacet('version')">9.0</button>


    <input class="toggler-version"
        data-value="92"
        type="checkbox"
        onclick="toggleFacet('version')">9.2</button>

<br>


</div>
<p>

<div style="float:right; font-size:10pt" class="tipindex key">







|







|
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<


<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<


<
|
<
|
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<
<
|
<
<
<
<







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
<option value='d'>Docs</option>
<option value='t'>Tickets</option>
</select>
<input type="submit" value="Search">
</div></form>
<p>

<style id="facetFilteringSheet">
/*
 * DO NOT MANUALLY PUT ANY STYLES IN HERE!
 *
 * This is manipulated by JS and it makes a lot of assumptions about the
 * structure of this stylesheet. Use a different stylesheet instead!
 */
</style>
<script src="scripts/toggles.js"></script>





































State:

 <input class="toggler-state" data-value="accepted" type="checkbox">Accepted</input> 





 <input class="toggler-state" data-value="deferred" type="checkbox">Deferred</input> 





 <input class="toggler-state" data-value="draft" type="checkbox">Draft</input> 





 <input class="toggler-state" data-value="final" type="checkbox">Final</input> 





 <input class="toggler-state" data-value="obsoleted" type="checkbox">Obsoleted</input> 





 <input class="toggler-state" data-value="rejected" type="checkbox">Rejected</input> 





 <input class="toggler-state" data-value="withdrawn" type="checkbox">Withdrawn</input> 










<br>
Type:

 <input class="toggler-type" data-value="informational" type="checkbox">Informational</input> 





 <input class="toggler-type" data-value="process" type="checkbox">Process</input> 





 <input class="toggler-type" data-value="project" type="checkbox">Project</input> 





 <input class="toggler-type" data-value="humor" type="checkbox">Humor</input> 




<br>
Version:

 <input class="toggler-version" data-value="80" type="checkbox">8.0</input> 

 <input class="toggler-version" data-value="84" type="checkbox">8.4</input> 



 <input class="toggler-version" data-value="85" type="checkbox">8.5</input> 





 <input class="toggler-version" data-value="86" type="checkbox">8.6</input> 





 <input class="toggler-version" data-value="87" type="checkbox">8.7</input> 





 <input class="toggler-version" data-value="90" type="checkbox">9.0</input> 





 <input class="toggler-version" data-value="91" type="checkbox">9.1</input> 





 <input class="toggler-version" data-value="92" type="checkbox">9.2</input> 




<br>


</div>
<p>

<div style="float:right; font-size:10pt" class="tipindex key">
209
210
211
212
213
214
215
































































































216
217
218
219
220






221










222
223
224






































































































































































































































































































































































































































































































































































































































































































































225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
<th>Type</th>
<th>Tcl Version</th>
<th>Status</th>
<th>Title</th>
<th>Impl.</th>
</tr></thead><tbody>

































































































<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/591.md'>591</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>






<td valign='top' ><a href='./tip/591.md'>Rotate ttk::notebook window wtih mousewheel on tab</a></td>










<td></td>
</tr>
<tr class='state-draft type-project version-87'>






































































































































































































































































































































































































































































































































































































































































































































<td valign='top'><a href='./tip/590.md'>590</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/590.md'>Recommend lowercase Package Names</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-590'>Link</a></td>
</tr>
<tr class='state-withdrawn type-project version-87'>
<td valign='top'><a href='./tip/589.md'>589</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/589.md'>Deprecate &quot;-fg&quot;, &quot;-bg&quot;, &quot;-bd&quot; options in Tk.</a></td>
<td valign='top'><a href='/tk/timeline?r=deprecate-bd-bg-fg'>Link</a></td>
</tr>
<tr class='state-voting type-project version-87'>
<td valign='top'><a href='./tip/588.md'>588</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Voting</td>
<td valign='top' ><a href='./tip/588.md'>Unicode for (X11) keysyms</a></td>
<td valign='top'><a href='/tk/timeline?r=keysym-unicode'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/587.md'>587</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/587.md'>Default utf-8 for source command</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-587'>Link</a></td>
</tr>
<tr class='state-voting type-project version-87'>
<td valign='top'><a href='./tip/586.md'>586</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Voting</td>
<td valign='top' ><a href='./tip/586.md'>C String Parsing Support for binary scan</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-586-binary-scan-c-string'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/585.md'>585</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/585.md'>Promote the INDEX\_TEMP\_TABLE flag of Tcl_GetIndexFromObj*() to the public interface</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-585'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/584.md'>584</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/584.md'>Better introspection for ttk</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-584'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/583.md'>583</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/583.md'>Add Option to Limit Depth of Execution Step Traces for Procs</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/582.md'>582</a></td>
<td valign='top'>Project</td>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|



>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



|











|



|











|



|



















|


|







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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
<th>Type</th>
<th>Tcl Version</th>
<th>Status</th>
<th>Title</th>
<th>Impl.</th>
</tr></thead><tbody>

<tr class='state-draft type-project'>
<td valign='top'><a href='./tip/694.md'>694</a></td>
<td valign='top'>Project</td>
<td valign='top'>any</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/694.md'>Define a definite test environment</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87 version-90'>
<td valign='top'><a href='./tip/693.md'>693</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7 and 9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/693.md'>Restart the changes files</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/692.md'>692</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/692.md'>Revise Tcl_GetAliasObj, remove Tcl_GetAlias()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-692'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87 version-90'>
<td valign='top'><a href='./tip/691.md'>691</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7 and 9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/691.md'>Setting -profile for tclsh/wish and the &quot;source&quot;/&quot;open&quot; commands.</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-691'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/690.md'>690</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/690.md'>Make &quot;clock scan -valid 1&quot; the default</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-690'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87 version-90'>
<td valign='top'><a href='./tip/689.md'>689</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7 and 9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/689.md'>&quot;namespace unknown&quot; independent on caller namespace</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-689'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/688.md'>688</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/688.md'>clock command revision and speedup</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-688'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/687.md'>687</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/687.md'>locale support for word handling in text and entry</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-687'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/686.md'>686</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/686.md'>Make NextWord/SelectNextWord behavior platform-independant</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-686'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/685.md'>685</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/685.md'>rename &quot;string is unicode&quot; to &quot;string is transferable&quot;</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-685'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/684.md'>684</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/684.md'>Add Support for Touchpad Scrolling to Tk</a></td>
<td valign='top'><a href='/tk/timeline?r=touchpad_events'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/683.md'>683</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/683.md'>Remove legacy &quot;pack&quot; and &quot;scrollbar&quot; syntax</a></td>
<td valign='top'><a href='/tk/timeline?r=tk-legacy'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/682.md'>682</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/682.md'>Create tmp. widget in &quot;option get&quot; call</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/681.md'>681</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/681.md'>Ttk &quot;size&quot;-related options</a></td>
<td valign='top'><a href='/tk/timeline?r=gripsize'>Link</a></td>
</tr>
<tr class='state-withdrawn type-project version-91'>
<td valign='top'><a href='./tip/680.md'>680</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/680.md'>Enhance definition of a &quot;number&quot; in Tcl</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/679.md'>679</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/679.md'>General access to X window properties</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-679'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/678.md'>678</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/678.md'>Better API for Detached Treeview Items</a></td>
<td valign='top'><a href='/tk/timeline?r=treeview-list-detached'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/677.md'>677</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/677.md'>Constant Variables</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-677'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/676.md'>676</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/676.md'>An &quot;expr&quot; alternative - &quot;calc&quot; command aliased to &quot;=&quot;</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/675.md'>675</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/675.md'>Control cursor blinking cycle in Ttk widgets.</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-675'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/674.md'>674</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/674.md'>a new multiple expression command</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/673.md'>673</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/673.md'>Remove deprecated [trace] subcommands</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-673'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/672.md'>672</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/672.md'>Extend $ substitution to include expressions as $(expression)</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-672'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/671.md'>671</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/671.md'>New encoding profile - lossless</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-671'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/670.md'>670</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/670.md'>Simple Extra Procedures for File Access</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-670'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/669.md'>669</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/669.md'>Pipe PIDs as Channel Property</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-669'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/668.md'>668</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/668.md'>Consolidate all Tcl_Attempt* functions.</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-668'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-90'>
<td valign='top'><a href='./tip/667.md'>667</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/667.md'>Make &quot;strict&quot; the default encoding profile.</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-667'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/666.md'>666</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/666.md'>Change ptrdiff_t → Tcl_Size in Tcl 8.7 (and 9.0)</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-666'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/665.md'>665</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/665.md'>Remove support for internal utf-16 for Tcl 8.7 (and 9.0)</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-665'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-90'>
<td valign='top'><a href='./tip/664.md'>664</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/664.md'>Enable compiler warnings for missing int → Tcl_Size conversions</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-664'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/663.md'>663</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/663.md'>Cease distribution of the ChangeLog files</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-663'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/662.md'>662</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/662.md'>Un-deprecate Tcl_VarEval</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-662'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/661.md'>661</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/661.md'>Disable the Tcl 8 compatibility macros in Tcl 9 by default</a></td>
<td valign='top'><a href='/tcl/timeline?r=disabletcl8api'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/660.md'>660</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/660.md'>Use signed types for lengths and indices</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-660'>Link</a></td>
</tr>
<tr class='state-withdrawn type-project version-90'>
<td valign='top'><a href='./tip/659.md'>659</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/659.md'>Allow other default profiles than &quot;strict&quot;</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-659'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/658.md'>658</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/658.md'>Attach identifiers to Tk menu entries</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-658'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/657.md'>657</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/657.md'>Make &quot;-profile strict&quot; the default in Tcl 9.0</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-657'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/656.md'>656</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/656.md'>A revised proposal for encodings</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-656'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/655.md'>655</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/655.md'>Support the styleMask property for NSWindow and NSPanel in Aqua</a></td>
<td valign='top'><a href='/tk/timeline?r=655'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/654.md'>654</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/654.md'>Profiles for character encoding/decoding behaviour</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/653.md'>653</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/653.md'>Handle consumed data of channel commands in case of encoding errors</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-653'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/652.md'>652</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/652.md'>Remove  &quot;string is unicode&quot; and Tcl_CharIsUnicode&quot;</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/651.md'>651</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/651.md'>Expose TclDStringToObj via stubs table</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-651'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/650.md'>650</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/650.md'>New function Tcl_GetWideUIntFromObj()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-650'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/649.md'>649</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/649.md'>Expose additional list functionality in the C API</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-649'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/648.md'>648</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/648.md'>New functions Tcl_NewWideUIntObj()/Tcl_SetWideUIntObj()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-648'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/647.md'>647</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/647.md'>Change Tk_ConfigureWidgets signature, abandon TK_CONFIG_OBJS</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-647'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/646.md'>646</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/646.md'>Change -eofchar handling</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-646'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/645.md'>645</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/645.md'>ttk color palette support</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-645'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/644.md'>644</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/644.md'>Make Tcl_ObjType extensible</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-644'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/643.md'>643</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/643.md'>Provide a public API to retrieve nul terminator length for an encoding</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-643'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/642.md'>642</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/642.md'>Let TK_OPTION_BOOL/TK_OPTION_STRING_TABLE handle (C99) bool/enum.</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-642'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/641.md'>641</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/641.md'>Let Tcl_GetBoolean(FromObj) handle (C99) bool.</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-641'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/640.md'>640</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/640.md'>Remove Tcl_SaveResult</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-640'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/639.md'>639</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/639.md'>Include the mac_styles features in Tk 8.7</a></td>
<td valign='top'><a href='/tk/timeline?r=mac_styles_87'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/638.md'>638</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/638.md'>New public routines Tcl_GetNumber(FromObj)</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-getnumber'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/637.md'>637</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/637.md'>Make [glob] always -nocomplain</a></td>
<td valign='top'><a href='/tcl/timeline?r=novem'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/636.md'>636</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/636.md'>Expand List Flexibility with Abstract List Tcl_Obj Type</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-636-tcl9-644'>Link</a></td>
</tr>
<tr class='state-withdrawn type-project version-90'>
<td valign='top'><a href='./tip/635.md'>635</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/635.md'>Introspection for &apos;upvar&apos; and &apos;namespace upvar&apos;</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-635'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/634.md'>634</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/634.md'>Remove inconsistency in variable tracing of an array</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-634'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/633.md'>633</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/633.md'>configure channel about channel encoding error reporting mode</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip633-tcl9-fconfigure-strictencoding'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/632.md'>632</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/632.md'>return gif animated metadata</a></td>
<td valign='top'><a href='/tk/timeline?r=rfe-f285ddcd-animated-gif-metadata'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/631.md'>631</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/631.md'>ledit - a generalized insert/delete command for list variables</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-631'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/630.md'>630</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/630.md'>TclOO commands &gt; 2^31 (for 8.7)</a></td>
<td valign='top'><a href='/tcl/timeline?r=tcloo-64bit'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/629.md'>629</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/629.md'>Add a lseq (formally &quot;range&quot;) command to the core of list commands</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-629'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/628.md'>628</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/628.md'>Shared 8.7/9.0 build environment</a></td>
<td valign='top'><a href='/tcl/timeline?r=tcl8-compat'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/627.md'>627</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/627.md'>New functions for handling commands &gt; 2^31 elements (for 8.7)</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-627'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/626.md'>626</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/626.md'>Command arguments &gt; 2^31 elements</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-626'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/625.md'>625</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/625.md'>Re-implementation of lists</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-625'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/624.md'>624</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/624.md'>Deprecate Tcl_MakeSafe</a></td>
<td valign='top'><a href='/tcl/timeline?r=rfe-655300'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/623.md'>623</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6.13</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/623.md'>Bless negative index arguments to Tcl_GetRange</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-623'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/622.md'>622</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/622.md'>Full Unicode for Tcl 8.7</a></td>
<td valign='top'><a href='/tcl/timeline?r=full-utf-for-87'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/621.md'>621</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/621.md'>Glyph clustering for Tk</a></td>
<td valign='top'><a href='/tk/timeline?r=glyph_indexing_2'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/620.md'>620</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/620.md'>Treeview cell padding.</a></td>
<td valign='top'><a href='/tk/timeline?r=pspjuth-treeview'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/619.md'>619</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/619.md'>New TCL\_COMBINE flag for Tcl\_UniCharToUtf()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-619'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/618.md'>618</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/618.md'>New Tcl\_GetBool* functions with TCL\_NULL\_OK flag</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-618'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/617.md'>617</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/617.md'>Tcl_WCharLen/Tcl_Char16Len</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-617'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/616.md'>616</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/616.md'>Tcl lists &gt; 2^31 elements</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-616'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/615.md'>615</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/615.md'>string is index</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-615'>Link</a></td>
</tr>
<tr class='state-rejected type-project version-87'>
<td valign='top'><a href='./tip/614.md'>614</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/614.md'>Windows: OS: WTSSESSION change notification</a></td>
<td valign='top'><a href='/tk/timeline?r=tip614-win-wtssession-change'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/613.md'>613</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/613.md'>New INDEX\_NULL\_OK flag for Tcl_GetIndexFromObj*()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-613'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/612.md'>612</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/612.md'>Setting WM_CLASS for main/root window</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/611.md'>611</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/611.md'>Add subcommands to the &quot;photo image&quot; command to rotate and reflect an image</a></td>
<td valign='top'><a href='https://wiki.tcl-lang.org/page/rphoto'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/610.md'>610</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/610.md'>Icon Badges</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/609.md'>609</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/609.md'>Enhance Tcl_ThreadQueueEvent()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-609'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/608.md'>608</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/608.md'>Add virtual event when font configuration changes</a></td>
<td valign='top'><a href='/tk/tktview/3049518'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/607.md'>607</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/607.md'>-failindex option for encoding convertto/convertfrom</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip607-encoding-failindex'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/606.md'>606</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/606.md'>Export more private Tk functions</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-606'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/605.md'>605</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/605.md'>Function to get class name from object</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-605'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/604.md'>604</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/604.md'>Printing Support for Text and Canvas Widgets</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/603.md'>603</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/603.md'>Get &apos;stat&apos; Information of Open Files</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-603'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/602.md'>602</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/602.md'>Remove tilde expansion in file paths.</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-602'>Link</a></td>
</tr>
<tr class='state-withdrawn type-project version-90'>
<td valign='top'><a href='./tip/601.md'>601</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/601.md'>Make &quot;encoding convertto/convertfrom&quot; throw exceptions</a></td>
<td valign='top'><a href='/tcl/timeline?r=encodings-with-flags'>Link</a></td>
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/600.md'>600</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Draft</td>
<td valign='top'  colspan=2><a href='./tip/600.md'>Migration guide for Tcl 8.6/8.7/9.0</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/599.md'>599</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/599.md'>Extended build information</a></td>
<td valign='top'><a href='/tcl/timeline?r=build-info'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/598.md'>598</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/598.md'>export TclWinConvertError</a></td>
<td valign='top'><a href='/tcl/timeline?r=rfe-800716'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/597.md'>597</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/597.md'>&quot;string is unicode&quot; and better utf-8/utf-16/cesu-8 encodings</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-597'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/596.md'>596</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/596.md'>Stubs support for Embedding Tcl in other applications</a></td>
<td valign='top'><a href='/tcl/timeline?r=rfe-854941'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/595.md'>595</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/595.md'>Unicode-aware/case-sensitive Loadable Library handling</a></td>
<td valign='top'><a href='/tcl/timeline?r=bug-ea39ab591e'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/594.md'>594</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/594.md'>Modernize &quot;file stat&quot; interface</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-594'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/593.md'>593</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/593.md'>Efficient List Item Existence-Test-and-Take</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/592.md'>592</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/592.md'>Stop support for Windows XP, Server 2003, Vista, Server 2008</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-592'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/591.md'>591</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/591.md'>Rotate ttk::notebook window with mousewheel on tab</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-591'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/590.md'>590</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/590.md'>Recommend lowercase Package Names</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-590'>Link</a></td>
</tr>
<tr class='state-withdrawn type-project version-87'>
<td valign='top'><a href='./tip/589.md'>589</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/589.md'>Deprecate &quot;-fg&quot;, &quot;-bg&quot;, &quot;-bd&quot; options in Tk.</a></td>
<td valign='top'><a href='/tk/timeline?r=deprecate-bd-bg-fg'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/588.md'>588</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/588.md'>Unicode for (X11) keysyms</a></td>
<td valign='top'><a href='/tk/timeline?r=keysym-unicode'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/587.md'>587</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/587.md'>Default utf-8 for source command</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-587'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/586.md'>586</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/586.md'>C String Parsing Support for binary scan</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-586-binary-scan-c-string'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/585.md'>585</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/585.md'>Promote the INDEX\_TEMP\_TABLE flag of Tcl_GetIndexFromObj*() to the public interface</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-585'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/584.md'>584</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/584.md'>Better introspection for ttk</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-584'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/583.md'>583</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/583.md'>Add Option to Limit Depth of Execution Step Traces for Procs</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/582.md'>582</a></td>
<td valign='top'>Project</td>
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
<td valign='top'><a href='./tip/580.md'>580</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/580.md'>Export Tk_GetDoublePixelsFromObj and 5 more</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-580'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/579.md'>579</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/579.md'>Improved auto_path for Safe Base interpreters</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-579-8-7'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/578.md'>578</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/578.md'>Death to TCL_DBGX</a></td>
<td valign='top'><a href='/tcl/timeline?r=death-to-dbgx'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/577.md'>577</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/577.md'>Enhanced index values for Tk</a></td>
<td valign='top'><a href='/tk/timeline?r=strict-index'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/576.md'>576</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/576.md'>Poor-mans Table listbox enhancement</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/575.md'>575</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/575.md'>Switchable Tcl\_UtfCharComplete()/Tcl\_UtfNext()/Tcl\_UtfPrev()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-575'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/574.md'>574</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/574.md'>Add a &apos;tag delete&apos; command to the ttk::treeview widget</a></td>
<td valign='top'><a href='/tk/timeline?r=bug-1bb2f1d7ab'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/573.md'>573</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/573.md'>Surrogates are invalid</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-573'>Link</a></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/572.md'>572</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/572.md'>Implement a mechanism to specify the procedure/lambda/method argument call types (Evaluation strategy)</a></td>
<td></td>
</tr>
<tr class='state-withdrawn type-project version-86'>
<td valign='top'><a href='./tip/571.md'>571</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/571.md'>Make TclX&apos;s profiler work properly with Tcl 8.6</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/570.md'>570</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/570.md'>Gesture Support for Finger Scrolling and &quot;Pinch to Zoom&quot;</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/569.md'>569</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/569.md'>Eliminate Comments That Serve Lint</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/568.md'>568</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/568.md'>Revise ByteArray Routines To Support Proper Value Extraction</a></td>
<td valign='top'><a href='/tcl/timeline?r=dgp-properbytearray'>Link</a></td>
</tr>
<tr class='state-voting type-project version-87'>
<td valign='top'><a href='./tip/567.md'>567</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Voting</td>
<td valign='top' ><a href='./tip/567.md'>Add Operation to Support Set-like Slots</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-567'>Link</a></td>
</tr>
<tr class='state-withdrawn type-project version-87'>
<td valign='top'><a href='./tip/566.md'>566</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>







|



|











|



|

|

|


|




|



|











|



|



|


|












|


|


|









|



|

|

|



|







996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
<td valign='top'><a href='./tip/580.md'>580</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/580.md'>Export Tk_GetDoublePixelsFromObj and 5 more</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-580'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/579.md'>579</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/579.md'>Improved auto_path for Safe Base interpreters</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-579-8-7'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/578.md'>578</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/578.md'>Death to TCL_DBGX</a></td>
<td valign='top'><a href='/tcl/timeline?r=death-to-dbgx'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/577.md'>577</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/577.md'>Enhanced index values for Tk</a></td>
<td valign='top'><a href='/tk/timeline?r=enhanced-index'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/576.md'>576</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/576.md'>Poor-mans Table listbox enhancement</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/575.md'>575</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/575.md'>Switchable Tcl\_UtfCharComplete()/Tcl\_UtfNext()/Tcl\_UtfPrev()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-575'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/574.md'>574</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/574.md'>Add a &apos;tag delete&apos; command to the ttk::treeview widget</a></td>
<td valign='top'><a href='/tk/timeline?r=bug-1bb2f1d7ab'>Link</a></td>
</tr>
<tr class='state-withdrawn type-project version-87'>
<td valign='top'><a href='./tip/573.md'>573</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/573.md'>Surrogates are invalid</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-573'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/572.md'>572</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/572.md'>Implement a mechanism to specify the procedure/lambda/method argument call types (Evaluation strategy)</a></td>
<td></td>
</tr>
<tr class='state-withdrawn type-project version-86'>
<td valign='top'><a href='./tip/571.md'>571</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/571.md'>Make TclX&apos;s profiler work properly with Tcl 8.6</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/570.md'>570</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/570.md'>Gesture Support for Finger Scrolling and &quot;Pinch to Zoom&quot;</a></td>
<td valign='top'><a href='/tk/timeline?r=pspjuth-touch'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/569.md'>569</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/569.md'>Eliminate Comments That Serve Lint</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/568.md'>568</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/568.md'>Revise ByteArray Routines To Support Proper Value Extraction</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-568'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/567.md'>567</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/567.md'>Add Operation to Support Set-like Slots</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-567'>Link</a></td>
</tr>
<tr class='state-withdrawn type-project version-87'>
<td valign='top'><a href='./tip/566.md'>566</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
<td valign='top'><a href='./tip/562.md'>562</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/562.md'>Deprecate channel types 1-4</a></td>
<td valign='top'><a href='/tcl/timeline?r=deprecate-channel-type-1-4'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/561.md'>561</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/561.md'>Add console Command to Unix</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-561'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/560.md'>560</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/560.md'>Megawidget Configure/Property Support</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-560'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/559.md'>559</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/559.md'>Eliminate public routine `Tcl_FreeResult`</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-599'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/558.md'>558</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/558.md'>Basic Configure Support for TclOO</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-558'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/557.md'>557</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/557.md'>C++ support for Tcl</a></td>
<td valign='top'><a href='/tcl/timeline?r=cplusplus'>Link</a></td>
</tr>
<tr class='state-deferred type-project version-87'>
<td valign='top'><a href='./tip/556.md'>556</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Deferred</td>
<td valign='top' ><a href='./tip/556.md'>Add oo like widgets to Tk</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-556'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-86'>
<td valign='top'><a href='./tip/555.md'>555</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/555.md'>Enable listing of layouts in ttk::Themes</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-86'>
<td valign='top'><a href='./tip/554.md'>554</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/554.md'>Library file system for Tcl and Tk core using an C-based VFS</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-554'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/553.md'>553</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/553.md'>Ellipses: the Alternative to Scrolling and Wrapping</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/552.md'>552</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/552.md'>Extended treeview functionality.</a></td>
<td valign='top'><a href='/tk/timeline?r=pspjuth-treeview'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/551.md'>551</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/551.md'>Permit underscore in numerical literals in source code</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-551'>Link</a></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/550.md'>550</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/550.md'>Garbage Collection for TclOO</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/549.md'>549</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/549.md'>Make configure --enable-64bit the default</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-549'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/548.md'>548</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>







|


|




|


|












|



|











|


|












|


|




|


|




|



|











|


|




|



|







1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
<td valign='top'><a href='./tip/562.md'>562</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/562.md'>Deprecate channel types 1-4</a></td>
<td valign='top'><a href='/tcl/timeline?r=deprecate-channel-type-1-4'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/561.md'>561</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/561.md'>Add console Command to Unix</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-561'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/560.md'>560</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/560.md'>Megawidget Configure/Property Support</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-560'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/559.md'>559</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/559.md'>Eliminate public routine `Tcl_FreeResult`</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-599'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/558.md'>558</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/558.md'>Basic Configure Support for TclOO</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-558'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/557.md'>557</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/557.md'>C++ support for Tcl</a></td>
<td valign='top'><a href='/tcl/timeline?r=cplusplus'>Link</a></td>
</tr>
<tr class='state-deferred type-project version-90'>
<td valign='top'><a href='./tip/556.md'>556</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Deferred</td>
<td valign='top' ><a href='./tip/556.md'>Add oo like widgets to Tk</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-556'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-86'>
<td valign='top'><a href='./tip/555.md'>555</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/555.md'>Enable listing of layouts in ttk::Themes</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/554.md'>554</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/554.md'>Library file system for Tcl and Tk core using an C-based VFS</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-554'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/553.md'>553</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/553.md'>Ellipses: the Alternative to Scrolling and Wrapping</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/552.md'>552</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/552.md'>Extended treeview functionality.</a></td>
<td valign='top'><a href='/tk/timeline?r=pspjuth-treeview'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/551.md'>551</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/551.md'>Permit underscore in numerical literals in source code</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-551'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/550.md'>550</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/550.md'>Garbage Collection for TclOO</a></td>
<td></td>
</tr>
<tr class='state-withdrawn type-project version-87'>
<td valign='top'><a href='./tip/549.md'>549</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/549.md'>Make configure --enable-64bit the default</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-549'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/548.md'>548</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
<td valign='top'><a href='./tip/541.md'>541</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/541.md'>Add support for &apos;end&apos; index in ttk::combobox current</a></td>
<td valign='top'><a href='/tcl/timeline?r=bug-2858503fff'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/540.md'>540</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/540.md'>Add -signal Channel Configure Option to POSIX Pipes</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/539.md'>539</a></td>
<td valign='top'>Project</td>







|


|







1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
<td valign='top'><a href='./tip/541.md'>541</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/541.md'>Add support for &apos;end&apos; index in ttk::combobox current</a></td>
<td valign='top'><a href='/tcl/timeline?r=bug-2858503fff'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/540.md'>540</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/540.md'>Add -signal Channel Configure Option to POSIX Pipes</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/539.md'>539</a></td>
<td valign='top'>Project</td>
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
<td valign='top'><a href='./tip/535.md'>535</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/535.md'>Remove trailing zeroes in scale ticks</a></td>
<td valign='top'><a href='/tcl/timeline?r=scale-tick-format'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/534.md'>534</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/534.md'>Faster Hashing of Small Integers</a></td>
<td valign='top'><a href='/tcl/timeline?r=dkf-experimental-fast-number-hash'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/533.md'>533</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/533.md'>Extension of the menu post command</a></td>
<td valign='top'><a href='/tk/timeline?r=bug-70e531918e'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/532.md'>532</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/532.md'>Re-implementation of event loop processing</a></td>
<td valign='top'><a href='/tk/timeline?r=bug6e8afe516d'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/531.md'>531</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/531.md'>Static Tcl Interpreter Creation Function</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-531'>Link</a></td>
</tr>
<tr class='state-draft type-project version-86'>
<td valign='top'><a href='./tip/530.md'>530</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/530.md'>Control over performance impact of TIP 280</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-530'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/529.md'>529</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/529.md'>Add metadata dict property to tk photo image</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-529-image-metadata'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/528.md'>528</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/528.md'>Deprecate Tk_Offset()</a></td>
<td valign='top'><a href='/tk/timeline?r=offsetof'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/527.md'>527</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/527.md'>New measurement facilities in TCL: New command timerate</a></td>
<td valign='top'><a href='/tcl/timeline?r=sebres-8-6-timerate'>Link</a></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/526.md'>526</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/526.md'>Make [expr] Only Accept One Argument</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-526'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/525.md'>525</a></td>
<td valign='top'>Project</td>







|


|




















|



|











|



|
|
|

















|


|







1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
<td valign='top'><a href='./tip/535.md'>535</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/535.md'>Remove trailing zeroes in scale ticks</a></td>
<td valign='top'><a href='/tcl/timeline?r=scale-tick-format'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/534.md'>534</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/534.md'>Faster Hashing of Small Integers</a></td>
<td valign='top'><a href='/tcl/timeline?r=dkf-experimental-fast-number-hash'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/533.md'>533</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/533.md'>Extension of the menu post command</a></td>
<td valign='top'><a href='/tk/timeline?r=bug-70e531918e'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/532.md'>532</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/532.md'>Re-implementation of event loop processing</a></td>
<td valign='top'><a href='/tk/timeline?r=bug6e8afe516d'>Link</a></td>
</tr>
<tr class='state-rejected type-project version-87'>
<td valign='top'><a href='./tip/531.md'>531</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/531.md'>Static Tcl Interpreter Creation Function</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-531'>Link</a></td>
</tr>
<tr class='state-draft type-project version-86'>
<td valign='top'><a href='./tip/530.md'>530</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/530.md'>Control over performance impact of TIP 280</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-530'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/529.md'>529</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/529.md'>Add metadata dictionary property to tk photo image</a></td>
<td valign='top'><a href='/tk/timeline?r=tip529-image-metadata-no-match-method'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/528.md'>528</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/528.md'>Deprecate Tk_Offset()</a></td>
<td valign='top'><a href='/tk/timeline?r=offsetof'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/527.md'>527</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/527.md'>New measurement facilities in TCL: New command timerate</a></td>
<td valign='top'><a href='/tcl/timeline?r=sebres-8-6-timerate'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/526.md'>526</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/526.md'>Make [expr] Only Accept One Argument</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-526'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/525.md'>525</a></td>
<td valign='top'>Project</td>
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
<td valign='top'><a href='./tip/521.md'>521</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/521.md'>Floating Point Classification Functions</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-521'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/520.md'>520</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/520.md'>Make NaN Quiet</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-520'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/519.md'>519</a></td>
<td valign='top'>Project</td>







|


|







1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
<td valign='top'><a href='./tip/521.md'>521</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/521.md'>Floating Point Classification Functions</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-521'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/520.md'>520</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/520.md'>Make NaN Quiet</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-520'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/519.md'>519</a></td>
<td valign='top'>Project</td>
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
<td valign='top'><a href='./tip/514.md'>514</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/514.md'>Platform differences in handling int/wide</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-514'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/513.md'>513</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/513.md'>Better support for &apos;agendas&apos; as arrays, dictionaries or lists</a></td>
<td valign='top'><a href='https://core.tcl-lang.org/tips/doc/trunk/attach/513/agendas.tcl'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/512.md'>512</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/512.md'>No stub for Tcl_SetExitProc()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-512'>Link</a></td>
</tr>
<tr class='state-accepted type-project version-87'>
<td valign='top'><a href='./tip/511.md'>511</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Accepted</td>
<td valign='top' ><a href='./tip/511.md'>Implement Tcl_AsyncMarkFromSignal()</a></td>
<td valign='top'><a href='https://www.androwish.org/index.html/info/40790af1e8e4ec9f'>Link</a></td>
</tr>
<tr class='state-deferred type-project version-87'>
<td valign='top'><a href='./tip/510.md'>510</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Deferred</td>
<td valign='top' ><a href='./tip/510.md'>Add Rbc and Tkpath widgets to Tk</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-510'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/509.md'>509</a></td>
<td valign='top'>Project</td>







|


|


|









|



|

|

|


|







1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
<td valign='top'><a href='./tip/514.md'>514</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/514.md'>Platform differences in handling int/wide</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-514'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/513.md'>513</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/513.md'>Better support for &apos;agendas&apos; as arrays, dictionaries or lists</a></td>
<td valign='top'><a href='https://core.tcl-lang.org/tips/doc/main/attach/513/agendas.tcl'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/512.md'>512</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/512.md'>No stub for Tcl_SetExitProc()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-512'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/511.md'>511</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/511.md'>Implement Tcl_AsyncMarkFromSignal()</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-511'>Link</a></td>
</tr>
<tr class='state-deferred type-project version-90'>
<td valign='top'><a href='./tip/510.md'>510</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Deferred</td>
<td valign='top' ><a href='./tip/510.md'>Add Rbc and Tkpath widgets to Tk</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-510'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/509.md'>509</a></td>
<td valign='top'>Project</td>
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
<td valign='top'><a href='./tip/499.md'>499</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/499.md'>Custom locale search list for msgcat</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip499-msgcat-custom-preferences'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/498.md'>498</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/498.md'>Simplify Tcl_DeleteNamespace</a></td>
<td valign='top'><a href='/tcl/timeline?r=bug-e593adf103-core-8'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/497.md'>497</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/497.md'>Full support for Unicode planes 1-16.</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-497'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/496.md'>496</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/496.md'>Display hints in ::entry ::spinbox ::ttk::entry ::ttk::spinbox and ::ttk::combobox</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-496'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/495.md'>495</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/495.md'>Tcl Based Build System for TEA projects</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/494.md'>494</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/494.md'>More use of size_t in Tcl 9</a></td>
<td valign='top'><a href='/tcl/timeline?r=memory-API'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/493.md'>493</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>







|


|




















|


|









|







1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
<td valign='top'><a href='./tip/499.md'>499</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/499.md'>Custom locale search list for msgcat</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip499-msgcat-custom-preferences'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/498.md'>498</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/498.md'>Simplify Tcl_DeleteNamespace</a></td>
<td valign='top'><a href='/tcl/timeline?r=bug-e593adf103-core-8'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/497.md'>497</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/497.md'>Full support for Unicode planes 1-16.</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-497'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/496.md'>496</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/496.md'>Display hints in ::entry ::spinbox ::ttk::entry ::ttk::spinbox and ::ttk::combobox</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-496'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/495.md'>495</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/495.md'>Tcl Based Build System for TEA projects</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/494.md'>494</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/494.md'>More use of size_t/ptrdiff_t in Tcl 9</a></td>
<td valign='top'><a href='/tcl/timeline?r=memory-API'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/493.md'>493</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
<td valign='top'><a href='./tip/482.md'>482</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/482.md'>Record Tk demo directory information</a></td>
<td valign='top'><a href='/tk/timeline?r=tk-stu-pkg'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/481.md'>481</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/481.md'>`Tcl_GetStringFromObj()` with `size_t` length parameter</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-481'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/480.md'>480</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/480.md'>Type and Alias Assertions for Tcl</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-480'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/479.md'>479</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/479.md'>Add Named Procedures as a New Command in Tcl (dictargs::proc)</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip479'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/478.md'>478</a></td>
<td valign='top'>Project</td>







|



|
|


|


|




|


|







1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
<td valign='top'><a href='./tip/482.md'>482</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/482.md'>Record Tk demo directory information</a></td>
<td valign='top'><a href='/tk/timeline?r=tk-stu-pkg'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/481.md'>481</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/481.md'>`Tcl_GetStringFromObj()` with `ptrdiff_t` length parameter</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-481'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/480.md'>480</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/480.md'>Type and Alias Assertions for Tcl</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-480'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/479.md'>479</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/479.md'>Add Named Procedures as a New Command in Tcl (dictargs::proc)</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip479'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/478.md'>478</a></td>
<td valign='top'>Project</td>
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
<td valign='top'><a href='./tip/472.md'>472</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/472.md'>Add Support for 0d Radix Prefix to Integer Literals</a></td>
<td valign='top'><a href='/tcl/timeline?r=bsg-0d-radix-prefix'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/471.md'>471</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/471.md'>Add [info linkedname] Introspection Command</a></td>
<td valign='top'><a href='/tcl/timeline?r=info-linkedname'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/470.md'>470</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/470.md'>Reliable Access to OO Definition Context Object</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-470'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/469.md'>469</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/469.md'>A Callback for Channel-Exception Conditions</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-469'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/468.md'>468</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/468.md'>Support Passing TCP listen Backlog Size Option to TCP Socket Creation</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-468'>Link</a></td>
</tr>
<tr class='state-final type-process'>
<td valign='top'><a href='./tip/467.md'>467</a></td>
<td valign='top' colspan=2>Process</td>
<td valign='top'>Final</td>
<td valign='top'  colspan=2><a href='./tip/467.md'>Move TIP Collection to Fossil</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/466.md'>466</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/466.md'>Revised Implementation of the Text Widget</a></td>
<td valign='top'><a href='/tk/timeline?r=revised_text'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/465.md'>465</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/465.md'>Change Rule 8 of the Dodekalogue to Cut Some Corner Cases</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-465'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/464.md'>464</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>







|


|












|


|




|



|









|


|




|


|
|







1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
<td valign='top'><a href='./tip/472.md'>472</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/472.md'>Add Support for 0d Radix Prefix to Integer Literals</a></td>
<td valign='top'><a href='/tcl/timeline?r=bsg-0d-radix-prefix'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/471.md'>471</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/471.md'>Add [info linkedname] Introspection Command</a></td>
<td valign='top'><a href='/tcl/timeline?r=info-linkedname'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/470.md'>470</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/470.md'>Reliable Access to OO Definition Context Object</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-470'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/469.md'>469</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/469.md'>A Callback for Channel-Exception Conditions</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-469'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/468.md'>468</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/468.md'>Support Passing TCP listen Backlog Size Option to TCP Socket Creation</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-468'>Link</a></td>
</tr>
<tr class='state-final type-process'>
<td valign='top'><a href='./tip/467.md'>467</a></td>
<td valign='top' colspan=2>Process</td>
<td valign='top'>Final</td>
<td valign='top'  colspan=2><a href='./tip/467.md'>Move TIP Collection to Fossil</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/466.md'>466</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/466.md'>Revised Implementation of the Text Widget</a></td>
<td valign='top'><a href='/tk/timeline?r=revised_text'>Link</a></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/465.md'>465</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/465.md'>Change Rule 8 of the Dodekalogue to Cut Some Corner Cases</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-465'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/464.md'>464</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
<td valign='top'><a href='./tip/461.md'>461</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/461.md'>Separate Numeric and String Comparison Operators</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-461'>Link</a></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/460.md'>460</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/460.md'>An Alternative to Upvar</a></td>
<td valign='top'><a href='/tcl/timeline?r=dah-proc-arg-upvar'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/459.md'>459</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/459.md'>Tcl Package Introspection Improvements</a></td>
<td valign='top'><a href='/tcl/timeline?r=package_files'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/458.md'>458</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/458.md'>Add Support for epoll() and kqueue() in the Notifier</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-458'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/457.md'>457</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/457.md'>Add Support for Named Arguments</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-457'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/456.md'>456</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/456.md'>Extend the C API to Support Passing Options to TCP Server Creation</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-456'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/455.md'>455</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/455.md'>Extensions to [vwait]: Variable Sets and Scripted Access to Tcl_DoOneEvent</a></td>
<td></td>
</tr>
<tr class='state-withdrawn type-project version-86'>
<td valign='top'><a href='./tip/454.md'>454</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6.6</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/454.md'>Automatically Resize Frames After Last Child Removed</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/453.md'>453</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/453.md'>Tcl Based Automation for tcl/pkgs</a></td>
<td valign='top'><a href='https://core.tcl-lang.org/tclconfig/timeline?r=practcl'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/452.md'>452</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/452.md'>Add &quot;stubs&quot; Package to or Along Side of TclTest</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-452'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/451.md'>451</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/451.md'>Modify [update] to Give Full Script Access to Tcl_DoOneEvent</a></td>
<td valign='top'><a href='/tcl/timeline?r=updateextended'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/450.md'>450</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/450.md'>Add [binary] subcommand &quot;set&quot; for in-place modification</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-450'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/449.md'>449</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/449.md'>[text] undo/redo to Return Range of Characters</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-449'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/448.md'>448</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/448.md'>Update Tcl_SetNotifier to Reinitialize Event Loop</a></td>
<td valign='top'><a href='http://fossil.etoyoc.com/sandbox/tcllib/artifact/b2b272a285811272'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/447.md'>447</a></td>
<td valign='top'>Project</td>







|


|




















|


|












|



|

|









|


|




|


|




|



|



|


|












|


|







1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
<td valign='top'><a href='./tip/461.md'>461</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/461.md'>Separate Numeric and String Comparison Operators</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-461'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/460.md'>460</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/460.md'>An Alternative to Upvar</a></td>
<td valign='top'><a href='/tcl/timeline?r=dah-proc-arg-upvar'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/459.md'>459</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/459.md'>Tcl Package Introspection Improvements</a></td>
<td valign='top'><a href='/tcl/timeline?r=package_files'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/458.md'>458</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/458.md'>Add Support for epoll() and kqueue() in the Notifier</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-458'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/457.md'>457</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/457.md'>Add Support for Named Arguments</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-457'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/456.md'>456</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/456.md'>Extend the C API to Support Passing Options to TCP Server Creation</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-456'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/455.md'>455</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/455.md'>Extensions to [vwait]: Variable Sets and Scripted Access to Tcl_DoOneEvent</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-455'>Link</a></td>
</tr>
<tr class='state-withdrawn type-project version-86'>
<td valign='top'><a href='./tip/454.md'>454</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6.6</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/454.md'>Automatically Resize Frames After Last Child Removed</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/453.md'>453</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/453.md'>Tcl Based Automation for tcl/pkgs</a></td>
<td valign='top'><a href='https://core.tcl-lang.org/tclconfig/timeline?r=practcl'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/452.md'>452</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/452.md'>Add &quot;stubs&quot; Package to or Along Side of TclTest</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-452'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/451.md'>451</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/451.md'>Modify [update] to Give Full Script Access to Tcl_DoOneEvent</a></td>
<td valign='top'><a href='/tcl/timeline?r=updateextended'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/450.md'>450</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/450.md'>Add [binary] subcommand &quot;set&quot; for in-place modification</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-450'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/449.md'>449</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/449.md'>[text] undo/redo to Return Range of Characters</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-449'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/448.md'>448</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/448.md'>Update Tcl_SetNotifier to Reinitialize Event Loop</a></td>
<td valign='top'><a href='http://fossil.etoyoc.com/sandbox/tcllib/artifact/b2b272a285811272'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/447.md'>447</a></td>
<td valign='top'>Project</td>
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
<td valign='top'><a href='./tip/440.md'>440</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/440.md'>Add engine to tcl_platform Array</a></td>
<td valign='top'><a href='/tcl/timeline?r=tclPlatformEngine'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/439.md'>439</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/439.md'>Semantic Versioning</a></td>
<td valign='top'><a href='/tcl/timeline?r=semver'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/438.md'>438</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6.5</td>







|



|







2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
<td valign='top'><a href='./tip/440.md'>440</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/440.md'>Add engine to tcl_platform Array</a></td>
<td valign='top'><a href='/tcl/timeline?r=tclPlatformEngine'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/439.md'>439</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/439.md'>Semantic Versioning</a></td>
<td valign='top'><a href='/tcl/timeline?r=semver'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/438.md'>438</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6.5</td>
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
<td valign='top'><a href='./tip/429.md'>429</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6.2</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/429.md'>A &apos;string&apos; Subcommand for Concatenation</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-429'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/428.md'>428</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/428.md'>Produce Error Dictionary from &apos;fconfigure -error&apos;</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-428'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/427.md'>427</a></td>
<td valign='top'>Project</td>







|


|







2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
<td valign='top'><a href='./tip/429.md'>429</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6.2</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/429.md'>A &apos;string&apos; Subcommand for Concatenation</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-429'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/428.md'>428</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/428.md'>Produce Error Dictionary from &apos;fconfigure -error&apos;</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-428'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/427.md'>427</a></td>
<td valign='top'>Project</td>
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
<td valign='top'><a href='./tip/425.md'>425</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/425.md'>Correct use of UTF-8 in Panic Callback (Windows only)</a></td>
<td valign='top'><a href='/tcl/timeline?r=win-console-panic'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/424.md'>424</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/424.md'>Improving [exec]</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-improve-exec'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/423.md'>423</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/423.md'>Formatting Timestamps with Milliseconds</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/422.md'>422</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/422.md'>Don&apos;t Use stdarg.h/va_list in Public API</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-422'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/421.md'>421</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/421.md'>A Command for Iterating Over Arrays</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-421'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/420.md'>420</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/420.md'>&apos;vexpr&apos;, a Vector Expression Command</a></td>
<td valign='top'><a href='http://www.etoyoc.com/tclmatrix3d'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/419.md'>419</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/419.md'>A New Command for Binding to Tk Events</a></td>
<td valign='top'><a href='http://wiki.tcl.tk/tkevent'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/418.md'>418</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/418.md'>Add [binary] Subcommands for In-Place Modification</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/417.md'>417</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/417.md'>Use Explicit Option Names for &quot;file tempfile&quot;</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/416.md'>416</a></td>
<td valign='top'>Project</td>







|


|




|


|




















|


|




|


|




|


|




|


|







2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
<td valign='top'><a href='./tip/425.md'>425</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/425.md'>Correct use of UTF-8 in Panic Callback (Windows only)</a></td>
<td valign='top'><a href='/tcl/timeline?r=win-console-panic'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/424.md'>424</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/424.md'>Improving [exec]</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-improve-exec'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/423.md'>423</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/423.md'>Formatting Timestamps with Milliseconds</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/422.md'>422</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/422.md'>Don&apos;t Use stdarg.h/va_list in Public API</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-422'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/421.md'>421</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/421.md'>A Command for Iterating Over Arrays</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-421'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/420.md'>420</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/420.md'>&apos;vexpr&apos;, a Vector Expression Command</a></td>
<td valign='top'><a href='http://www.etoyoc.com/tclmatrix3d'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/419.md'>419</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/419.md'>A New Command for Binding to Tk Events</a></td>
<td valign='top'><a href='http://wiki.tcl.tk/tkevent'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/418.md'>418</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/418.md'>Add [binary] Subcommands for In-Place Modification</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/417.md'>417</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/417.md'>Use Explicit Option Names for &quot;file tempfile&quot;</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/416.md'>416</a></td>
<td valign='top'>Project</td>
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
<td valign='top'><a href='./tip/412.md'>412</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/412.md'>Dynamic Locale Changing for msgcat with On-Demand File Load</a></td>
<td valign='top'><a href='/tcl/timeline?r=msgcat_dyn_locale'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/411.md'>411</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/411.md'>Improved Channel Introspection via &quot;chan info&quot;</a></td>
<td valign='top'><a href='http://sqlitestudio.pl/tcl/patches/tip-411-chan_info.patch'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/410.md'>410</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/410.md'>Three Features of scan Adapted for binary scan/format</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/409.md'>409</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/409.md'>UDP in Tcl</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/408.md'>408</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/408.md'>Allow Any Command for expr Functions</a></td>
<td></td>
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/407.md'>407</a></td>
<td valign='top' colspan=2>Informational</td>







|


|




|


|




|


|




|


|







2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
<td valign='top'><a href='./tip/412.md'>412</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/412.md'>Dynamic Locale Changing for msgcat with On-Demand File Load</a></td>
<td valign='top'><a href='/tcl/timeline?r=msgcat_dyn_locale'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/411.md'>411</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/411.md'>Improved Channel Introspection via &quot;chan info&quot;</a></td>
<td valign='top'><a href='http://sqlitestudio.pl/tcl/patches/tip-411-chan_info.patch'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/410.md'>410</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/410.md'>Three Features of scan Adapted for binary scan/format</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/409.md'>409</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/409.md'>UDP in Tcl</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/408.md'>408</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/408.md'>Allow Any Command for expr Functions</a></td>
<td></td>
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/407.md'>407</a></td>
<td valign='top' colspan=2>Informational</td>
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
<td valign='top'><a href='./tip/403.md'>403</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/403.md'>Web Colors for Tk</a></td>
<td valign='top'><a href='/tk/timeline?r=jn-web-colors'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/402.md'>402</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/402.md'>General Platform UNC Support</a></td>
<td valign='top'><a href='/tcl/timeline?r=jn-unc-vfs'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/401.md'>401</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/401.md'>Comment Words with Leading {#}</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-401'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/400.md'>400</a></td>
<td valign='top'>Project</td>







|



|

|

|


|







2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
<td valign='top'><a href='./tip/403.md'>403</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/403.md'>Web Colors for Tk</a></td>
<td valign='top'><a href='/tk/timeline?r=jn-web-colors'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/402.md'>402</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/402.md'>General Platform UNC Support</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-402'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/401.md'>401</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/401.md'>Comment Words with Leading {#}</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-401'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/400.md'>400</a></td>
<td valign='top'>Project</td>
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
<td valign='top'><a href='./tip/395.md'>395</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/395.md'>New &apos;string is entier&apos; Command</a></td>
<td valign='top'><a href='http://sites.google.com/site/josdecoster/Home/tip_string_is_entier.diff'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/394.md'>394</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/394.md'>Platform-Independent Handling of Contemporary Mice</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/393.md'>393</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/393.md'>Add -command Option to lsearch</a></td>
<td valign='top'><a href='http://sqlitestudio.pl/tcl/patches/tip-393-lsearch-command.patch'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/392.md'>392</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/392.md'>Allow Bignums to be Disabled at Runtime on a Per-Interp Basis</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/391.md'>391</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/391.md'>Support for UDP Sockets in Tcl</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/390.md'>390</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/390.md'>A Logging API for Tcl</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/389.md'>389</a></td>
<td valign='top'>Project</td>







|



|



|


|




|


|












|


|







2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
<td valign='top'><a href='./tip/395.md'>395</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/395.md'>New &apos;string is entier&apos; Command</a></td>
<td valign='top'><a href='http://sites.google.com/site/josdecoster/Home/tip_string_is_entier.diff'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/394.md'>394</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/394.md'>Platform-Independent Handling of Contemporary Mice</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/393.md'>393</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/393.md'>Add -command Option to lsearch</a></td>
<td valign='top'><a href='http://sqlitestudio.pl/tcl/patches/tip-393-lsearch-command.patch'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/392.md'>392</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/392.md'>Allow Bignums to be Disabled at Runtime on a Per-Interp Basis</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/391.md'>391</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/391.md'>Support for UDP Sockets in Tcl</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/390.md'>390</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/390.md'>A Logging API for Tcl</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/389.md'>389</a></td>
<td valign='top'>Project</td>
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/386.md'>386</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Draft</td>
<td valign='top'  colspan=2><a href='./tip/386.md'>Relocation of Tcl/Tk Source Control Repositories</a></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/385.md'>385</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/385.md'>Functional Traces On Variables</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/384.md'>384</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/384.md'>Add File Alteration Monitoring to the Tcl Core</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/383.md'>383</a></td>
<td valign='top'>Project</td>







|


|




|


|







2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/386.md'>386</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Draft</td>
<td valign='top'  colspan=2><a href='./tip/386.md'>Relocation of Tcl/Tk Source Control Repositories</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/385.md'>385</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/385.md'>Functional Traces On Variables</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/384.md'>384</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/384.md'>Add File Alteration Monitoring to the Tcl Core</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/383.md'>383</a></td>
<td valign='top'>Project</td>
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
<td valign='top'><a href='./tip/380.md'>380</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/380.md'>TclOO Slots for Flexible Declarations</a></td>
<td valign='top'><a href='/tcl/tktview/3084339'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/379.md'>379</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/379.md'>Add a Command for Delivering Events Without Tk</a></td>
<td valign='top'><a href='http://www.wjduquette.com/notifier/hook-0.1.zip'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/378.md'>378</a></td>
<td valign='top'>Project</td>







|


|







2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
<td valign='top'><a href='./tip/380.md'>380</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/380.md'>TclOO Slots for Flexible Declarations</a></td>
<td valign='top'><a href='/tcl/tktview/3084339'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/379.md'>379</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/379.md'>Add a Command for Delivering Events Without Tk</a></td>
<td valign='top'><a href='http://www.wjduquette.com/notifier/hook-0.1.zip'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/378.md'>378</a></td>
<td valign='top'>Project</td>
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
<td valign='top'><a href='./tip/375.md'>375</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/375.md'>Symmetric Coroutines and Yieldto</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/374.md'>374</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/374.md'>Stackless Vwait</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-86'>
<td valign='top'><a href='./tip/373.md'>373</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/373.md'>Improved Yielding Support for Coroutines</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-86'>
<td valign='top'><a href='./tip/372.md'>372</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/372.md'>Multi-argument Yield for Coroutines</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/371.md'>371</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/371.md'>Improvements for the dict command</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/370.md'>370</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/370.md'>Extend Tk&apos;s selection with a -time option</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/369.md'>369</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/369.md'>Widget cargo command</a></td>
<td valign='top'><a href='/tk/tktview/3023578'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/368.md'>368</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/368.md'>Listbox Justification Option</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/367.md'>367</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/367.md'>A Command to Remove Elements from a List</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-367'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/366.md'>366</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/366.md'>Variable Sized Indicators for Menubuttons</a></td>
<td valign='top'><a href='/tk/tktview/2996760'>Link</a></td>
</tr>
<tr class='state-draft type-humor version-86'>
<td valign='top'><a href='./tip/365.md'>365</a></td>
<td valign='top'>humor</td>
<td valign='top'>8.6</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/365.md'>Add Python Compatibility Mode</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/364.md'>364</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/364.md'>Threading Support: Configuration and Package</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/363.md'>363</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/363.md'>Vector Math in the Tcl Core</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/362.md'>362</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/362.md'>Simple 32 and 64 bit Registry Support</a></td>
<td valign='top'><a href='/tcl/tktview/2960976'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/361.md'>361</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/361.md'>Releasing Channel Buffers</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/360.md'>360</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/360.md'>Modernize X11 Menus</a></td>
<td valign='top'><a href='/tk/tktview/2920409'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/359.md'>359</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/359.md'>Extended Window Manager Hint Support</a></td>
<td valign='top'><a href='/tk/tktview/2918731'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/358.md'>358</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/358.md'>Suppress Empty List Element Generation from the Split Command</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/357.md'>357</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/357.md'>Export TclLoadFile</a></td>
<td valign='top'><a href='/tcl/tktview/2891616'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/356.md'>356</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/356.md'>NR-enabled Substitutions for Extensions</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/355.md'>355</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/355.md'>Stop Fast Recycling of Channel Names on Unix</a></td>
<td valign='top'><a href='/tcl/tktview/2826430'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/354.md'>354</a></td>
<td valign='top'>Project</td>







|


|




















|


|




|


|




|


|




















|


|
|

|

















|


|












|


|




















|


|




















|


|







2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
<td valign='top'><a href='./tip/375.md'>375</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/375.md'>Symmetric Coroutines and Yieldto</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/374.md'>374</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/374.md'>Stackless Vwait</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-86'>
<td valign='top'><a href='./tip/373.md'>373</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/373.md'>Improved Yielding Support for Coroutines</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-86'>
<td valign='top'><a href='./tip/372.md'>372</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/372.md'>Multi-argument Yield for Coroutines</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/371.md'>371</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/371.md'>Improvements for the dict command</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/370.md'>370</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/370.md'>Extend Tk&apos;s selection with a -time option</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/369.md'>369</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/369.md'>Widget cargo command</a></td>
<td valign='top'><a href='/tk/tktview/3023578'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/368.md'>368</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/368.md'>Listbox Justification Option</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/367.md'>367</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/367.md'>A Command to Remove Elements from a List</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-367'>Link</a></td>
</tr>
<tr class='state-rejected type-project version-90'>
<td valign='top'><a href='./tip/366.md'>366</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/366.md'>Variable Sized Indicators for Menubuttons</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-366'>Link</a></td>
</tr>
<tr class='state-draft type-humor version-86'>
<td valign='top'><a href='./tip/365.md'>365</a></td>
<td valign='top'>humor</td>
<td valign='top'>8.6</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/365.md'>Add Python Compatibility Mode</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/364.md'>364</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/364.md'>Threading Support: Configuration and Package</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/363.md'>363</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/363.md'>Vector Math in the Tcl Core</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/362.md'>362</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/362.md'>Simple 32 and 64 bit Registry Support</a></td>
<td valign='top'><a href='/tcl/tktview/2960976'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/361.md'>361</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/361.md'>Releasing Channel Buffers</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/360.md'>360</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/360.md'>Modernize X11 Menus</a></td>
<td valign='top'><a href='/tk/tktview/2920409'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/359.md'>359</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/359.md'>Extended Window Manager Hint Support</a></td>
<td valign='top'><a href='/tk/tktview/2918731'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/358.md'>358</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/358.md'>Suppress Empty List Element Generation from the Split Command</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/357.md'>357</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/357.md'>Export TclLoadFile</a></td>
<td valign='top'><a href='/tcl/tktview/2891616'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/356.md'>356</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/356.md'>NR-enabled Substitutions for Extensions</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/355.md'>355</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/355.md'>Stop Fast Recycling of Channel Names on Unix</a></td>
<td valign='top'><a href='/tcl/tktview/2826430'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/354.md'>354</a></td>
<td valign='top'>Project</td>
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/350.md'>350</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Draft</td>
<td valign='top'  colspan=2><a href='./tip/350.md'>Tcl Database Connectivity - Corrigenda</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/349.md'>349</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/349.md'>New &quot;-cargo&quot; option for every Tk widget</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/348.md'>348</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/348.md'>Substituted &apos;errorstack&apos; / &apos;traceback&apos;</a></td>
<td valign='top'><a href='/tcl/tktview/2868499'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/347.md'>347</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/347.md'>Align &apos;string is ...&apos; to Type-Conversion Functions in &apos;expr&apos;</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/346.md'>346</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/346.md'>Error on Failed String Encodings</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/345.md'>345</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/345.md'>Kill the &apos;identity&apos; Encoding</a></td>
<td valign='top'><a href='/tcl/tktview/2564363'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/344.md'>344</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/344.md'>Bring TCP_NODELAY and SO_KEEPALIVE to socket options</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/343.md'>343</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/343.md'>A Binary Specifier for [format/scan]</a></td>







|


|




















|



|

|









|



|

|







2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/350.md'>350</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Draft</td>
<td valign='top'  colspan=2><a href='./tip/350.md'>Tcl Database Connectivity - Corrigenda</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/349.md'>349</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/349.md'>New &quot;-cargo&quot; option for every Tk widget</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/348.md'>348</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/348.md'>Substituted &apos;errorstack&apos; / &apos;traceback&apos;</a></td>
<td valign='top'><a href='/tcl/tktview/2868499'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/347.md'>347</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/347.md'>Align &apos;string is ...&apos; to Type-Conversion Functions in &apos;expr&apos;</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/346.md'>346</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/346.md'>Error on Failed String Encodings</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-346'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/345.md'>345</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/345.md'>Kill the &apos;identity&apos; Encoding</a></td>
<td valign='top'><a href='/tcl/tktview/2564363'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/344.md'>344</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/344.md'>Bring TCP_NODELAY and SO_KEEPALIVE to socket options</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-344'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/343.md'>343</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/343.md'>A Binary Specifier for [format/scan]</a></td>
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
<td valign='top'><a href='./tip/334.md'>334</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/334.md'>Make &apos;lrepeat&apos; Accept Zero as a Count</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/333.md'>333</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/333.md'>New Variable and Namespace Resolving Interface</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/332.md'>332</a></td>
<td valign='top'>Project</td>







|


|







2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
<td valign='top'><a href='./tip/334.md'>334</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/334.md'>Make &apos;lrepeat&apos; Accept Zero as a Count</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/333.md'>333</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/333.md'>New Variable and Namespace Resolving Interface</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/332.md'>332</a></td>
<td valign='top'>Project</td>
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
<td valign='top'><a href='./tip/326.md'>326</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/326.md'>Add -stride Option to lsort</a></td>
<td valign='top'><a href='/tcl/tktview/2082681'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/325.md'>325</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/325.md'>System Tray and System Notification Access</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/324.md'>324</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>







|



|







3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
<td valign='top'><a href='./tip/326.md'>326</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/326.md'>Add -stride Option to lsort</a></td>
<td valign='top'><a href='/tcl/tktview/2082681'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/325.md'>325</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/325.md'>System Tray and System Notification Access</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/324.md'>324</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
<td valign='top'><a href='./tip/320.md'>320</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/320.md'>Improved Variable Handling in the Core Object System</a></td>
<td valign='top'><a href='/tcl/tktview/2005460'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/319.md'>319</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/319.md'>Implement Backwards Compatibility for ttk Themed Widgets in tk Widgets</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/318.md'>318</a></td>
<td valign='top'>Project</td>







|


|







3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
<td valign='top'><a href='./tip/320.md'>320</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/320.md'>Improved Variable Handling in the Core Object System</a></td>
<td valign='top'><a href='/tcl/tktview/2005460'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/319.md'>319</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/319.md'>Implement Backwards Compatibility for ttk Themed Widgets in tk Widgets</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/318.md'>318</a></td>
<td valign='top'>Project</td>
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
<td valign='top'><a href='./tip/310.md'>310</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/310.md'>Add a New Pseudo-Random Number Generator</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/309.md'>309</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/309.md'>Expose the Expression Parsing</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-informational'>
<td valign='top'><a href='./tip/308.md'>308</a></td>
<td valign='top' colspan=2>Informational</td>







|


|







3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
<td valign='top'><a href='./tip/310.md'>310</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/310.md'>Add a New Pseudo-Random Number Generator</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/309.md'>309</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/309.md'>Expose the Expression Parsing</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-informational'>
<td valign='top'><a href='./tip/308.md'>308</a></td>
<td valign='top' colspan=2>Informational</td>
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
<td valign='top'><a href='./tip/304.md'>304</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/304.md'>A Standalone [chan pipe] Primitive for Advanced Child IPC</a></td>
<td valign='top'><a href='/tcl/tktview/1978495'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/303.md'>303</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/303.md'>Enhance &apos;llength&apos; Command to Support Nested Lists</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/302.md'>302</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/302.md'>Fix &quot;after&quot;&apos;s Sensitivity To Adjustments Of System Clock</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-86'>
<td valign='top'><a href='./tip/301.md'>301</a></td>
<td valign='top'>Project</td>







|


|




|


|







3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
<td valign='top'><a href='./tip/304.md'>304</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/304.md'>A Standalone [chan pipe] Primitive for Advanced Child IPC</a></td>
<td valign='top'><a href='/tcl/tktview/1978495'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/303.md'>303</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/303.md'>Enhance &apos;llength&apos; Command to Support Nested Lists</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/302.md'>302</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/302.md'>Fix &quot;after&quot;&apos;s Sensitivity To Adjustments Of System Clock</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-86'>
<td valign='top'><a href='./tip/301.md'>301</a></td>
<td valign='top'>Project</td>
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
<td valign='top'><a href='./tip/298.md'>298</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/298.md'>Revise Shared Value Rules for Tcl_GetBignumAndClearObj</a></td>
<td valign='top'><a href='/tcl/tktview/1601243'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/297.md'>297</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/297.md'>Integer Type Introspection and Conversion</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/296.md'>296</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/296.md'>Enhanced Syntax for Pair-Wise Indices</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/295.md'>295</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/295.md'>Enhance Arguments to lrange</a></td>
<td></td>
</tr>
<tr class='state-rejected type-project version-85'>
<td valign='top'><a href='./tip/294.md'>294</a></td>
<td valign='top'>Project</td>







|



|



|


|




|


|







3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
<td valign='top'><a href='./tip/298.md'>298</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/298.md'>Revise Shared Value Rules for Tcl_GetBignumAndClearObj</a></td>
<td valign='top'><a href='/tcl/tktview/1601243'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/297.md'>297</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/297.md'>Integer Type Introspection and Conversion</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/296.md'>296</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/296.md'>Enhanced Syntax for Pair-Wise Indices</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/295.md'>295</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/295.md'>Enhance Arguments to lrange</a></td>
<td></td>
</tr>
<tr class='state-rejected type-project version-85'>
<td valign='top'><a href='./tip/294.md'>294</a></td>
<td valign='top'>Project</td>
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
<td valign='top'><a href='./tip/291.md'>291</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/291.md'>Add the &apos;platform&apos; Package to Tcl</a></td>
<td valign='top'><a href='/tcl/tktview/1600701'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/290.md'>290</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/290.md'>Registration of Custom Error Handler Scripts</a></td>
<td valign='top'><a href='/tcl/tktview/1587317'>Link</a></td>
</tr>
<tr class='state-rejected type-project version-85'>
<td valign='top'><a href='./tip/289.md'>289</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/289.md'>Revision of [lrepeat] Argument Order</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/288.md'>288</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/288.md'>Allow &quot;args&quot; Anywhere in Procedure Formal Arguments</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/287.md'>287</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/287.md'>Add a Commands for Determining Size of Buffered Data</a></td>







|


|












|


|
|

|







3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
<td valign='top'><a href='./tip/291.md'>291</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/291.md'>Add the &apos;platform&apos; Package to Tcl</a></td>
<td valign='top'><a href='/tcl/tktview/1600701'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/290.md'>290</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/290.md'>Registration of Custom Error Handler Scripts</a></td>
<td valign='top'><a href='/tcl/tktview/1587317'>Link</a></td>
</tr>
<tr class='state-rejected type-project version-85'>
<td valign='top'><a href='./tip/289.md'>289</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/289.md'>Revision of [lrepeat] Argument Order</a></td>
<td></td>
</tr>
<tr class='state-rejected type-project version-90'>
<td valign='top'><a href='./tip/288.md'>288</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/288.md'>Allow &quot;args&quot; Anywhere in Procedure Formal Arguments</a></td>
<td valign='top'><a href='/tcl/timeline?r=aspect-tip288'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/287.md'>287</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/287.md'>Add a Commands for Determining Size of Buffered Data</a></td>
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
<td valign='top'><a href='./tip/285.md'>285</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/285.md'>Script Cancellation with [interp cancel] and Tcl_CancelEval</a></td>
<td valign='top'><a href='/tcl/tktview/1499394'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/284.md'>284</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/284.md'>New &apos;invoke&apos; and &apos;namespace invoke&apos; Commands</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-284'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/283.md'>283</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/283.md'>Modify Ensemble Command Resolution Behaviour</a></td>
<td valign='top'><a href='/tcl/tktview/1577282'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/282.md'>282</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/282.md'>Enhanced Expression Syntax</a></td>
<td valign='top'><a href='/tcl/tktview/1969722'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/281.md'>281</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/281.md'>Improvements in System Error Handling</a></td>
<td valign='top'><a href='http://iocpsock.cvs.sourceforge.net/iocpsock/iocpsock/tclWinError.c?revision=HEAD&view=markup'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/280.md'>280</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/280.md'>Add Full Stack Trace Capability With Location Introspection</a></td>
<td valign='top'><a href='/tcl/tktview/1571568'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/279.md'>279</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/279.md'>Adding an Extensible Object System to the Core</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/278.md'>278</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/278.md'>Fix Variable Name Resolution Quirks</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-278'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/277.md'>277</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/277.md'>Create Namespaces as Needed</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/276.md'>276</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/276.md'>Specify and Unify Variable Linking Commands</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/275.md'>275</a></td>
<td valign='top'>Project</td>







|


|




|


|




|


|




|


|












|


|












|


|




|


|







3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
<td valign='top'><a href='./tip/285.md'>285</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/285.md'>Script Cancellation with [interp cancel] and Tcl_CancelEval</a></td>
<td valign='top'><a href='/tcl/tktview/1499394'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/284.md'>284</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/284.md'>New &apos;invoke&apos; and &apos;namespace invoke&apos; Commands</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-284'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/283.md'>283</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/283.md'>Modify Ensemble Command Resolution Behaviour</a></td>
<td valign='top'><a href='/tcl/tktview/1577282'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/282.md'>282</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/282.md'>Enhanced Expression Syntax</a></td>
<td valign='top'><a href='/tcl/tktview/1969722'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/281.md'>281</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/281.md'>Improvements in System Error Handling</a></td>
<td valign='top'><a href='http://iocpsock.cvs.sourceforge.net/iocpsock/iocpsock/tclWinError.c?revision=HEAD&view=markup'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/280.md'>280</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/280.md'>Add Full Stack Trace Capability With Location Introspection</a></td>
<td valign='top'><a href='/tcl/tktview/1571568'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/279.md'>279</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/279.md'>Adding an Extensible Object System to the Core</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-90'>
<td valign='top'><a href='./tip/278.md'>278</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/278.md'>Fix Variable Name Resolution Quirks</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-278'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/277.md'>277</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/277.md'>Create Namespaces as Needed</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/276.md'>276</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/276.md'>Specify and Unify Variable Linking Commands</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/275.md'>275</a></td>
<td valign='top'>Project</td>
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
<td valign='top'><a href='./tip/272.md'>272</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/272.md'>String and List Reversal Operations</a></td>
<td valign='top'><a href='/tcl/tktview/1545151'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/271.md'>271</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/271.md'>Windows-Style Open and Save File Dialog on Unix</a></td>
<td valign='top'><a href='/tk/tktview/1520742'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/270.md'>270</a></td>
<td valign='top'>Project</td>







|


|







3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
<td valign='top'><a href='./tip/272.md'>272</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/272.md'>String and List Reversal Operations</a></td>
<td valign='top'><a href='/tcl/tktview/1545151'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/271.md'>271</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/271.md'>Windows-Style Open and Save File Dialog on Unix</a></td>
<td valign='top'><a href='/tk/tktview/1520742'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/270.md'>270</a></td>
<td valign='top'>Project</td>
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
<td valign='top'><a href='./tip/260.md'>260</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/260.md'>Add Underline Option to Canvas Text Items</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/259.md'>259</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/259.md'>Making &apos;exec&apos; Optionally Binary Safe</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/258.md'>258</a></td>
<td valign='top'>Project</td>







|


|







3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
<td valign='top'><a href='./tip/260.md'>260</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/260.md'>Add Underline Option to Canvas Text Items</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/259.md'>259</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/259.md'>Making &apos;exec&apos; Optionally Binary Safe</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/258.md'>258</a></td>
<td valign='top'>Project</td>
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
<td valign='top'><a href='./tip/254.md'>254</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/254.md'>New Types for Tcl_LinkVar</a></td>
<td valign='top'><a href='/tcl/tktview/1242844'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/253.md'>253</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/253.md'>Consolidate Package-Related Commands</a></td>
<td></td>
</tr>
<tr class='state-rejected type-project version-86'>
<td valign='top'><a href='./tip/252.md'>252</a></td>
<td valign='top'>Project</td>







|


|







3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
<td valign='top'><a href='./tip/254.md'>254</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/254.md'>New Types for Tcl_LinkVar</a></td>
<td valign='top'><a href='/tcl/tktview/1242844'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/253.md'>253</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/253.md'>Consolidate Package-Related Commands</a></td>
<td></td>
</tr>
<tr class='state-rejected type-project version-86'>
<td valign='top'><a href='./tip/252.md'>252</a></td>
<td valign='top'>Project</td>
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/247.md'>247</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Draft</td>
<td valign='top'  colspan=2><a href='./tip/247.md'>Tcl/Tk Engineering Manual</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/246.md'>246</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/246.md'>Unify Pattern Matching</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/245.md'>245</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/245.md'>Discover User Inactivity Time</a></td>
<td valign='top'><a href='/tk/tktview/1185731'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/244.md'>244</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/244.md'>PNG Photo Image Support for Tk</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/243.md'>243</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/243.md'>Supply Find Dialog for the Text Widget</a></td>
<td valign='top'><a href='/tk/tktview/1167420'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/242.md'>242</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/242.md'>Preselect Filter on tk_get*File Dialogs</a></td>
<td valign='top'><a href='/tk/tktview/1156388'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/241.md'>241</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/241.md'>Case-Insensitive Switches and List Searching and Sorting</a></td>
<td valign='top'><a href='/tcl/tktview/1152746'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/240.md'>240</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/240.md'>An Ensemble Command to Manage Processes</a></td>
<td valign='top'><a href='/tcl/tktview/1315115'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/239.md'>239</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/239.md'>Enhance the &apos;load&apos; Command</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/238.md'>238</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/238.md'>Fire Event when Widget Created</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/237.md'>237</a></td>
<td valign='top'>Project</td>







|


|




















|


|




















|


|




|


|




|


|







3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/247.md'>247</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Draft</td>
<td valign='top'  colspan=2><a href='./tip/247.md'>Tcl/Tk Engineering Manual</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/246.md'>246</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/246.md'>Unify Pattern Matching</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/245.md'>245</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/245.md'>Discover User Inactivity Time</a></td>
<td valign='top'><a href='/tk/tktview/1185731'>Link</a></td>
</tr>
<tr class='state-final type-project version-86'>
<td valign='top'><a href='./tip/244.md'>244</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/244.md'>PNG Photo Image Support for Tk</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/243.md'>243</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/243.md'>Supply Find Dialog for the Text Widget</a></td>
<td valign='top'><a href='/tk/tktview/1167420'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/242.md'>242</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/242.md'>Preselect Filter on tk_get*File Dialogs</a></td>
<td valign='top'><a href='/tk/tktview/1156388'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/241.md'>241</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/241.md'>Case-Insensitive Switches and List Searching and Sorting</a></td>
<td valign='top'><a href='/tcl/tktview/1152746'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/240.md'>240</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/240.md'>An Ensemble Command to Manage Processes</a></td>
<td valign='top'><a href='/tcl/tktview/1315115'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/239.md'>239</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/239.md'>Enhance the &apos;load&apos; Command</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/238.md'>238</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/238.md'>Fire Event when Widget Created</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/237.md'>237</a></td>
<td valign='top'>Project</td>
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
<td valign='top'><a href='./tip/229.md'>229</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/229.md'>Scripted Control of Name Resolution in Namespaces</a></td>
<td valign='top'><a href='/tcl/tktview/1159942'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/228.md'>228</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/228.md'>Tcl Filesystem Reflection API</a></td>
<td valign='top'><a href='http://sourceforge.net/projects/tclvfs/'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/227.md'>227</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/227.md'>Interface to Get and Set the Return Options of an Interpreter</a></td>
<td valign='top'><a href='/tcl/tktview/1060579'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/226.md'>226</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/226.md'>Interface to Save and Restore Interpreter State</a></td>
<td valign='top'><a href='/tcl/tktview/1060579'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/225.md'>225</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/225.md'>Arithmetic Series with Optimized Space Complexity</a></td>
<td valign='top'><a href='/tcl/tktview/1052584'>Link</a></td>
</tr>
<tr class='state-rejected type-project version-87'>
<td valign='top'><a href='./tip/224.md'>224</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>







|


|




















|



|







3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
<td valign='top'><a href='./tip/229.md'>229</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/229.md'>Scripted Control of Name Resolution in Namespaces</a></td>
<td valign='top'><a href='/tcl/tktview/1159942'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/228.md'>228</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/228.md'>Tcl Filesystem Reflection API</a></td>
<td valign='top'><a href='http://sourceforge.net/projects/tclvfs/'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/227.md'>227</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/227.md'>Interface to Get and Set the Return Options of an Interpreter</a></td>
<td valign='top'><a href='/tcl/tktview/1060579'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/226.md'>226</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/226.md'>Interface to Save and Restore Interpreter State</a></td>
<td valign='top'><a href='/tcl/tktview/1060579'>Link</a></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/225.md'>225</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/225.md'>Arithmetic Series with Optimized Space Complexity</a></td>
<td valign='top'><a href='/tcl/tktview/1052584'>Link</a></td>
</tr>
<tr class='state-rejected type-project version-87'>
<td valign='top'><a href='./tip/224.md'>224</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
<td valign='top'><a href='./tip/221.md'>221</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/221.md'>Allow Background Error Handlers to Accept Return Options</a></td>
<td valign='top'><a href='/tcl/tktview/1060579'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/220.md'>220</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/220.md'>Escalate Privileges in VFS Close Callback</a></td>
<td valign='top'><a href='/tcl/tktview/1057093'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/219.md'>219</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/219.md'>Tcl Channel Reflection API</a></td>







|



|

|







3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
<td valign='top'><a href='./tip/221.md'>221</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/221.md'>Allow Background Error Handlers to Accept Return Options</a></td>
<td valign='top'><a href='/tcl/tktview/1060579'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/220.md'>220</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/220.md'>Escalate Privileges in VFS Close Callback</a></td>
<td valign='top'><a href='/tcl/timeline?r=tip-220'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/219.md'>219</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/219.md'>Tcl Channel Reflection API</a></td>
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
<td valign='top'><a href='./tip/217.md'>217</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/217.md'>Getting Sorted Indices out of Lsort</a></td>
<td valign='top'><a href='/tcl/tktview/1017532'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/216.md'>216</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/216.md'>Handling Command-Line Options in Tclsh and Wish</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/215.md'>215</a></td>
<td valign='top'>Project</td>







|


|







3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
<td valign='top'><a href='./tip/217.md'>217</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/217.md'>Getting Sorted Indices out of Lsort</a></td>
<td valign='top'><a href='/tcl/tktview/1017532'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/216.md'>216</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/216.md'>Handling Command-Line Options in Tclsh and Wish</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/215.md'>215</a></td>
<td valign='top'>Project</td>
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
<td valign='top'><a href='./tip/194.md'>194</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/194.md'>Procedures as Values via &apos;&apos;&apos;apply&apos;&apos;&apos;</a></td>
<td valign='top'><a href='/tcl/tktview/944803'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/193.md'>193</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/193.md'>Simple Syntax Help System</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/192.md'>192</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/192.md'>Lazy Lists</a></td>
<td></td>
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/191.md'>191</a></td>
<td valign='top' colspan=2>Informational</td>







|


|




|


|







4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
<td valign='top'><a href='./tip/194.md'>194</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/194.md'>Procedures as Values via &apos;&apos;&apos;apply&apos;&apos;&apos;</a></td>
<td valign='top'><a href='/tcl/tktview/944803'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/193.md'>193</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/193.md'>Simple Syntax Help System</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/192.md'>192</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/192.md'>Lazy Lists</a></td>
<td></td>
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/191.md'>191</a></td>
<td valign='top' colspan=2>Informational</td>
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
<td valign='top'><a href='./tip/187.md'>187</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/187.md'>Procedures as Values</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/186.md'>186</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/186.md'>Expose the Type and Modified-State of Widget Options</a></td>
<td valign='top'><a href='http://pdqi.com/configure.diff.gz'>Link</a></td>
</tr>
<tr class='state-rejected type-project version-86'>
<td valign='top'><a href='./tip/185.md'>185</a></td>
<td valign='top'>Project</td>







|


|







4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
<td valign='top'><a href='./tip/187.md'>187</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/187.md'>Procedures as Values</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/186.md'>186</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/186.md'>Expose the Type and Modified-State of Widget Options</a></td>
<td valign='top'><a href='http://pdqi.com/configure.diff.gz'>Link</a></td>
</tr>
<tr class='state-rejected type-project version-86'>
<td valign='top'><a href='./tip/185.md'>185</a></td>
<td valign='top'>Project</td>
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
<td valign='top'><a href='./tip/181.md'>181</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/181.md'>Add a [namespace unknown] Command</a></td>
<td valign='top'><a href='/tcl/tktview/958222'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/180.md'>180</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/180.md'>Add a Megawidget Support Core Package</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/179.md'>179</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/179.md'>Add -hide Option to panedwindow Widget</a></td>
<td valign='top'><a href='ftp://ftp.model.com/pub/tcl/pw_hide_TIP.tgz'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/178.md'>178</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/178.md'>[info pid] and [info tid] Subcommands</a></td>
<td valign='top'><a href='/tcl/tktview/920731ffffffffffffff'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/177.md'>177</a></td>
<td valign='top'>Project</td>







|


|












|


|







4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
<td valign='top'><a href='./tip/181.md'>181</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/181.md'>Add a [namespace unknown] Command</a></td>
<td valign='top'><a href='/tcl/tktview/958222'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/180.md'>180</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/180.md'>Add a Megawidget Support Core Package</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/179.md'>179</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/179.md'>Add -hide Option to panedwindow Widget</a></td>
<td valign='top'><a href='ftp://ftp.model.com/pub/tcl/pw_hide_TIP.tgz'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/178.md'>178</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/178.md'>[info pid] and [info tid] Subcommands</a></td>
<td valign='top'><a href='/tcl/tktview/920731ffffffffffffff'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/177.md'>177</a></td>
<td valign='top'>Project</td>
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
<td valign='top'><a href='./tip/171.md'>171</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/171.md'>Change Default &lt;MouseWheel&gt; Bindings Behavior</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/170.md'>170</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/170.md'>Better Support for Nested Lists</a></td>
<td valign='top'><a href='http://nac.sf.net/'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/169.md'>169</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/169.md'>Add Peer Text Widgets</a></td>
<td valign='top'><a href='/tk/tktview/994629'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/168.md'>168</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/168.md'>Cubic Bezier Curves on the Canvas</a></td>
<td valign='top'><a href='/tk/tktview/886240'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/167.md'>167</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/167.md'>Add a New Option for Context Help for Windows</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-167'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/166.md'>166</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>







|



|



















|


|
|







4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
<td valign='top'><a href='./tip/171.md'>171</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.6</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/171.md'>Change Default &lt;MouseWheel&gt; Bindings Behavior</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-project version-87'>
<td valign='top'><a href='./tip/170.md'>170</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/170.md'>Better Support for Nested Lists</a></td>
<td valign='top'><a href='http://nac.sf.net/'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/169.md'>169</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/169.md'>Add Peer Text Widgets</a></td>
<td valign='top'><a href='/tk/tktview/994629'>Link</a></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/168.md'>168</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/168.md'>Cubic Bezier Curves on the Canvas</a></td>
<td valign='top'><a href='/tk/tktview/886240'>Link</a></td>
</tr>
<tr class='state-rejected type-project version-90'>
<td valign='top'><a href='./tip/167.md'>167</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Rejected</td>
<td valign='top' ><a href='./tip/167.md'>Add a New Option for Context Help for Windows</a></td>
<td valign='top'><a href='/tk/timeline?r=tip-167'>Link</a></td>
</tr>
<tr class='state-final type-project version-87'>
<td valign='top'><a href='./tip/166.md'>166</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
<td valign='top'><a href='./tip/155.md'>155</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/155.md'>Fix Some of the Text Widget&apos;s Limitations</a></td>
<td valign='top'><a href='/tk/tktview/791292'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/154.md'>154</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/154.md'>Add Named Colors to Tk</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/153.md'>153</a></td>
<td valign='top'>Project</td>







|


|







4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
<td valign='top'><a href='./tip/155.md'>155</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/155.md'>Fix Some of the Text Widget&apos;s Limitations</a></td>
<td valign='top'><a href='/tk/tktview/791292'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/154.md'>154</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/154.md'>Add Named Colors to Tk</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/153.md'>153</a></td>
<td valign='top'>Project</td>
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
<td valign='top'><a href='./tip/151.md'>151</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/151.md'>Remove -e: Command Line Option from tclsh and wish</a></td>
<td></td>
</tr>
<tr class='state-deferred type-project version-85'>
<td valign='top'><a href='./tip/150.md'>150</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Deferred</td>
<td valign='top' ><a href='./tip/150.md'>Implement the Tk send Command for Windows</a></td>
<td></td>
</tr>
<tr class='state-withdrawn type-project version-85'>
<td valign='top'><a href='./tip/149.md'>149</a></td>
<td valign='top'>Project</td>







|


|







4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
<td valign='top'><a href='./tip/151.md'>151</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/151.md'>Remove -e: Command Line Option from tclsh and wish</a></td>
<td></td>
</tr>
<tr class='state-deferred type-project version-87'>
<td valign='top'><a href='./tip/150.md'>150</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Deferred</td>
<td valign='top' ><a href='./tip/150.md'>Implement the Tk send Command for Windows</a></td>
<td></td>
</tr>
<tr class='state-withdrawn type-project version-85'>
<td valign='top'><a href='./tip/149.md'>149</a></td>
<td valign='top'>Project</td>
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
<td valign='top'><a href='./tip/141.md'>141</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/141.md'>Multiple Initial-Files in [tk_getOpenFile]</a></td>
<td valign='top'><a href='/tk/tktview/657656'>Link</a></td>
</tr>
<tr class='state-deferred type-project version-85'>
<td valign='top'><a href='./tip/140.md'>140</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Deferred</td>
<td valign='top' ><a href='./tip/140.md'>Tracing Namespace Modifications</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/139.md'>139</a></td>
<td valign='top'>Project</td>







|


|







4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
<td valign='top'><a href='./tip/141.md'>141</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/141.md'>Multiple Initial-Files in [tk_getOpenFile]</a></td>
<td valign='top'><a href='/tk/tktview/657656'>Link</a></td>
</tr>
<tr class='state-deferred type-project version-91'>
<td valign='top'><a href='./tip/140.md'>140</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Deferred</td>
<td valign='top' ><a href='./tip/140.md'>Tracing Namespace Modifications</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/139.md'>139</a></td>
<td valign='top'>Project</td>
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
<td valign='top'><a href='./tip/134.md'>134</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/134.md'>Subsystem Per-Thread Data Interfaces</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/133.md'>133</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/133.md'>Extending [expr] Operators</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/132.md'>132</a></td>
<td valign='top'>Project</td>







|


|







4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
<td valign='top'><a href='./tip/134.md'>134</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/134.md'>Subsystem Per-Thread Data Interfaces</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/133.md'>133</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/133.md'>Extending [expr] Operators</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/132.md'>132</a></td>
<td valign='top'>Project</td>
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
<td valign='top'><a href='./tip/127.md'>127</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/127.md'>Add an -index Option to [lsearch]</a></td>
<td valign='top'><a href='/tcl/tktview/693836'>Link</a></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/126.md'>126</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/126.md'>Rich Strings for Representation Persistence</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/125.md'>125</a></td>
<td valign='top'>Project</td>







|


|







4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
<td valign='top'><a href='./tip/127.md'>127</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/127.md'>Add an -index Option to [lsearch]</a></td>
<td valign='top'><a href='/tcl/tktview/693836'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/126.md'>126</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/126.md'>Rich Strings for Representation Persistence</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-85'>
<td valign='top'><a href='./tip/125.md'>125</a></td>
<td valign='top'>Project</td>
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
<td valign='top'><a href='./tip/87.md'>87</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.4</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/87.md'>Allow Tcl Access to the Recursion Limit</a></td>
<td valign='top'><a href='/tcl/tktview/522849'>Link</a></td>
</tr>
<tr class='state-draft type-project version-87'>
<td valign='top'><a href='./tip/86.md'>86</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.7</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/86.md'>Improved Debugger Support</a></td>
<td valign='top'><a href='http://pdqi.com/download/tclline-8.4.9.diff.gz'>Link</a></td>
</tr>
<tr class='state-final type-project version-84'>
<td valign='top'><a href='./tip/85.md'>85</a></td>
<td valign='top'>Project</td>







|


|







4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
<td valign='top'><a href='./tip/87.md'>87</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.4</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/87.md'>Allow Tcl Access to the Recursion Limit</a></td>
<td valign='top'><a href='/tcl/tktview/522849'>Link</a></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/86.md'>86</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/86.md'>Improved Debugger Support</a></td>
<td valign='top'><a href='http://pdqi.com/download/tclline-8.4.9.diff.gz'>Link</a></td>
</tr>
<tr class='state-final type-project version-84'>
<td valign='top'><a href='./tip/85.md'>85</a></td>
<td valign='top'>Project</td>
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
<td valign='top'><a href='./tip/70.md'>70</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/70.md'>A Relational Switch Control Structure</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-90'>
<td valign='top'><a href='./tip/69.md'>69</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/69.md'>Improvements for the Tcl Hash Table</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-84'>
<td valign='top'><a href='./tip/68.md'>68</a></td>
<td valign='top'>Project</td>







|


|







5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
<td valign='top'><a href='./tip/70.md'>70</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Withdrawn</td>
<td valign='top' ><a href='./tip/70.md'>A Relational Switch Control Structure</a></td>
<td></td>
</tr>
<tr class='state-draft type-project version-91'>
<td valign='top'><a href='./tip/69.md'>69</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.1</td>
<td valign='top'>Draft</td>
<td valign='top' ><a href='./tip/69.md'>Improvements for the Tcl Hash Table</a></td>
<td></td>
</tr>
<tr class='state-final type-project version-84'>
<td valign='top'><a href='./tip/68.md'>68</a></td>
<td valign='top'>Project</td>
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
<td valign='top'><a href='./tip/32.md'>32</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.4a4</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/32.md'>Add Tcl_Obj-enabled counterpart to Tcl_CreateTrace</a></td>
<td></td>
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/31.md'>31</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Draft</td>
<td valign='top'  colspan=2><a href='./tip/31.md'>CVS tags in the Tcl and Tk repositories</a></td>
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/30.md'>30</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Draft</td>
<td valign='top'  colspan=2><a href='./tip/30.md'>Tk Toolkit Maintainer Assignments</a></td>
</tr>
<tr class='state-rejected type-project version-90'>
<td valign='top'><a href='./tip/29.md'>29</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Rejected</td>







|


|


|


|







5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
<td valign='top'><a href='./tip/32.md'>32</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.4a4</td>
<td valign='top'>Final</td>
<td valign='top' ><a href='./tip/32.md'>Add Tcl_Obj-enabled counterpart to Tcl_CreateTrace</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-informational'>
<td valign='top'><a href='./tip/31.md'>31</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Obsoleted</td>
<td valign='top'  colspan=2><a href='./tip/31.md'>CVS tags in the Tcl and Tk repositories</a></td>
</tr>
<tr class='state-obsoleted type-informational'>
<td valign='top'><a href='./tip/30.md'>30</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Obsoleted</td>
<td valign='top'  colspan=2><a href='./tip/30.md'>Tk Toolkit Maintainer Assignments</a></td>
</tr>
<tr class='state-rejected type-project version-90'>
<td valign='top'><a href='./tip/29.md'>29</a></td>
<td valign='top'>Project</td>
<td valign='top'>9.0</td>
<td valign='top'>Rejected</td>
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
<td valign='top'><a href='./tip/25.md'>25</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/25.md'>Native tk_messageBox  on Macintosh</a></td>
<td></td>
</tr>
<tr class='state-draft type-informational'>
<td valign='top'><a href='./tip/24.md'>24</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Draft</td>
<td valign='top'  colspan=2><a href='./tip/24.md'>Tcl Maintainer Assignments</a></td>
</tr>
<tr class='state-accepted type-process'>
<td valign='top'><a href='./tip/23.md'>23</a></td>
<td valign='top' colspan=2>Process</td>
<td valign='top'>Accepted</td>
<td valign='top'  colspan=2><a href='./tip/23.md'>Tk Toolkit Functional Areas for Maintainer Assignments</a></td>







|


|







5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
<td valign='top'><a href='./tip/25.md'>25</a></td>
<td valign='top'>Project</td>
<td valign='top'>8.5</td>
<td valign='top'>Obsoleted</td>
<td valign='top' ><a href='./tip/25.md'>Native tk_messageBox  on Macintosh</a></td>
<td></td>
</tr>
<tr class='state-obsoleted type-informational'>
<td valign='top'><a href='./tip/24.md'>24</a></td>
<td valign='top' colspan=2>Informational</td>
<td valign='top'>Obsoleted</td>
<td valign='top'  colspan=2><a href='./tip/24.md'>Tcl Maintainer Assignments</a></td>
</tr>
<tr class='state-accepted type-process'>
<td valign='top'><a href='./tip/23.md'>23</a></td>
<td valign='top' colspan=2>Process</td>
<td valign='top'>Accepted</td>
<td valign='top'  colspan=2><a href='./tip/23.md'>Tk Toolkit Functional Areas for Maintainer Assignments</a></td>

Changes to scripts/mkhtmlindex.tcl.

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
<option value='d'>Docs</option>
<option value='t'>Tickets</option>
</select>
<input type="submit" value="Search">
</div></form>
<p>

<style title="filtering">
/*
 * DO NOT MANUALLY PUT ANY STYLES IN HERE!
 *
 * This is manipulated by JS and it makes a lot of assumptions about the
 * structure of this stylesheet. Use a different stylesheet instead!
 */
</style>
<script>
var sheet = (function(){
    for (var i=0; i<document.styleSheets.length; i++) {
        var s = document.styleSheets[i];
        if (s.title == "filtering") {
            return s;
        }
    }
})();
function toggleFacet(f) {
    r = sheet.cssRules;
    if (!r) return
    boxes = document.getElementsByClassName("toggler-"+f);
    none = true;
    for (i=0; i<boxes.length; i++) {
        if (boxes[i].checked) {
            none=false;
            break;
        }
    }
    var i = r.length;
    while (i--) {
        if (r[i].selectorText && r[i].selectorText.substr(1,f.length).toLowerCase() === f) {
            sheet.deleteRule(i);
        }
    }
    if (!none) {
        for (i=0; i<boxes.length; i++) {
            if (boxes[i].checked) {
                // sheet.insertRule("."+f+"-"+boxes[i].dataset.value + " {display:table-row;}", 0);
	    } else {
                sheet.insertRule("."+f+"-"+boxes[i].dataset.value + " {display:none;}", 0);
            }
        }
    }
}
</script>

#TOGGLES#

</div>
<p>

<div style="float:right; font-size:10pt" class="tipindex key">







|







|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50




































51
52
53
54
55
56
57
<option value='d'>Docs</option>
<option value='t'>Tickets</option>
</select>
<input type="submit" value="Search">
</div></form>
<p>

<style id="facetFilteringSheet">
/*
 * DO NOT MANUALLY PUT ANY STYLES IN HERE!
 *
 * This is manipulated by JS and it makes a lot of assumptions about the
 * structure of this stylesheet. Use a different stylesheet instead!
 */
</style>
<script src="scripts/toggles.js"></script>





































#TOGGLES#

</div>
<p>

<div style="float:right; font-size:10pt" class="tipindex key">
289
290
291
292
293
294
295


296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
    unset -nocomplain fields
    set lines [loadTIPPreamble $number]

    parsePreamble $lines fields
    writeRow $number fields
}



set button {
    <input class="toggler-#FACET#"
        data-value="#VALUE#"
        type="checkbox"
        onclick="toggleFacet('#FACET#')">#TITLE#</button>
}
set TOGGLES ""
set STYLES ""
dict for {axis values} $toggles {
    appendn TOGGLES "[string totitle $axis]:"
    foreach val [lsort [dict keys $values]] {
        set map [list]
        lappend map #FACET# $axis
        lappend map #VALUE# [string tolower $val]
        lappend map #TITLE# [regsub {^(\d)(\d)$} [string totitle $val] {\1.\2}]
        appendn TOGGLES [string map $map $button]
        appendn STYLES ".$axis-[string tolower $val] {display: table-row }"
    }
    appendn TOGGLES "<br>"







>
>

|
<
<
<






|







253
254
255
256
257
258
259
260
261
262
263



264
265
266
267
268
269
270
271
272
273
274
275
276
277
    unset -nocomplain fields
    set lines [loadTIPPreamble $number]

    parsePreamble $lines fields
    writeRow $number fields
}

# Careful; the button HTML must not have spaces at the start of the line with
# some versions of fossil.
set button {
<input class="toggler-#FACET#" data-value="#VALUE#" type="checkbox">#TITLE#</input>



}
set TOGGLES ""
set STYLES ""
dict for {axis values} $toggles {
    appendn TOGGLES "[string totitle $axis]:"
    foreach val [lsort [dict keys $values]] {
        set map [list "\n" " "]
        lappend map #FACET# $axis
        lappend map #VALUE# [string tolower $val]
        lappend map #TITLE# [regsub {^(\d)(\d)$} [string totitle $val] {\1.\2}]
        appendn TOGGLES [string map $map $button]
        appendn STYLES ".$axis-[string tolower $val] {display: table-row }"
    }
    appendn TOGGLES "<br>"

Changes to scripts/tiptoc.tcl.

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
proc usage {} {
    puts stderr "\nUsage: [file tail [info nameofexecutable]] $::argv0 COMMAND TIPFILE ..."
    puts stderr "COMMAND may be add or remove."
    puts stderr "add - A Table of Contents is added/updated for each file"
    puts stderr "remove - All Table of Contents markup is removed from each file"
    puts stderr "\nIn both cases, a backup is made of the file"
    exit 1
}






proc insert_toc {command tipfile} {
    if {$command ni {add remove}} {
        puts stderr "Error: Unknown command '$command'"
        usage
    }

    set bak "[file rootname $tipfile]-[clock format [clock seconds] -format %a,%H%M%S].bak"
    file copy -force -- $tipfile $bak
    puts stderr "$tipfile backed up to $bak"

    # Open in binary mode so we preserve existing line ending style
    set fd [open $tipfile rb]
    set lines [split [read $fd] \n]
    close $fd

    set toc {}
    set header {}
    set content {}
    set anchor_id 1








>
>
>
>
>











<
|







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
proc usage {} {
    puts stderr "\nUsage: [file tail [info nameofexecutable]] $::argv0 COMMAND TIPFILE ..."
    puts stderr "COMMAND may be add or remove."
    puts stderr "add - A Table of Contents is added/updated for each file"
    puts stderr "remove - All Table of Contents markup is removed from each file"
    puts stderr "\nIn both cases, a backup is made of the file"
    exit 1
}

proc make_anchor {text} {
    # A (very) poor man's implementation
    return [regsub -all {[^-[:alnum:]_]} $text ""]
}

proc insert_toc {command tipfile} {
    if {$command ni {add remove}} {
        puts stderr "Error: Unknown command '$command'"
        usage
    }

    set bak "[file rootname $tipfile]-[clock format [clock seconds] -format %a,%H%M%S].bak"
    file copy -force -- $tipfile $bak
    puts stderr "$tipfile backed up to $bak"


    set fd [open $tipfile r]
    set lines [split [read $fd] \n]
    close $fd

    set toc {}
    set header {}
    set content {}
    set anchor_id 1
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
                    set state PARSE_CONTENT
                }
            }
            PARSE_CONTENT {
                if {[regexp {^\s*<!-- TOC BEGIN .*-->} $line]} {
                    # Start of old existing ToC. Throw it away
                    set state SKIP_TOC
                } elseif {[regexp {^(#+)\s*(<a id='toc-\d+'></a>)?(.*)$} $line -> level anchor text]} {
                    # Section heading
                    incr anchor_id
                    lappend toc $anchor_id [string length $level] $text
                    if {$command eq "add"} {
                        lappend content "$level <a id='toc-$anchor_id'></a>$text"
                    } else {
                        lappend content "$level $text"
                    }
                } else {
                    # Regular line
                    lappend content $line
                }
            }
        }
    }

    # Output the header
    set fd [open $tipfile wb]

    puts $fd [join $header \n]
    if {$command eq "add"} {
        # Output ToC as a nested list
        puts $fd "<!-- TOC BEGIN (auto generated with tiptoc) -->"
        foreach {anchor_id level text} $toc {
            set indent [string repeat "    " [incr level -1]]
            puts $fd "${indent}* <a href='#toc-$anchor_id'>$text</a>"
        }
        puts $fd "\n<!-- TOC END -->"
    }
    puts $fd [join $content \n]
    close $fd

    puts stderr "$tipfile updated"
}

if {[llength $argv] < 2} usage
foreach arg [lrange $argv 1 end] {
    insert_toc [lindex $argv 0] $arg
}







|

|


|












|
>






|













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
                    set state PARSE_CONTENT
                }
            }
            PARSE_CONTENT {
                if {[regexp {^\s*<!-- TOC BEGIN .*-->} $line]} {
                    # Start of old existing ToC. Throw it away
                    set state SKIP_TOC
                } elseif {[regexp {^(#+)\s*(<a id='.+'></a>)?(.*)$} $line -> level anchor text]} {
                    # Section heading
                    set anchor_id [make_anchor $text]
                    lappend toc $anchor_id [string length $level] $text
                    if {$command eq "add"} {
                        lappend content "$level <a id='$anchor_id'></a>$text"
                    } else {
                        lappend content "$level $text"
                    }
                } else {
                    # Regular line
                    lappend content $line
                }
            }
        }
    }

    # Output the header
    set fd [open $tipfile w]
    fconfigure $fd -translation lf
    puts $fd [join $header \n]
    if {$command eq "add"} {
        # Output ToC as a nested list
        puts $fd "<!-- TOC BEGIN (auto generated with tiptoc) -->"
        foreach {anchor_id level text} $toc {
            set indent [string repeat "    " [incr level -1]]
            puts $fd "${indent}* <a href='#$anchor_id'>$text</a>"
        }
        puts $fd "\n<!-- TOC END -->"
    }
    puts $fd [join $content \n]
    close $fd

    puts stderr "$tipfile updated"
}

if {[llength $argv] < 2} usage
foreach arg [lrange $argv 1 end] {
    insert_toc [lindex $argv 0] $arg
}

Added scripts/toggles.js.





























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
// This file implements the filtering toggle boxes used on the main index page.

var sheet = (function() {
    var s = document.getElementById("facetFilteringSheet");
    return s.sheet ? s.sheet : s.styleSheet;
})();

function isChecked(boxes) {
    for (var i = 0 ; i < boxes.length; i++) {
        if (boxes[i].checked) {
            return false;
        }
    }
    return true;
};

function clearFacetClasses(facet) {
    var r = sheet.cssRules;
    // Must go through the rules backwards to keep indices consistent
    for (var i = r.length; i--; ) {
        var sel = r[i].selectorText;
        if (sel && sel.substr(1, facet.length).toLowerCase() === facet) {
            sheet.deleteRule(i);
        }
    }
};

function addFacetClasses(boxes, facet) {
    for (var i = 0; i < boxes.length; i++) {
        var ruleClass = facet + "-" + boxes[i].dataset.value;
        if (boxes[i].checked) {
            // sheet.insertRule("."+ruleClass + " {display:table-row;}", 0);
        } else {
            sheet.insertRule("." + ruleClass + " {display:none;}", 0);
        }
    }
};

function toggleFacet(facet) {
    if (!sheet.cssRules) {
        return;
    }
    var boxes = document.getElementsByClassName("toggler-" + facet);
    var none = isChecked(boxes);
    clearFacetClasses(facet);
    if (!none) {
        addFacetClasses(boxes, facet);
    }
};

function installToggleHandler(facet) {
    var boxes = document.getElementsByClassName("toggler-" + facet);
    for (var i = 0; i < boxes.length; i++) {
        boxes[i].onclick = (function() { toggleFacet(facet); });
    }
};

window.onload = function() {
    installToggleHandler("state");
    installToggleHandler("type");
    installToggleHandler("version");
};

Changes to tip/126.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 126: Rich Strings for Representation Persistence
	Created:	30-Jan-2003
	Author:		Donal K. Fellows <[email protected]>
	Type:		Project
	Tcl-Version:	9.0
	Vote:		Pending
	State:		Draft
	Post-History:	
-----

# Abstract





|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 126: Rich Strings for Representation Persistence
	Created:	30-Jan-2003
	Author:		Donal K. Fellows <[email protected]>
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	State:		Draft
	Post-History:	
-----

# Abstract

Changes to tip/133.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 133: Extending [expr] Operators
	Author:         Richard Suchenwirth <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Apr-2003
	Post-History:   
	Tcl-Version:    8.7
-----

# Abstract

This TIP proposes a way to define new operators for conditions and the
**expr** command.  It also includes demonstrations of how it might work
in the examples: **in** tests inclusion in a list, and **and**,







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 133: Extending [expr] Operators
	Author:         Richard Suchenwirth <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Apr-2003
	Post-History:   
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes a way to define new operators for conditions and the
**expr** command.  It also includes demonstrations of how it might work
in the examples: **in** tests inclusion in a list, and **and**,

Changes to tip/136.md.

1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
# TIP 136: Large List Initialisation
	Author:         Simon Geard <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        25-May-2003
	Post-History:   
	Tcl-Version:    8.5

	Implementation-URL: http://homepage.ntlworld.com/whiteowl/tcl/tcl843-lrepeat.patch
-----

# Abstract

This TIP proposes the addition of a list initialisation command so
that large lists can be easily and efficiently initialised.








>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 136: Large List Initialisation
	Author:         Simon Geard <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        25-May-2003
	Post-History:   
	Tcl-Version:    8.5
	Obsoletes:      170
	Implementation-URL: http://homepage.ntlworld.com/whiteowl/tcl/tcl843-lrepeat.patch
-----

# Abstract

This TIP proposes the addition of a list initialisation command so
that large lists can be easily and efficiently initialised.

Changes to tip/140.md.

1
2
3
4
5
6
7
8
9
10
11
# TIP 140: Tracing Namespace Modifications
	State:		Deferred
	Type:		Project
	Tcl-Version:	8.5
	Vote:		Pending
	Post-History:	
	Author:		Donal K. Fellows <[email protected]>
	Created:	04-Jun-2003
-----

# Abstract



|







1
2
3
4
5
6
7
8
9
10
11
# TIP 140: Tracing Namespace Modifications
	State:		Deferred
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Post-History:	
	Author:		Donal K. Fellows <[email protected]>
	Created:	04-Jun-2003
-----

# Abstract

Changes to tip/150.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
# TIP 150: Implement the Tk send Command for Windows
	Author:         Pat Thoyts <[email protected]>
	Type:           Project
	State:		Deferred
	Vote:		Done
	Tcl-Version:    8.5
	Keywords:       tk, send
	Created:        25-Jul-2003
	Post-History:	
-----

# Abstract






|







1
2
3
4
5
6
7
8
9
10
11
12
13
# TIP 150: Implement the Tk send Command for Windows
	Author:         Pat Thoyts <[email protected]>
	Type:           Project
	State:		Deferred
	Vote:		Done
	Tcl-Version:    8.7
	Keywords:       tk, send
	Created:        25-Jul-2003
	Post-History:	
-----

# Abstract

Changes to tip/154.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 154: Add Named Colors to Tk
	Author:         Damon Courtney <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        03-Sep-2003
	Post-History:   
	Tcl-Version:    8.7
-----

# Abstract

This TIP proposes the addition of a **color** command at the Tk level to
allow developers to create named colors as they can already do with both fonts
and images.







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 154: Add Named Colors to Tk
	Author:         Damon Courtney <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        03-Sep-2003
	Post-History:   
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes the addition of a **color** command at the Tk level to
allow developers to create named colors as they can already do with both fonts
and images.

Changes to tip/167.md.

1
2
3
4
5
6
7
8
9




10
11
12
13
14
15
16
# TIP 167: Add a New Option for Context Help for Windows
	Author:         Ramon Ribó <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        19-Nov-2003
	Post-History:   
	Tcl-Version:    8.7
	Tk-Branch:      tip-167




-----

# Abstract

This TIP proposes adding a new option to **wm attributes** for the
Windows version of Tk that offers contextual help in that window.
Additionally, a new event type `<<Help>>` is defined, that will be


|

|


|

>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# TIP 167: Add a New Option for Context Help for Windows
	Author:         Ramon Ribó <[email protected]>
	State:          Rejected
	Type:           Project
	Vote:           Done
	Created:        19-Nov-2003
	Post-History:   
	Tcl-Version:    9.0
	Tk-Branch:      tip-167
	Vote-Summary:   Rejected 1/2/1
	Votes-For:      KW
	Votes-Against:  FV, JN
	Votes-Present:  SL
-----

# Abstract

This TIP proposes adding a new option to **wm attributes** for the
Windows version of Tk that offers contextual help in that window.
Additionally, a new event type `<<Help>>` is defined, that will be
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
one window \(this latter case only for bindings in the toplevel\).

The event will support the usual `%W`, `%x`, `%y` substitutions and other
values.

# Reference Implementation

[Tk branch `tip-167`](/tk/timeline?r=tip-167)
<http://sf.net/tracker/?func=detail&atid=312997&aid=845248&group_id=12997>

# Comments

It is preferable to use a virtual event `<<Help>>` instead of extending the set of X events.  \(In particular, adding a new `<Help>` event means there has to be a new **HelpMask** bit flag to select for it, and we're running out of event mask bits\).

# Copyright

This document has been placed in the public domain.







|
|








69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
one window \(this latter case only for bindings in the toplevel\).

The event will support the usual `%W`, `%x`, `%y` substitutions and other
values.

# Reference Implementation

[Tk branch `tip-167`](https://core.tcl-lang.org/tk/timeline?r=tip-167) or
[Sourceforge #145](https://sourceforge.net/p/tktoolkit/patches/145/)

# Comments

It is preferable to use a virtual event `<<Help>>` instead of extending the set of X events.  \(In particular, adding a new `<Help>` event means there has to be a new **HelpMask** bit flag to select for it, and we're running out of event mask bits\).

# Copyright

This document has been placed in the public domain.

Changes to tip/170.md.

1
2
3
4
5
6
7
8
9
10



11
12
13
14
15
16
17
# TIP 170: Better Support for Nested Lists
	Author:         Sergey Babkin <[email protected]>
	Author:         Don Porter <[email protected]>
	Author:		Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        30-Jan-2004
	Post-History:   
	Tcl-Version:    8.7



	Implementation-URL: http://nac.sf.net/
-----

# Abstract

Nested lists are easy to create with Tcl but then manipulating them is not
easy. For example, think about how to change a value nested in a list 2 levels










>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# TIP 170: Better Support for Nested Lists
	Author:         Sergey Babkin <[email protected]>
	Author:         Don Porter <[email protected]>
	Author:		Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        30-Jan-2004
	Post-History:   
	Tcl-Version:    8.7
	Obsoleted-By:	22
	Obsoleted-By:	136
	Obsoleted-By:	157
	Implementation-URL: http://nac.sf.net/
-----

# Abstract

Nested lists are easy to create with Tcl but then manipulating them is not
easy. For example, think about how to change a value nested in a list 2 levels

Changes to tip/178.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 178: [info pid] and [info tid] Subcommands
	Author:         Joe Mistachkin <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        21-Mar-2004
	Post-History:   
	Tcl-Version:    8.7
	Tcl-Ticket:     920731ffffffffffffff
-----

# Abstract

This TIP proposes two new **info** subcommands which are used to
obtain the current process and thread identifiers.







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 178: [info pid] and [info tid] Subcommands
	Author:         Joe Mistachkin <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        21-Mar-2004
	Post-History:   
	Tcl-Version:    9.1
	Tcl-Ticket:     920731ffffffffffffff
-----

# Abstract

This TIP proposes two new **info** subcommands which are used to
obtain the current process and thread identifiers.

Changes to tip/180.md.

1
2
3
4
5
6
7
8
9
10
# TIP 180: Add a Megawidget Support Core Package
	Author:		Damon Courtney <[email protected]>
	Tcl-Version:	8.7
	Created:	22-Mar-2003
	Type:		Project
	State:		Draft
	Vote:		Pending
	Post-History:	
	Keywords:	Tk
-----


|







1
2
3
4
5
6
7
8
9
10
# TIP 180: Add a Megawidget Support Core Package
	Author:		Damon Courtney <[email protected]>
	Tcl-Version:	9.1
	Created:	22-Mar-2003
	Type:		Project
	State:		Draft
	Vote:		Pending
	Post-History:	
	Keywords:	Tk
-----

Changes to tip/186.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 186: Expose the Type and Modified-State of Widget Options
	Author:         Peter MacDonald <[email protected]>
	Author:         Peter MacDonald <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        16-Apr-2004
	Post-History:   
	Keywords:       Tk
	Tcl-Version:    8.7
	Implementation-URL: http://pdqi.com/configure.diff.gz
-----

# Abstract

This TIP adds a 6th \(and 7th element\) to each option in the output of
[_path_ **configure**] for Tk widgets, indicating the type and









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 186: Expose the Type and Modified-State of Widget Options
	Author:         Peter MacDonald <[email protected]>
	Author:         Peter MacDonald <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        16-Apr-2004
	Post-History:   
	Keywords:       Tk
	Tcl-Version:    9.1
	Implementation-URL: http://pdqi.com/configure.diff.gz
-----

# Abstract

This TIP adds a 6th \(and 7th element\) to each option in the output of
[_path_ **configure**] for Tk widgets, indicating the type and

Changes to tip/192.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 192: Lazy Lists
	Author:         Salvatore Sanfilippo <[email protected]>
	Author:         Theo Verelst <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        27-Mar-2004
	Post-History:   
	Keywords:       Tcl
	Tcl-Version:    9.0
-----

# Abstract

This TIP proposes to add a new command to generate lists of _N_
elements, where the _i_-th element is computed as the result of
an unary Tcl procedure with _i_ as itsargument. Implementing special









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 192: Lazy Lists
	Author:         Salvatore Sanfilippo <[email protected]>
	Author:         Theo Verelst <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        27-Mar-2004
	Post-History:   
	Keywords:       Tcl
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes to add a new command to generate lists of _N_
elements, where the _i_-th element is computed as the result of
an unary Tcl procedure with _i_ as itsargument. Implementing special

Changes to tip/193.md.

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
# TIP 193: Simple Syntax Help System
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending
	Post-History:	
	Author:		Donal K. Fellows <[email protected]>
	Created:	29-Apr-2004
	Keywords:	Tcl
-----

# Abstract

This TIP proposes a simple scheme to allow commands to provide basic
syntax help for themselves.  This information would allow for more
advanced processing by programs doing interactive input of Tcl
commands \(by providing a mechanism for them to discover what possible
completions of the current command fragment are available\) and could
be processed automatically by the **interp alias** and **namespace
ensemble** mechanisms so that help could be automatically extended to
commands defined through those mechanisms.

# Rationale

Currently, Tcl commands are only partially consistent in how they
provide information about their own syntax; the only way of getting
any syntax help is by providing invalid input to the command, but not
all commands have invalid input sequences \(e.g. **list**\) and nor is
there any way of knowing what those invalid sequences are \(where they
do exist\) unless you know the command beforehand.

Such help would be useful in a number of situations, such as command
expansion in something like tkcon.  It would also provide a mechanism
for supplying the sort of detailed information which the likes of
[incr Tcl]'s ensembles can generate, but which the Tcl ensembles of
[[112]](112.md) do not do \(for the reason that this would produce output
significantly different in kind from existing core commands.\)

Note that I do not want to provide extended help such as might be
obtained from manual pages; this help system is designed to be
mechanically queryable first.

# Proposed Change

There are two main components

## Data Model

Every command would supply help for itself by providing a callback to
generate the information on demand; there will be a compatability
callback installed by default that states that the command may take
any number of unknown arguments.

The result of the callback will be a list of command call
descriptions.  Each description will be itself a list of terms that
describe a particular way of calling the command, with one term per
argument.  Each term may in turn be one of:

 * _Required literal_ - this might be something like a subcommand
   name.

 * _Optional literal_ - a good example of this are the **then**
   and **else** words in a call to **if**.

 * _Required varying_ \(with name for display to the user\) - a normal
   argument which may be whatever the caller wants it to be, subject
   to the higher level constraints implicit in the name.

 * _Optional varying_ \(with name for display to the user\) - a normal
   optional argument.

 * _All remaining arguments_ - this would be used in the default
   help outlined above, but would also be useful for modelling the
   _args_ parameter to a procedure.

[ToDo: say how these are expressed in C code]

[ToDo: talk about how aliases and ensembles can do help construction]

[ToDo: talk about how such information can be partially derived in
procedures]

## Information Access

There will be a new subcommand of **info** to provide access to this
information at the Tcl level: **help**.  The first argument to
**info help** will be the name of a command; if no further arguments

are supplied, the result will be a multi-line string with one
invokation per line; the invokations will be just the string parts
with the literal/varying information omitted and the optional/required
information converted into surrounding question marks.

Otherwise, the second argument to **info help** will be one of:







 get: Two optional arguments; an index into the list of help "lines"
   \(first\) and an index within the line \(second\).  If one index is
   supplied, returns the list of values \(without lit/var or opt/req
   info\) for the indexed line.  If two indexes are supplied, returns
   the string form for the indexed word within the indexed line.  If
   no indexes are supplied, or returns a list of every such value list


   when no index is supplied.


 literal: Two required arguments; an index into the list of help
   "lines" and an index into the list of values for that line.
   Returns a boolean that is true when the indexed word within the
   indexed line is a literal.






































































 required: Two required arguments; an index into the list of help

   "lines" and an index into the list of values for that line.

   Returns a boolean that is true when the indexed word within the



   indexed line is required.





[ToDo: could **info help** be used as a mechanism for procedures to





































set their own help up?]












# Copyright

This document has been placed in the public domain.




|









|
|
|
|
|
<
|
|



|
|
|
|
|
|

|
|
|
|
|
|

|
|
|

|

|



|
|
|
<

|
|
|
|

|
<

|
|


|
|




|
|
|



<
<
<
<
<



|
|
>
|
|
|
|



>
>
>
>
>
>
|
|
|
|
|
|
>
>
|
>

|
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
|
>
|
>
|
>
>
>
|
>

>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>




<
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246

# TIP 193: Simple Syntax Help System
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Post-History:	
	Author:		Donal K. Fellows <[email protected]>
	Created:	29-Apr-2004
	Keywords:	Tcl
-----

# Abstract

This TIP proposes a simple scheme to allow commands to provide basic syntax
help for themselves.  This information would allow for more advanced
processing by programs doing interactive input of Tcl commands \(by providing
a mechanism for them to discover what possible completions of the current
command fragment are available\) and could be processed automatically by the

**interp alias** and **namespace ensemble** mechanisms so that help could be
automatically extended to commands defined through those mechanisms.

# Rationale

Currently, Tcl commands are only partially consistent in how they provide
information about their own syntax; the only way of getting any syntax help is
by providing invalid input to the command, but not all commands have invalid
input sequences \(e.g. **list**\) and nor is there any way of knowing what
those invalid sequences are \(where they do exist\) unless you know the
command beforehand.

Such help would be useful in a number of situations, such as command expansion
in something like tkcon.  It would also provide a mechanism for supplying the
sort of detailed information which the likes of [incr Tcl]'s ensembles can
generate, but which the Tcl ensembles of [[112]](112.md) do not do \(for the
reason that this would produce output significantly different in kind from
existing core commands.\)

Note that I do not want to provide extended help such as might be obtained
from manual pages; this help system is designed to be mechanically queryable
first.

# Proposed Change: Tcl Script Level

There are three main components:

## Data Model

Every command would supply help for itself by providing a callback to generate
the information on demand; there will be a compatability callback installed by
default that states that the command may take any number of unknown arguments.


The result of the callback will be a list of command call descriptions.  Each
description will be itself a list of terms that describe a particular way of
calling the command, with one term per argument.  Each term may in turn be one
of:

 * _Required literal_ - this might be something like a subcommand name.


 * _Optional literal_ - a good example of this are the **then** and **else**
   words in a call to **if**.

 * _Required varying_ \(with name for display to the user\) - a normal
   argument which may be whatever the caller wants it to be, subject to the
   higher level constraints implicit in the name.

 * _Optional varying_ \(with name for display to the user\) - a normal
   optional argument.

 * _All remaining arguments_ - this would be used in the default help outlined
   above, but would also be useful for modelling the _args_ parameter to a
   procedure.

[ToDo: say how these are expressed in C code]






## Information Access

There will be a new subcommand of **info** to provide access to this
information at the Tcl level: **help**.  The first argument to **info help**
will be the name of a command, or, if no such command exists and the argument
is a two- or three-element list, a lambda term; if no further arguments are
supplied, the result will be a multi-line string with one invokation per line;
the invokations will be just the string parts with the literal/varying
information omitted and the optional/required information converted into
surrounding question marks.

Otherwise, the second argument to **info help** will be one of:

**summary**: No further arguments. Returns a brief description of what the
    command does, such as the summary text from the manual page (e.g.,
    "`Increment the value of a variable.`" for **incr**).

> **info help** _cmd_ **summary**

**get**: Two optional arguments; an index into the list of command definition
    lines \(first\) and an index within the line \(second\).  If one index is
    supplied, returns the list of values \(without lit/var or opt/req info\)
    for the indexed line.  If two indexes are supplied, returns the string
    form for the indexed word within the indexed line.  If no indexes are
    supplied, or returns a list of every such value list when no index is
    supplied. (See **Help Definitions** below for the description of which
    lines this is referring to.)

> **info help** _cmd_ **get** ?_lineIndex_? ?_wordIndex_?

**literal**: Two required arguments; an index into the list of help "lines"
    and an index into the list of values for that line.  Returns a boolean
    that is true when the indexed word within the indexed line is a literal.

> **info help** _cmd_ **literal** _lineIndex wordIndex_

**required**: Two required arguments; an index into the list of help "lines"
    and an index into the list of values for that line.  Returns a boolean
    that is true when the indexed word within the indexed line is required.

> **info help** _cmd_ **required** _lineIndex wordIndex_

**all**: No further arguments. Returns the whole of the string registered as
   the help definition for the command.

>   **info help** _cmd_ **all**

There shall be an equivalent for TclOO methods. In that case, because methods
are not commands, instead of **info help**, the subcommand to use will
be **info class help** _class method_ for methods defined by classes, 
and **info object help** _object method_ for methods defined by objects.
Subsequent arguments shall be as for **info help** above. _Overall_ help on a
class or object will be via the basic **info help** as those _are_ commands.

## Information Definition

There will be a new **doc** command. It will take one or two arguments.

If it takes a single argument, and is run inside a procedure, lambda term, or
method, then that argument is a _help definition_ to apply to that procedure,
lambda term or method. When a procedure or method is defined, the creation
process shall minimally parse the provided script and determine if the first
command in it is a single-argument **doc** call; if it is, the help definition
in that argument will be applied during the creation of the procedure/method.
For lambda terms, this parsing will occur when the lambda term is first
interpreted as such by Tcl. (Note that this is the _only_ way of documenting a
lambda.)

The single-argument form otherwise has _no_ effect.

In the two argument form, the first argument shall be the name of a Tcl
command and the second argument shall be the help definition.

There will also be a **doc** definition in the definition set supported by
**oo::define** and **oo::objdefine**, that takes two arguments. The first
argument will be the name of a method (any method, not just one created by
the **method** definition). This is necessary as it will be the only way to
create help definitions for forwarded methods.

## Help Definitions

Help definitions will consist of a string that is potentially multi-line. The
string will be split into paragraphs by visually blank lines (i.e., lines that
are empty after being passed through **string trimright**) and the common
whitespace prefix from all paragraphs shall be stripped.

The first paragraph shall be the summary text.

The lines of the second paragraph shall be the data indexed by the other
**info help** subcommands (**get**, **literal** and **required**); one line
per description. The words of each of the lines of the second paragraph shall
be sequences of non-whitespace characters, rather than Tcl words _per se_. If
a word (other than the initial one, which should be the conventional command
name) starts with `?` and finishes with `?` then it shall be internally
interpreted as optional after the question marks are stripped. If a
non-initial word starts and ends with `=`, it shall be interpreted as literal
after the equals signs are stripped.  If both `?` and `=` are present at each
end, in either order, the word shall be both optional and literal and both
will be stripped. Note that command names are _always_ both required and
literal. If the final word of a line is `...`, it shall be always optional and
not literal.

Subsequent paragraphs are not interpreted by this specification, but will be
provided as part of the information returned by **info help**'s **all**.

# Examples

Help for the **incr** command might be done with:

```
doc incr {
   Increment the value of a variable.
	
      incr varName ?increment?

   The default amount to increment by is 1.
}
```

Then you'd be able to do:

```
puts [info help incr summary]
# ==> Increment the value of a variable.
puts [info help incr get]
# ==> {incr varName increment}
puts [info help incr get 0]
# ==> incr varName increment
puts [info help incr literal 0 0]
# ==> 1
puts [info help incr literal 0 1]
# ==> 0
puts [info help incr required 0 1]
# ==> 1
puts [info help incr required 0 2]
# ==> 0
```

Help for the **if** command might be done with:

```
doc if {
   Execute scripts conditionally.
   
      if expr ?=then=? body
      if expr ?=then=? body1 ?=else=? body2
      if expr1 ?=then=? body1 =elseif= expr2 ?=then=? body2 ...

   Each of the expr arguments is evaluated as an expression in order until one
   evaluates to a true value. Then the corresponding body is evaluated as a
   script.  The words 'then' and 'else' are optional; 'elseif' is required if
   more than one expression.  If an 'else' is present or a final body, and no
   expression evaluates to true, the last body is evaluated instead.
}
```

Defining your own help for a procedure:

```
proc foo {a b {c 123}} {
   doc {
      Do the foo to the bar.

      foo a b ?c?
   }
   # ...
}
```

# Copyright

This document has been placed in the public domain.

Changes to tip/216.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 216: Handling Command-Line Options in Tclsh and Wish
	Author:		Arjen Markus <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	23-Aug-2004
	Post-History:	
	Tcl-Version:	8.7
	Keywords:	Tcl, debugging, argument, shell
-----

# Abstract

Currently there is no means to add new command-line options to the
standard Tcl shells, tclsh and wish, that can be handled at the script







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 216: Handling Command-Line Options in Tclsh and Wish
	Author:		Arjen Markus <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	23-Aug-2004
	Post-History:	
	Tcl-Version:	9.1
	Keywords:	Tcl, debugging, argument, shell
-----

# Abstract

Currently there is no means to add new command-line options to the
standard Tcl shells, tclsh and wish, that can be handled at the script

Changes to tip/22.md.

1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
# TIP 22: Multiple Index Arguments to lindex
	Author:         David Cuthbert <[email protected]>
	Author:         Kevin Kenny <[email protected]>
	Author:         Don Porter <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        19-Jan-2001
	Post-History:   
	Discussions-To: news:comp.lang.tcl,mailto:[email protected]
	Keywords:       lindex,multiple arguments,sublists
	Tcl-Version:    8.4a2

-----

# Abstract

Obtaining access to elements of sublists in Tcl often requires nested
calls to the _lindex_ command.  The indices are syntactically listed
in most-nested to least-nested order, which is the reverse from other













>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# TIP 22: Multiple Index Arguments to lindex
	Author:         David Cuthbert <[email protected]>
	Author:         Kevin Kenny <[email protected]>
	Author:         Don Porter <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        19-Jan-2001
	Post-History:   
	Discussions-To: news:comp.lang.tcl,mailto:[email protected]
	Keywords:       lindex,multiple arguments,sublists
	Tcl-Version:    8.4a2
	Obsoletes:      170
-----

# Abstract

Obtaining access to elements of sublists in Tcl often requires nested
calls to the _lindex_ command.  The indices are syntactically listed
in most-nested to least-nested order, which is the reverse from other

Changes to tip/220.md.

1
2
3
4
5
6
7
8
9
10
11




12
13
14
15
16
17
18
# TIP 220: Escalate Privileges in VFS Close Callback
	Author:         Colin McCormack <[email protected]>
	Author:         Andreas Kupries <[email protected]>
	Author:         Vince Darley <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        12-Sep-2004
	Post-History:   
	Tcl-Version:    8.7
	Tcl-Ticket:     1057093




-----

# Abstract

This tip allows the creator and opener of a channel to cast away
privileges and have them restored on close, to permit last-minute
processing.  It is sufficient to resolve a _tclvfs_ bug, minimal,




|

|



|
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# TIP 220: Escalate Privileges in VFS Close Callback
	Author:         Colin McCormack <[email protected]>
	Author:         Andreas Kupries <[email protected]>
	Author:         Vince Darley <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        12-Sep-2004
	Post-History:   
	Tcl-Version:    8.7
	Tcl-Branch:     tip-220
	Vote-Summary    Accepted 3/0/3
	Votes-For:      JN, KBK, SL
	Votes-Against:  none
	Votes-Present:  DGP, FV, MC
-----

# Abstract

This tip allows the creator and opener of a channel to cast away
privileges and have them restored on close, to permit last-minute
processing.  It is sufficient to resolve a _tclvfs_ bug, minimal,

Changes to tip/225.md.

1
2
3


4
5
6
7
8
9
10

11
12
13
14
15
16
17
# TIP 225: Arithmetic Series with Optimized Space Complexity
	Author:         Salvatore Sanfilippo <[email protected]>
	Author:         Miguel Sofer <[email protected]>


	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        25-Oct-2004
	Post-History:   
	Tcl-Version:    8.7
	Tcl-Ticket:     1052584

-----

# Abstract

This TIP proposes to add a new command to generate arithmetic
sequences as Tcl lists that may be stored in constant space in many
practical situations.  The only change from the point of view of the



>
>
|






>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# TIP 225: Arithmetic Series with Optimized Space Complexity
	Author:         Salvatore Sanfilippo <[email protected]>
	Author:         Miguel Sofer <[email protected]>
	Author:         Brian Griffin <[email protected]>
	Author:         Eric Taylor <[email protected]>
	State:          Withdrawn
	Type:           Project
	Vote:           Pending
	Created:        25-Oct-2004
	Post-History:   
	Tcl-Version:    8.7
	Tcl-Ticket:     1052584
	Obsoleted-By:   629
-----

# Abstract

This TIP proposes to add a new command to generate arithmetic
sequences as Tcl lists that may be stored in constant space in many
practical situations.  The only change from the point of view of the
169
170
171
172
173
174
175
























































































































































176
177
178
179
180
181
182
object.  Formally, the syntax is:

 > **range** ?_start_? _end_ ?_step_?

The proposed changes are available as a Patch against HEAD that can be
found in the SourceForge Tcl patch 1052584
<http://sf.net/tracker/?func=detail&aid=1052584&group_id=10894&atid=310894> 

























































































































































# Copyright

This document has been placed in the public domain.

----








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
object.  Formally, the syntax is:

 > **range** ?_start_? _end_ ?_step_?

The proposed changes are available as a Patch against HEAD that can be
found in the SourceForge Tcl patch 1052584
<http://sf.net/tracker/?func=detail&aid=1052584&group_id=10894&atid=310894> 

# Proposed Extended Change

## Current Status -- August 2022 ##

This TIP has been implemented, in it's entirety, along with the
additional command syntax proposed in
[TIP-629](/doc/trunk/tip/629.md) (see
[tcl branch tip-629](https://core.tcl-lang.org/tcl/timeline?r=tip-629)).
Currently, the command name is "**range**", but I propose changing
it to "**lseq**"; it is less likely to conflict with user code, and
is in line with other list related commands, i.e, begins with an "**l**".
Note that the original tip-225 proposes a new Obj type: ArithSeries.
This new type is fully implemented and supported for foreach, lmap,
llength, lindex, lrange, lreverse, and the "in & ni" operators. List
operations that modify the list will shimmer the ArithSeries into a
List type before completing the operation, as Salvatore described
below in the [Appendix Discussion](#Discussion)

## Variant Implementation ##

However, I propose an expanded approach.

The ArithSeries Obj type basically replaces the elemCount and elements
fields with functions that perform llength(), lindex(), and slice()
operations without having to generate an actual elements[] array. In
theory, these functions could be provided abstractly to allow any kind
of list value. Here are some silly examples:

- \[lsquares 1 7\] -> 1 4 9 16 25 36 49
- \[lfibonacci 10\] -> 0 1 1 2 3 5 8 13 21 34
- \[lstring "Hello"\] -> H e l l o

I bring this up because currently, the ArithSeries is hard-coded into
the various list operations as a special case (somewhat like the dict
obj type is in certain cases).  But if this obj type can be
abstracted, then the list operations would only require one "special
case", and not n-special cases. Even the current List type could be
implemented as an Abstract List. 
This would allow for future type implementations, that can achive the
goal of the original authors, to create "*Tcl lists that may be stored in constant space*".
I have an initial implementation of an Abstract List type along with
an implemented \[lseq\] command that defines the ArithSeries as an
Abstract List. 

Creating an AbstractList type requires providing a set of functions
that allow the type to emulate a List.

    typedef struct AbstractList {
        /* List emulation functions */

        /* How to create a new Tcl_Obj of this custom type */
        Tcl_ALNewObjProc *newObjProc;

        /* How to duplicate a internal rep of this custom type */
        Tcl_ALDupRepProc *dupRepProc;

        /* Return the [llength] of the AbstractList */
        Tcl_ALLengthProc *lengthProc;

        /* Return a value (Tcl_Obj) for [lindex $al $index ...] */
        Tcl_ALIndexProc *indexProc;

        /* Return an AbstractList for [lrange $al $start $end] */
	    Tcl_ALSliceProc *sliceProc;

	    /* Return an AbstractList for [lreverse $al] */
	    Tcl_ALReverseProc *reverseProc;
        
	    size_t alvaluesize;  /* value size */
	    void* alvalue;       /* Custom value reference */
    } AbstractList;

If a function is not provided, the code will revert to shimmering the
value to a List before completing the operation. The bare minimum for
a functioning implementation is lengthProc and indexProc.

To illustrate how a new AbstractList is created, here is the code for
the ArithSeries:

    Tcl_Obj *
    TclNewArithSeriesObj(Tcl_WideInt start, Tcl_WideInt end, Tcl_WideInt step, Tcl_WideInt len)
    {
        Tcl_WideInt length = (len>=0 ? len : ArithSeriesLen(start, end, step));
        Tcl_Obj *arithSeriesPtr;
        ArithSeries *arithSeriesRepPtr;
    
        if (length == -1) return NULL; /* Invalid range error */
    
        arithSeriesPtr = Tcl_NewAbstractListObj(NULL, "arithseries", sizeof (ArithSeries));
        arithSeriesRepPtr = (ArithSeries*)Tcl_AbstractListGetTypeRep(arithSeriesPtr);
        arithSeriesRepPtr->start = start;
        arithSeriesRepPtr->end = end;
        arithSeriesRepPtr->step = step;
        arithSeriesRepPtr->len = length;
        Tcl_SetAbstractListNewProc(     arithSeriesPtr, Tcl_NewArithSeriesObj    );
        Tcl_SetAbstractListLengthProc(  arithSeriesPtr, Tcl_ArithSeriesObjLength );
        Tcl_SetAbstractListIndexProc(   arithSeriesPtr, Tcl_ArithSeriesObjIndex  );
        Tcl_SetAbstractListSliceProc(   arithSeriesPtr, TclArithSeriesObjRange   );
        Tcl_SetAbstractListReverseProc( arithSeriesPtr, TclArithSeriesObjReverse );
        Tcl_SetAbstractListDupRepProc(  arithSeriesPtr, DupArithSeriesRep        );
    
        if (length > 0) {
            Tcl_InvalidateStringRep(arithSeriesPtr);
        } else {
	        TclInitStringRep(arithSeriesPtr, NULL, length);
        }
        return arithSeriesPtr;
    }


This proposal includes a set of Tcl C API functions for extension
authors to create new forms of abstract lists.  


Some suggestions so far include:

* bitfield list - where each value is a single bit (0 or 1) or range of bits.
* VecTcl, tarray, etc. - vectors and matrices. 
* lstring "example" - stored as a char\[\] instead of a Tcl_Obj\[\].
* lsql $db "SELECT ..." - a list of results from a database query.

## AbstractList Implementation ##

An implementation of AbstractList, along with an \[lseq\] ArithSeries
command and abstact obj type has been done. At this writing, it is
still a work in progress, but it has shown that:

* Works with TIP-625 without any issues
* Fully functional, passing current test suite

### ToDo ###

* Implement a searchProc (suggested by Andreas Leitgeb), however,
  this may be very complex, or very limited. We shall see...
* Expand testing
* commit to a branch somewhere.
* Bookkeeping:  TIP-629 is really just a repeat of this TIP, so 629
  should be (withdrawn in favor of | merged into?) TIP-225, if for no 
  other reason than to honor Salvatore's and Miguel's initial efforts
  on this proposal.

## Concerns ##

* An implemenetation of an AbstractList has to guarantee a valid List
  string representation that produces the same \[lindex\] results, and
  should(?) be able to convert a string list representation to its
  internal form. The latter is not true for ArithSeries currently.

*-Brian*

----

# Copyright

This document has been placed in the public domain.

----

238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
	        lappend result [expr {$start+($i*$step)}]
	    }
	    return $result
	}

----

# Appendix: Discussion

Does the TIP include a C-level api to ranges, or are they transparent also in C - in the sense that they are addressable with any of the list-oriented functions of the Tcl api? What if any changes and caveats are necessary in the documentation of Tcl's C api? _Miguel_

Ranges are transparent to C level too, in the proposed patch,
because the logic is put inside the commands,
so directly in the code implementing lindex, foreach, ...
In all the other cases, when a SetListFromAny\(\) call occurs the
range is converted into a normal Tcl list object. _Salvatore_








|









393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
	        lappend result [expr {$start+($i*$step)}]
	    }
	    return $result
	}

----

# Appendix: <a name="Discussion"></a>Discussion

Does the TIP include a C-level api to ranges, or are they transparent also in C - in the sense that they are addressable with any of the list-oriented functions of the Tcl api? What if any changes and caveats are necessary in the documentation of Tcl's C api? _Miguel_

Ranges are transparent to C level too, in the proposed patch,
because the logic is put inside the commands,
so directly in the code implementing lindex, foreach, ...
In all the other cases, when a SetListFromAny\(\) call occurs the
range is converted into a normal Tcl list object. _Salvatore_

Changes to tip/228.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 228: Tcl Filesystem Reflection API
	Author:         Andreas Kupries <[email protected]>
	Author:         Andreas Kupries <[email protected]>
	Author:         Vince Darley <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        02-Nov-2004
	Post-History:   
	Tcl-Version:    8.7
	Implementation-URL: http://sourceforge.net/projects/tclvfs/
-----

# Abstract

This document describes an API which reflects the Filesystem Driver
API of the core Virtual Filesystem Layer up into the Tcl level, for









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 228: Tcl Filesystem Reflection API
	Author:         Andreas Kupries <[email protected]>
	Author:         Andreas Kupries <[email protected]>
	Author:         Vince Darley <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        02-Nov-2004
	Post-History:   
	Tcl-Version:    9.1
	Implementation-URL: http://sourceforge.net/projects/tclvfs/
-----

# Abstract

This document describes an API which reflects the Filesystem Driver
API of the core Virtual Filesystem Layer up into the Tcl level, for

Changes to tip/238.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
# TIP 238: Fire Event when Widget Created
	Author:		Gerald W. Lester <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Tcl-Version:	8.7
	Created:	25-Jan-2005
	Post-History:   
	Keywords:	Tk
-----

# Abstract






|







1
2
3
4
5
6
7
8
9
10
11
12
13
# TIP 238: Fire Event when Widget Created
	Author:		Gerald W. Lester <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Tcl-Version:	9.1
	Created:	25-Jan-2005
	Post-History:   
	Keywords:	Tk
-----

# Abstract

Changes to tip/239.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 239: Enhance the 'load' Command
	Author:         Jeff Hobbs <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        26-Jan-2005
	Post-History:   
	Tcl-Version:    8.7
-----

# Abstract

This TIP proposes enhancing the Tcl **load** command with the
ability to load arbitrary libraries and functions.








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 239: Enhance the 'load' Command
	Author:         Jeff Hobbs <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        26-Jan-2005
	Post-History:   
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes enhancing the Tcl **load** command with the
ability to load arbitrary libraries and functions.

Changes to tip/24.md.

1
2
3
4
5
6
7
8
9
10
11

12
13
14
15
16
17
18
# TIP 24: Tcl Maintainer Assignments
	Author:         Don Porter <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	Author:         Kevin B. Kenny <[email protected]>
	Author:         Jeff Hobbs <[email protected]>
	Author:         Pavel Goran <[email protected]>
	Author:         Daniel A. Steffen <[email protected]>
	Author:         miguel sofer <[email protected]>
	State:          Draft
	Type:           Informative
	Vote:           Pending

	Created:        29-Jan-2001
	Post-History:   
-----

# Abstract

This document keeps a record of who maintains each functional area











>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# TIP 24: Tcl Maintainer Assignments
	Author:         Don Porter <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	Author:         Kevin B. Kenny <[email protected]>
	Author:         Jeff Hobbs <[email protected]>
	Author:         Pavel Goran <[email protected]>
	Author:         Daniel A. Steffen <[email protected]>
	Author:         miguel sofer <[email protected]>
	State:          Draft
	Type:           Informative
	Vote:           Pending
	Obsoleted-By:
	Created:        29-Jan-2001
	Post-History:   
-----

# Abstract

This document keeps a record of who maintains each functional area

Changes to tip/240.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 240: An Ensemble Command to Manage Processes
	Author:         Steve Bold <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        22-Feb-2005
	Post-History:   
	Keywords:       Tcl
	Obsoletes:      88
	Tcl-Version:    8.7
	Tcl-Ticket:     1315115
-----

# Abstract

This TIP proposes some new commands through which Tcl scripts can create and
monitor child processes.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 240: An Ensemble Command to Manage Processes
	Author:         Steve Bold <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        22-Feb-2005
	Post-History:   
	Keywords:       Tcl
	Obsoletes:      88
	Tcl-Version:    9.1
	Tcl-Ticket:     1315115
-----

# Abstract

This TIP proposes some new commands through which Tcl scripts can create and
monitor child processes.

Changes to tip/243.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 243: Supply Find Dialog for the Text Widget
	Author:		Rüdiger Härtel <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	16-Mar-2005
	Tcl-Version:	8.7
	Post-History:	
	Keywords:	Tk
	Tk-Ticket:      1167420
-----

# Abstract







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 243: Supply Find Dialog for the Text Widget
	Author:		Rüdiger Härtel <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	16-Mar-2005
	Tcl-Version:	9.1
	Post-History:	
	Keywords:	Tk
	Tk-Ticket:      1167420
-----

# Abstract

24
25
26
27
28
29
30
31

32
33
34
35
36
37
38
library scripts so that simple applications can be built more easily
and to a higher quality. Additionally, a _replace dialog_ is
desirable, and it should be developed at the same time.

# Reference Implementation

A reference implementation for a _find dialog_ is available at
<http://sf.net/tracker/?func=detail&aid=1167420&group_id=12997&atid=312997> .


# Example Use

	 package require Tk
	 namespace import ::msgcat::*
	 
	 mclocale en







|
>







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
library scripts so that simple applications can be built more easily
and to a higher quality. Additionally, a _replace dialog_ is
desirable, and it should be developed at the same time.

# Reference Implementation

A reference implementation for a _find dialog_ is available at
(Tk Ticket #1167420)[1167420] or
[Sourceforge](https://sourceforge.net/p/tktoolkit/patches/191/)

# Example Use

	 package require Tk
	 namespace import ::msgcat::*
	 
	 mclocale en

Changes to tip/246.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 246: Unify Pattern Matching
	Author:         Reinhard Max <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        27-Apr-2005
	Post-History:   
	Keywords:       pattern,match,glob,exact,regexp,case sensitive,Tcl
	Tcl-Version:    8.7
-----

# Abstract

Many Tcl commands take arguments that are patterns to match
against. Some of these commands allow options to specify whether the
pattern should be treated as a literal, a glob pattern, or a regular








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 246: Unify Pattern Matching
	Author:         Reinhard Max <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        27-Apr-2005
	Post-History:   
	Keywords:       pattern,match,glob,exact,regexp,case sensitive,Tcl
	Tcl-Version:    9.1
-----

# Abstract

Many Tcl commands take arguments that are patterns to match
against. Some of these commands allow options to specify whether the
pattern should be treated as a literal, a glob pattern, or a regular

Changes to tip/253.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 253: Consolidate Package-Related Commands
	Author:		Brian Schmidt <[email protected]>
	Type:		Project
	State:		Draft
	Vote:		Pending
	Created:	05-Jul-2005
	Tcl-Version:	8.7
	Post-History:	
-----

# Abstract

This TIP proposes enhancing the existing **package** command with
additional subcommands to serve as the top-level command container for






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 253: Consolidate Package-Related Commands
	Author:		Brian Schmidt <[email protected]>
	Type:		Project
	State:		Draft
	Vote:		Pending
	Created:	05-Jul-2005
	Tcl-Version:	9.1
	Post-History:	
-----

# Abstract

This TIP proposes enhancing the existing **package** command with
additional subcommands to serve as the top-level command container for

Changes to tip/259.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 259: Making 'exec' Optionally Binary Safe
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        12-Dec-2005
	Post-History:   
	Tcl-Version:    8.7
-----

# Abstract

A new option shall be added to the command **exec**, that allows the user to
specify that input redirected from immediate data \(using **<<**\) and/or the
data received from the external command shall not undergo any translation







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 259: Making 'exec' Optionally Binary Safe
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        12-Dec-2005
	Post-History:   
	Tcl-Version:    9.1
-----

# Abstract

A new option shall be added to the command **exec**, that allows the user to
specify that input redirected from immediate data \(using **<<**\) and/or the
data received from the external command shall not undergo any translation

Changes to tip/265.md.

85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
	    int objc, Tcl_Obj *CONST objv[])
	{
	  char *gname,*filename;
	  int i;
	  int numRepeat;
	  double scalar;
	  int doErase = 0;
	  size_t size;
	
	  /* this table specifies the possible options, all in one place.*/
	  Tcl_ArgvInfo argTable[] = {
	    {"-erase", TCL_ARGV_CONSTANT, (void *) 1, &doErase,
	      "erase image before plotting"},
	    {"-numRepeat", TCL_ARGV_INT, NULL, &numRepeat,
	      "number of times to repeat test"},







<







85
86
87
88
89
90
91

92
93
94
95
96
97
98
	    int objc, Tcl_Obj *CONST objv[])
	{
	  char *gname,*filename;
	  int i;
	  int numRepeat;
	  double scalar;
	  int doErase = 0;

	
	  /* this table specifies the possible options, all in one place.*/
	  Tcl_ArgvInfo argTable[] = {
	    {"-erase", TCL_ARGV_CONSTANT, (void *) 1, &doErase,
	      "erase image before plotting"},
	    {"-numRepeat", TCL_ARGV_INT, NULL, &numRepeat,
	      "number of times to repeat test"},

Changes to tip/271.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 271: Windows-Style Open and Save File Dialog on Unix
	Author:         Matthew Middleton <[email protected]>
	Author:         susanta kumar mishra <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        11-Jul-2006
	Post-History:   
	Tcl-Version:    8.7
	Tk-Ticket:      1520742
-----

# Abstract

This TIP describes updates to the Unix file dialogs to make them more like the
dialogs found on the Windows platform. This increases the usability of the








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 271: Windows-Style Open and Save File Dialog on Unix
	Author:         Matthew Middleton <[email protected]>
	Author:         susanta kumar mishra <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        11-Jul-2006
	Post-History:   
	Tcl-Version:    9.1
	Tk-Ticket:      1520742
-----

# Abstract

This TIP describes updates to the Unix file dialogs to make them more like the
dialogs found on the Windows platform. This increases the usability of the

Changes to tip/276.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 276: Specify and Unify Variable Linking Commands
	Author:         Miguel Sofer <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        01-Oct-2006
	Post-History:   
	Keywords:       Tcl,global,variable,upvar,namespace upvar
	Tcl-Version:    8.7
-----

# Abstract

The purpose of this TIP is to simplify and clarify the semantics of the
commands in Tcl that couple variables in different scopes together.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 276: Specify and Unify Variable Linking Commands
	Author:         Miguel Sofer <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        01-Oct-2006
	Post-History:   
	Keywords:       Tcl,global,variable,upvar,namespace upvar
	Tcl-Version:    9.1
-----

# Abstract

The purpose of this TIP is to simplify and clarify the semantics of the
commands in Tcl that couple variables in different scopes together.

Changes to tip/277.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 277: Create Namespaces as Needed
	Author:		Miguel Sofer <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending
	Created:	01-Oct-2006
	Post-History:	
-----

# Abstract





|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 277: Create Namespaces as Needed
	Author:		Miguel Sofer <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Created:	01-Oct-2006
	Post-History:	
-----

# Abstract

Changes to tip/279.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 279: Adding an Extensible Object System to the Core
	Author:         Gustaf Neumann <[email protected]>
	Author:         Larry W. Virden <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        05-Oct-2006
	Post-History:   
	Tcl-Version:    8.7
-----

# Abstract

This TIP proposes adding OO support to the Tcl core, consisting mostly
of a dispatcher plus a small number of helper commands. The TIP
allows the coexistence of multiple object systems by providing a








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 279: Adding an Extensible Object System to the Core
	Author:         Gustaf Neumann <[email protected]>
	Author:         Larry W. Virden <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        05-Oct-2006
	Post-History:   
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes adding OO support to the Tcl core, consisting mostly
of a dispatcher plus a small number of helper commands. The TIP
allows the coexistence of multiple object systems by providing a

Changes to tip/281.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 281: Improvements in System Error Handling
	Author:         David Gravereaux <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Oct-2006
	Post-History:   
	Keywords:       POSIX,channel driver,errorCode
	Tcl-Version:    8.7
	Implementation-URL: http://iocpsock.cvs.sourceforge.net/iocpsock/iocpsock/tclWinError.c?revision=HEAD&view=markup
-----

# Abstract

This TIP describes the need for better error codes and message handling of
system errors to be returned to scripts.








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 281: Improvements in System Error Handling
	Author:         David Gravereaux <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Oct-2006
	Post-History:   
	Keywords:       POSIX,channel driver,errorCode
	Tcl-Version:    9.1
	Implementation-URL: http://iocpsock.cvs.sourceforge.net/iocpsock/iocpsock/tclWinError.c?revision=HEAD&view=markup
-----

# Abstract

This TIP describes the need for better error codes and message handling of
system errors to be returned to scripts.

Changes to tip/282.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 282: Enhanced Expression Syntax
	Author:         Will Duquette <[email protected]>
	Author:         Don Porter <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Oct-2006
	Post-History:   
	Keywords:       expr,operator,assignment
	Tcl-Version:    8.7
	Tcl-Ticket:     1969722
-----

# Abstract

This TIP extends the syntax of the **expr** command to allow a sequence of
mathematical computations to be expressed clearly and concisely.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 282: Enhanced Expression Syntax
	Author:         Will Duquette <[email protected]>
	Author:         Don Porter <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Oct-2006
	Post-History:   
	Keywords:       expr,operator,assignment
	Tcl-Version:    9.1
	Tcl-Ticket:     1969722
-----

# Abstract

This TIP extends the syntax of the **expr** command to allow a sequence of
mathematical computations to be expressed clearly and concisely.

Changes to tip/283.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 283: Modify Ensemble Command Resolution Behaviour
	Author:         Miguel Sofer <[email protected]>
	Author:         Neil Madden <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        01-Oct-2006
	Post-History:   
	Tcl-Version:    8.7
	Tcl-Ticket:     1577282
-----

# Abstract

This TIP proposes that ensembles resolve all commands in their namespace.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 283: Modify Ensemble Command Resolution Behaviour
	Author:         Miguel Sofer <[email protected]>
	Author:         Neil Madden <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        01-Oct-2006
	Post-History:   
	Tcl-Version:    9.1
	Tcl-Ticket:     1577282
-----

# Abstract

This TIP proposes that ensembles resolve all commands in their namespace.

Changes to tip/284.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 284: New 'invoke' and 'namespace invoke' Commands
	Author:         Miguel Sofer <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        01-Oct-2006
	Post-History:   
	Tcl-Version:    8.7
	Tcl-Branch:     tip-284
-----

# Abstract

This TIP exposes a Tcl script-level interface to the direct command invokation
engine already present in the Tcl library for years.







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 284: New 'invoke' and 'namespace invoke' Commands
	Author:         Miguel Sofer <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        01-Oct-2006
	Post-History:   
	Tcl-Version:    9.1
	Tcl-Branch:     tip-284
-----

# Abstract

This TIP exposes a Tcl script-level interface to the direct command invokation
engine already present in the Tcl library for years.

Changes to tip/288.md.

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
# TIP 288: Allow "args" Anywhere in Procedure Formal Arguments
	Author:         Peter Spjuth <peter.spjuth@space.se>
	Author:         Andreas Leitgeb <[email protected]>
	Author:         Peter Spjuth <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        03-Oct-2006
	Post-History:   
	Keywords:       Tcl,proc

	Tcl-Version:    8.7




-----

# Abstract

This TIP proposes to make _args_ have its special meaning as a formal
**proc**edure argument anywhere in the argument list.


# Rationale

Many commands, specially many of Tcl's built in commands, have their variadic arguments in the beginning of the argument list and their required arguments at the end. An example is [**lsearch** ?_options_? _list string_].

Writing tcl procedures in that style is currently a bit cumbersome since you need to do you own argument counting and assignment to variables from "args".

If "args" had its special meaning at any location in the argument list, it would help with such a task, and it would make things more consistent.

To get simple semantics, optional arguments are not allowed after "args".  Optional arguments that precede "args" will be handled as before.  This TIP does not, as of now, specify defaulted arguments directly preceding non-defaulte ones. This should be addressed in a separate TIP.

# Specification

At most one proc argument may be named "args" and can be anywhere in the
argument list. Arguments after "args" may not be optional. Arguments are

assigned in the following order:

 1. Assign arguments right of "args" from the right.

 2. Assign arguments left of "args" from the left. Handling of defaulted parameters preceding "args" remains as it was \(but disregarding the non-defaulted ones after "args"\).

 3. Remaining arguments are assigned to "args".

# Compatiblity

Currently "args" is allowed anywhere in the argument list, and becomes a normal variable if not last. Most scripts probably don't use this since it would be rather confusing, but it might exist.


All such occurrances would need to be fixed.


Detecting such scripts in an automated way would be simple and fixing them is trivial.

# Examples

New style:

	proc lgurka {args list item} {
	    array set opts {-apa 1 -bepa "" -cepa 0}
	    foreach {arg val} $args {
	        set opts([prefix match {-apa -bepa -cepa} $arg]) $val
	    }
	    # Do real stuff

|

<
|

|



>
|
>
>
>
>

<



|
>









<




|
>
|

<
|
|
|
|

|



>
|
>

|



|







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
# TIP 288: Allow "args" Anywhere in Procedure Formal Arguments
	Author:         Peter Spjuth <peter.spjuth@gmail.com>
	Author:         Andreas Leitgeb <[email protected]>

	State:          Rejected
	Type:           Project
	Vote:           Done
	Created:        03-Oct-2006
	Post-History:   
	Keywords:       Tcl,proc
	Tcl-Branch:     aspect-tip288
	Tcl-Version:    9.0
	Vote-Summary:   Rejected 1/0/2
	Votes-For:      JN
	Votes-Against:  none
	Votes-Present:  FV, SL
-----

# Abstract

This TIP proposes to make _args_ have its special meaning as a formal
**proc**edure argument anywhere in the argument list. It also expands
how required and optional arguments can be mixed.

# Rationale

Many commands, specially many of Tcl's built in commands, have their variadic arguments in the beginning of the argument list and their required arguments at the end. An example is [**lsearch** ?_options_? _list string_].

Writing tcl procedures in that style is currently a bit cumbersome since you need to do you own argument counting and assignment to variables from "args".

If "args" had its special meaning at any location in the argument list, it would help with such a task, and it would make things more consistent.



# Specification

At most one proc argument may be named "args" and can be anywhere in the
argument list. Arguments just before and after "args" may be optional.
Required arguments may be in the beginning and end of the argument list.
Arguments are assigned in the following order:


 1. Required arguments to the left are assigned from the left. Required arguments to the right are assigned from the right. Order does not really matter since there must be enough arguments for all of them.
 2. Assign optional arguments left of "args" from the left.
 3. Assign optional arguments right of "args" from the right.
 4. Any remaining arguments are assigned to "args". If there are remaining arguments and no "args", it is an error like before.

# Compatibility

Currently "args" is allowed anywhere in the argument list, and becomes a normal variable if not last. Most scripts probably don't use this since it would be rather confusing, but it might exist.

Interleaving required arguments with optional arguments was legal, but pointless. The current documentation mentions and discourages this use. A construct like this will now be an error:

	proc z {a {b x} c args} { ... }

All such occurrences would need to be fixed. Detecting such scripts in an automated way would be simple and fixing them is trivial.

# Examples

New style for an lsearch style proc:

	proc lgurka {args list item} {
	    array set opts {-apa 1 -bepa "" -cepa 0}
	    foreach {arg val} $args {
	        set opts([prefix match {-apa -bepa -cepa} $arg]) $val
	    }
	    # Do real stuff
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
	
	    array set opts {-apa 1 -bepa "" -cepa 0}
	    foreach {arg val} $args {
	        set opts([prefix match {-apa -bepa -cepa} $arg]) $val
	    }
	    # Do real stuff
	 }



	proc x {a args b} { puts "a=$a, args=$args, b=$b" }

	x 1 2  ;# ->   a=1, args=, b=2

	x 1 2 3 ;# ->  a=1, args=2, b=3

	x 1 ;# -> error: wrong # args: should be "x a ?args? b"

	proc y {a {b x} args c} { ... }

	y 1 2 3 ;#   a=1 b=2 c=3  args is empty


	proc z {a {b x} c args} { ... }


	z 1 2  ;# -> error: wrong # args: should be "z a ?b? c ..."


To change "z" is not covered by this TIP.


# Copyright

This document has been placed in the public domain.








>
>



|
<

<
|



|
>


>

<
>

<
>




<
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

	
	    array set opts {-apa 1 -bepa "" -cepa 0}
	    foreach {arg val} $args {
	        set opts([prefix match {-apa -bepa -cepa} $arg]) $val
	    }
	    # Do real stuff
	 }

Other examples:

	proc x {a args b} { puts "a=$a, args=$args, b=$b" }

	x 1 2   ;# ->  a=1, args=, b=2

	x 1 2 3 ;# ->  a=1, args=2, b=3

	x 1     ;# ->  error: wrong # args: should be "x a ?arg ...? b"

	proc y {a {b x} args c} { ... }

	y 1 2 3 ;# ->  a=1 b=2 c=3  args is empty
	y 1 2   ;# ->  a=1 b=x c=2  args is empty

	proc z {a {b x} c args} { ... }
	->  error: required arg may not be in the middle


# Implementation


See branch [`aspect-tip288`](https://core.tcl-lang.org/tcl/timeline?r=aspect-tip288).

# Copyright

This document has been placed in the public domain.

Changes to tip/290.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 290: Registration of Custom Error Handler Scripts
	Author:         Eckhard Lehmann <[email protected]>
	Author:         Larry W. Virden <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        29-Oct-2006
	Post-History:   
	Keywords:       Tcl,error,trap
	Tcl-Version:    8.7
	Tcl-Ticket:     1587317
-----

# Abstract

This TIP proposes the possibility to register a custom command as error and exception handler.










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 290: Registration of Custom Error Handler Scripts
	Author:         Eckhard Lehmann <[email protected]>
	Author:         Larry W. Virden <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        29-Oct-2006
	Post-History:   
	Keywords:       Tcl,error,trap
	Tcl-Version:    9.1
	Tcl-Ticket:     1587317
-----

# Abstract

This TIP proposes the possibility to register a custom command as error and exception handler.

Changes to tip/295.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 295: Enhance Arguments to lrange
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        06-Nov-2006
	Post-History:   
	Keywords:       Tcl,lrange
	Tcl-Version:    8.7
-----

# Abstract

This TIP proposes an enhancement to **lrange** and **string range** that lets them take more than one start-end index pair.

# Rationale








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 295: Enhance Arguments to lrange
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        06-Nov-2006
	Post-History:   
	Keywords:       Tcl,lrange
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes an enhancement to **lrange** and **string range** that lets them take more than one start-end index pair.

# Rationale

Changes to tip/296.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 296: Enhanced Syntax for Pair-Wise Indices
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        06-Nov-2006
	Post-History:   
	Keywords:       Tcl,lrange,lreplace
	Tcl-Version:    8.7
-----

# Abstract

This TIP proposes adding another anchor **s** \(for usage exclusively in
end-indices\) that refers to the respective start-index.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 296: Enhanced Syntax for Pair-Wise Indices
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        06-Nov-2006
	Post-History:   
	Keywords:       Tcl,lrange,lreplace
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes adding another anchor **s** \(for usage exclusively in
end-indices\) that refers to the respective start-index.

Changes to tip/297.md.

1
2
3
4
5
6

7
8
9
10
11
12
13
# TIP 297: Integer Type Introspection and Conversion
	Author:         Don Porter <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        20-Nov-2006

	Post-History:
	Tcl-Version:    8.7
	Keywords:	Tcl, number, expression
-----

# Abstract



|



>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 297: Integer Type Introspection and Conversion
	Author:         Don Porter <[email protected]>
	State:          Withdrawn
	Type:           Project
	Vote:           Pending
	Created:        20-Nov-2006
	Obsoleted-By:	502,514,515
	Post-History:
	Tcl-Version:    8.7
	Keywords:	Tcl, number, expression
-----

# Abstract

Changes to tip/30.md.

14
15
16
17
18
19
20

21
22
23
24
25
26
27
	Author:         Benjamin Riefenstahl <[email protected]>
	Author:         Pat Thoyts <[email protected]>
	Author:         Vince Darley <[email protected]>
	Author:         Peter Spjuth <[email protected]>
	State:          Draft
	Type:           Informative
	Vote:           Pending

	Created:        09-Mar-2001
	Post-History:   
-----

# Abstract

This document keeps a record of who maintains each functional area







>







14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
	Author:         Benjamin Riefenstahl <[email protected]>
	Author:         Pat Thoyts <[email protected]>
	Author:         Vince Darley <[email protected]>
	Author:         Peter Spjuth <[email protected]>
	State:          Draft
	Type:           Informative
	Vote:           Pending
	Obsoleted-By:
	Created:        09-Mar-2001
	Post-History:   
-----

# Abstract

This document keeps a record of who maintains each functional area

Changes to tip/302.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 302: Fix "after"'s Sensitivity To Adjustments Of System Clock
	Author:         Alexandre Ferrieux <[email protected]>
	Author:         Kevin Kenny <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Dec-2006
	Post-History:   
	Keywords:       Tcl,time changes
	Tcl-Version:    8.7
-----

# Abstract

Currently, **after** tasks can be drastically delayed or sped up simply by
adjusting the system clock. This is due to the implementation's use of an
_absolute_ target date based on the system clock. The idea of this TIP is to









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 302: Fix "after"'s Sensitivity To Adjustments Of System Clock
	Author:         Alexandre Ferrieux <[email protected]>
	Author:         Kevin Kenny <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Dec-2006
	Post-History:   
	Keywords:       Tcl,time changes
	Tcl-Version:    9.1
-----

# Abstract

Currently, **after** tasks can be drastically delayed or sped up simply by
adjusting the system clock. This is due to the implementation's use of an
_absolute_ target date based on the system clock. The idea of this TIP is to
88
89
90
91
92
93
94




95
96
97
98
99
100
101
102
103

# Reference Implementation

I have not yet written a reference implementation; I assume somebody with a
more fluent practice of the core will do so more efficiently. However, gentle
arm twisting, etc.





# Copyright

This document has been placed in the public domain.

# Comments

The _times_ function in Unix is _not_ an appropriate time base.  It reports the user and system time \(CPU time, in other words\) of the currently executing process and its children.  As far as I have been able to determine, Unix assumes that the system time reported by
_gettimeofday_ is the sole time base for absolute timing; if multiple timers are required in a single process, _gettimeofday_ appears to be the only reference that is available.








>
>
>
>









88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107

# Reference Implementation

I have not yet written a reference implementation; I assume somebody with a
more fluent practice of the core will do so more efficiently. However, gentle
arm twisting, etc.

As mentioned 2021-09-01 by Christian Werner, Androwish/Undroidwish has a reference implementation for Android and Unix.

As mentioned 2021-09-03 by Sergey Blester, the following TCL branch contains a well tested and solid solution for Unix and Windows: <https://core.tcl-lang.org/tcl/tktview/fdfbd5e10fefdb605abf34f65535054c323d9394>

# Copyright

This document has been placed in the public domain.

# Comments

The _times_ function in Unix is _not_ an appropriate time base.  It reports the user and system time \(CPU time, in other words\) of the currently executing process and its children.  As far as I have been able to determine, Unix assumes that the system time reported by
_gettimeofday_ is the sole time base for absolute timing; if multiple timers are required in a single process, _gettimeofday_ appears to be the only reference that is available.

Changes to tip/303.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 303: Enhance 'llength' Command to Support Nested Lists
	Author:		Wolf-Dieter Busch <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending
	Created:	29-Jan-2007
	Post-History:	
	Keywords:	Tcl, lindex
-----

# Abstract




|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 303: Enhance 'llength' Command to Support Nested Lists
	Author:		Wolf-Dieter Busch <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Created:	29-Jan-2007
	Post-History:	
	Keywords:	Tcl, lindex
-----

# Abstract

Changes to tip/309.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 309: Expose the Expression Parsing
	Author:		Arjen Markus <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	07-Jan-2008
	Post-History:
	Tcl-Version:	8.7
	Keywords:	expr, parse
-----

# Abstract

This TIP proposes a new command to expose the parsing of expressions by the
**expr** command. This will make it much easier to implement alternative







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 309: Expose the Expression Parsing
	Author:		Arjen Markus <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	07-Jan-2008
	Post-History:
	Tcl-Version:	9.1
	Keywords:	expr, parse
-----

# Abstract

This TIP proposes a new command to expose the parsing of expressions by the
**expr** command. This will make it much easier to implement alternative

Changes to tip/31.md.

8
9
10
11
12
13
14

15
16
17
18
19
20
21
	Author:         Andreas Kupries <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	Author:         <[email protected]>
	Author:         Kevin Kenny <[email protected] >
	State:          Draft
	Type:           Informative
	Vote:           Pending

	Created:        12-Mar-2001
	Post-History:   
-----

# Abstract

This document keeps a record of the CVS tags used in the Tcl and Tk







>







8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
	Author:         Andreas Kupries <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	Author:         <[email protected]>
	Author:         Kevin Kenny <[email protected] >
	State:          Draft
	Type:           Informative
	Vote:           Pending
	Obsoleted-By:   386
	Created:        12-Mar-2001
	Post-History:   
-----

# Abstract

This document keeps a record of the CVS tags used in the Tcl and Tk

Changes to tip/319.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 319: Implement Backwards Compatibility for ttk Themed Widgets in tk Widgets
	Author:		Eric Taylor <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending
	Created:	04-Jun-2008
	Post-History:	
-----

# Abstract





|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 319: Implement Backwards Compatibility for ttk Themed Widgets in tk Widgets
	Author:		Eric Taylor <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Created:	04-Jun-2008
	Post-History:	
-----

# Abstract

Changes to tip/325.md.

1
2
3
4
5
6




7
8
9
10
11
12
13
# TIP 325: System Tray and System Notification Access
	Author:		David N. Welton <[email protected]>, Kevin Walzer <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending




	Created:	25-Aug-2008
	Post-History:	
	Keywords:	Tk, desktop integration
-----

# Abstract



|


|
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 325: System Tray and System Notification Access
	Author:		David N. Welton <[email protected]>, Kevin Walzer <[email protected]>
	State:		Final
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Done
	Vote-Summary:   Accepted 5/0/0
	Votes-For:      SL, JN, MC, FV, KW
	Votes-Against:  none
	Votes-Present:  none
	Created:	25-Aug-2008
	Post-History:	
	Keywords:	Tk, desktop integration
-----

# Abstract

61
62
63
64
65
66
67




68
69
70

    tk sysnotify "Alert" "This is just a test of the Tk System Notification Code."

# Implementation 

A draft implementation is currently under development in the tip_325 branch.





# Copyright

This document has been placed in the public domain.







>
>
>
>



65
66
67
68
69
70
71
72
73
74
75
76
77
78

    tk sysnotify "Alert" "This is just a test of the Tk System Notification Code."

# Implementation 

A draft implementation is currently under development in the tip_325 branch.

# Post-vote note 

There has been a follow-up ticket opened after this TIP was voted YES, with a patch providing the **tk systray exists** subcommand, see [92ab429295](https://core.tcl-lang.org/tk/tktview/92ab4292952a3fa10a15f414d59a4aa9984650ad). This feature has been committed as well.

# Copyright

This document has been placed in the public domain.

Changes to tip/333.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 333: New Variable and Namespace Resolving Interface
	Author:         Arnulf Wiedemann <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Oct-2008
	Post-History:   
	Keywords:       Tcl,resolution
	Tcl-Version:    8.7
-----

# Abstract

This is a TIP to allow easy command and variable resolving for itcl-ng, but is
not restricted to itcl-ng. It should be possible for an application to drive
the rules for command and variable lookup using the interface described








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 333: New Variable and Namespace Resolving Interface
	Author:         Arnulf Wiedemann <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Oct-2008
	Post-History:   
	Keywords:       Tcl,resolution
	Tcl-Version:    9.1
-----

# Abstract

This is a TIP to allow easy command and variable resolving for itcl-ng, but is
not restricted to itcl-ng. It should be possible for an application to drive
the rules for command and variable lookup using the interface described

Changes to tip/344.md.

1
2
3
4
5
6
7
8





9
10
11
12
13
14
15
# TIP 344: Bring TCP_NODELAY and SO_KEEPALIVE to socket options
	Author:		Alexandre Ferrieux <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	31-Dec-2008
	Post-History:	
	Tcl-Version:	8.7





-----

# Abstract

Just expose to script level, via **fconfigure**, the two most important
setsockopt\(\) use cases: TCP\_NODELAY \(disabling the Nagle agorithm\) and
SO\_KEEPALIVE \(sending automatic keepalives\).


|

|



>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# TIP 344: Bring TCP_NODELAY and SO_KEEPALIVE to socket options
	Author:		Alexandre Ferrieux <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	31-Dec-2008
	Post-History:	
	Tcl-Version:	8.7
	Tcl-Branch:     tip-344
	Vote-Summary:	Accepted 3/0/1
	Votes-For:	JN, KW, SL
	Votes-Against:	none
	Votes-Present:	FV
-----

# Abstract

Just expose to script level, via **fconfigure**, the two most important
setsockopt\(\) use cases: TCP\_NODELAY \(disabling the Nagle agorithm\) and
SO\_KEEPALIVE \(sending automatic keepalives\).
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
specific cases. This TIP does not try to argument about the prevalence of
these cases; the ubiquity of setsockopt\(TCP\_NODELAY\) suffices to justify
exposing it to script level.

# Proposed Change

This TIP proposes to add two boolean [fconfigure] options to sockets:
**-nodelay** \(or **-nonagle**, or **-nagle**, take your pick\) and
**-keepalive**.

# Reference Implementation

Pretty trivial; will be provided shortly after validation. The code has even
been in place for a long time, though only in the Windows-specific part, and
commented/ifdef'ed out...
 
# Copyright

This document has been placed in the public domain.








<
|











30
31
32
33
34
35
36

37
38
39
40
41
42
43
44
45
46
47
48
specific cases. This TIP does not try to argument about the prevalence of
these cases; the ubiquity of setsockopt\(TCP\_NODELAY\) suffices to justify
exposing it to script level.

# Proposed Change

This TIP proposes to add two boolean [fconfigure] options to sockets:

**-nodelay** and **-keepalive**.

# Reference Implementation

Pretty trivial; will be provided shortly after validation. The code has even
been in place for a long time, though only in the Windows-specific part, and
commented/ifdef'ed out...
 
# Copyright

This document has been placed in the public domain.

Changes to tip/346.md.

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
# TIP 346: Error on Failed String Encodings
	Author:         Alexandre Ferrieux <[email protected]>

	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        02-Feb-2009
	Post-History:   
	Keywords:       Tcl,encoding,convertto,strict,Unicode,String,ByteArray
	Tcl-Version:    8.7






-----

# Abstract

This TIP proposes to raise an error when an encoding-based conversion
loses information.

# Background

Encoding-based conversions occur e.g. when writing a string to a
channel. In doing so, Unicode characters are converted to sequences of bytes
according to the channel's encoding. Similarly, a conversion can occur
on request of the ByteArray internal representation of an object, the target
encoding being ISO8859-1. In both cases, for some
combinations of Unicode char and target encoding, the mapping is lossy
\(non-injective\). For example, the "`é`" character, and many of its
cousins, is mapped to a "`?`" in the '**ascii**' target encoding. Also, Unicode chars above \\u00FF get 'projected' onto their low byte in the ISO8859-1 ByteArray conversion.

This loss of information, in the first case, introduces unnoticed i18n
mishandlings. In the second case, it makes it unreliable to do pure-ByteArray
operations on objects unless they have no string representation. This induces
unwanted and hard-to-debug performance hits on bytearray manipulations when
people add debugging **puts**.

# Proposed Change

This TIP proposes to make this loss conspicuous.

For the first use case, the idea is to introduce a **-strict** option to
**encoding convertto**, that would raise an explicit error when non-mappable


characters are met. Lossy conversions during channel I/O would also fail if a **-strictencoding true** [fconfigure] option is set.


  For the second case, we simply want the conversion to



fail, like does the Listification of an ill-formed list. In both cases, the


change consists of letting the proper internal conversion routine like **SetByteArrayFromAny** return TCL\_ERROR.




















# Rationale







The second case does imply a Potential Incompatibility, since currently SBFA is documented to always return TCL\_OK. However, it is felt







that virtually all cases that are sensitive to this, are actually half-working

in a completely hidden manner. Hence the global effect is a healthy one.


















# Reference Example

See [Bug 1665628](https://core.tcl-lang.org/tcl/tktview/1665628).

# Copyright

This document has been placed in the public domain.



>
|

|


|

>
>
>
>
>
>











|
<
<

|
|
|
<
<
<
<
<





|
|
>
>
|
>
>
|
>
>
>
|
>
>
|
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
|

>
>
>
>
>
>
|
>
>
>
>
>
>
>
|
>
|
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


|





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
# TIP 346: Error on Failed String Encodings
	Author:         Alexandre Ferrieux <[email protected]>
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        02-Feb-2009
	Post-History:   
	Keywords:       Tcl,encoding,convertto,strict,Unicode
	Tcl-Version:    8.7
	Tcl-Branch:     tip-346
	Obsoleted-By:	654
	Vote-Summary   Accepted 5/0/0
	Votes-For:     FV, JN, KW, MC, SL
	Votes-Against: none
	Votes-Present: none
-----

# Abstract

This TIP proposes to raise an error when an encoding-based conversion
loses information.

# Background

Encoding-based conversions occur e.g. when writing a string to a
channel. In doing so, Unicode characters are converted to sequences of bytes
according to the channel's encoding.  For some


combinations of Unicode char and target encoding, the mapping is lossy
\(non-injective\). For example, the "`é`" character and many of its
cousins is mapped to a "`?`" in the '**ascii**' target encoding.  This loss of
information is sometimes not desired.






# Proposed Change

This TIP proposes to make this loss conspicuous.

The idea is to introduce a **-strict** option to **encoding convertto**/**encoding convertfrom**,
that would raise an explicit error when non-mappable characters are met. Every
encoder/decoder can decide, depending on this flag, if it tries to convert
invalid (but common) byte sequences to valid characters or not.

This **-strict** option cannot be combined with the already existing
**-nocomplain** option (see also "History" section below).

For channels, there's a new **-strictencoding** option, to be used in `fconfigure`,
which can be set to true (default: false). Setting it to true has the same
effect as the **-strict** option for **encoding convertto**/**encoding convertfrom**.

For the `utf-8`/`utf-16`/`utf-32` encodings, the **-strict** options has an additional effect for
3 different situations it generates an exception for:

* Byte sequence '\\xC0\\x80' is normally accepted by the utf-8 decoder, since it's a
representation of '\\x00'. When using **-strict**, this byte sequence will raise an error.
<pre>
% encoding convertfrom -strict utf-8 \\xC0\\x80
unexpected byte sequence starting at index 0: '\\xC0'
</pre>

* Invalid byte sequences. By default, the utf-8 decoder detects invalid byte
sequences, but - if encountered - tries to handle them as if they were iso8859-1 or
cp1252. When using **-strict**, this now will raise an error.

* Surrogates. By default, the `utf-8`/`utf-16`/`utf-32` decoders detect surrogates,
but - if encountered - lets them pass through unchanged. When using **-strict**, this
now will raise an error. (This check was added after this TIP was accepted, see
last sentence in "Implementation" section below)

As said, other encoders handle **-strict** in their own way. Currently
the 'core' `utf-8`/`utf-16`/`utf-32` decoders and the table-based decoders
have **-strict** handling implemented.

# Implementation.

A new flag `TCL_ENCODING_STRICT` is introduced. This flag inherits all
behavior of `TCL_ENCODING_STOPONERROR`, but for the utf-8 decoder
it enables some additional checks, which result in an exception.
This flag can be used in `Tcl_UtfToExternalDStringEx()`/`Tcl_ExternalToUtfDStringEx()`
and all related API. Other encoders/decoders can use this flag
in their own way.

At this moment, the implementation is not 100% OK yet. There's a known bug
[6978c01b65](https://core.tcl-lang.org/tcl/tktview?name=6978c01b65) which
prevents an exception to be thrown when writing to a channel. Also, the
only additional check implemented now is for the '\\xC0\\x80' byte sequence.
After this TIP is accepted, more **strict** checks will be added
to more encodings: the meaning of _invalid byte sequence_ is
different for every encoder.

# History

The original version of this TIP also contained
changes to **SetByteArrayFromAny**, which are now available in [TIP #568](568).

See the original TIP #346 [here](https://core.tcl-lang.org/tips/artifact/af9e3e581ebc55f1).

The TIP - as voted - contained the sentence: "This **-strict** option cannot be combined
with the already existing **-nocomplain** and **-failindex** options.". After folow-up
discussion, it turned out to be a good idea to allow **-strict** with **-failindex**
(See: [[a31caff057]](https://core.tcl-lang.org/tcl/tktview?name=a31caff057)),
therefore this sentence is modified in the TIP.

The TIP - as voted - didn't handle Surrogates, but as Surrogates are
considered as _invalid_ in `utf-8`/`utf-16`/`utf-32` (unless paired
properly in `utf-16`), the TIP text is adapted accordingly.

Some wording that was relevant only to the now-removed ByteArray portion of
this TIP was later also removed.

# Reference Example

See [TIP #346](https://core.tcl-lang.org/tcl/timeline?r=tip-346).

# Copyright

This document has been placed in the public domain.

Changes to tip/349.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 349: New "-cargo" option for every Tk widget
	Author:        Zbigniew Baniewski <[email protected]>
	State:         Draft
	Type:          Project
	Tcl-Version:   8.7
	Vote:          Pending
	Created:       17-Apr-2009
	Post-History:
-----

# Abstract





|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 349: New "-cargo" option for every Tk widget
	Author:        Zbigniew Baniewski <[email protected]>
	State:         Draft
	Type:          Project
	Tcl-Version:   9.1
	Vote:          Pending
	Created:       17-Apr-2009
	Post-History:
-----

# Abstract

Changes to tip/355.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 355: Stop Fast Recycling of Channel Names on Unix
	Author:         Alexandre Ferrieux <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        01-Sep-2009
	Tcl-Version:    8.7
	Post-History:   
	Tcl-Ticket:     2826430
-----

# Abstract

This TIP proposes to put an end to the unix-specific habit of naming channels






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 355: Stop Fast Recycling of Channel Names on Unix
	Author:         Alexandre Ferrieux <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        01-Sep-2009
	Tcl-Version:    9.1
	Post-History:   
	Tcl-Ticket:     2826430
-----

# Abstract

This TIP proposes to put an end to the unix-specific habit of naming channels

Changes to tip/358.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 358: Suppress Empty List Element Generation from the Split Command
	Author:		George Petasis <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending
	Created:	04-Oct-2009
	Post-History:	
	Keywords:	Tcl, list extraction, parsing
-----

# Abstract




|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 358: Suppress Empty List Element Generation from the Split Command
	Author:		George Petasis <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Created:	04-Oct-2009
	Post-History:	
	Keywords:	Tcl, list extraction, parsing
-----

# Abstract

Changes to tip/361.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 361: Releasing Channel Buffers
	Author:		Wayne Cuddy <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	03-Feb-2010
	Tcl-Version:	8.7
	Post-History:
-----

# Abstract

Tcl should provide a mechanism by which a channel's output buffer can be
released without requiring that Tcl flush any remaining data in the buffer to






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 361: Releasing Channel Buffers
	Author:		Wayne Cuddy <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	03-Feb-2010
	Tcl-Version:	9.1
	Post-History:
-----

# Abstract

Tcl should provide a mechanism by which a channel's output buffer can be
released without requiring that Tcl flush any remaining data in the buffer to

Changes to tip/363.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 363: Vector Math in the Tcl Core
	Author:		Karl C. Hansen <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.0
	Vote:		Pending
	Created:	02-Mar-2010
	Post-History:	
	Keywords:	expand,{*},vector,math
-----

# Abstract




|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 363: Vector Math in the Tcl Core
	Author:		Karl C. Hansen <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Created:	02-Mar-2010
	Post-History:	
	Keywords:	expand,{*},vector,math
-----

# Abstract

Changes to tip/366.md.

1
2
3
4
5
6
7
8
9


10


11
12
13
14
15
16
17
# TIP 366: Variable Sized Indicators for Menubuttons
	Author:         Russell Davidson <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        29-Apr-2010
	Post-History:   
	Keywords:       Tk
	Tcl-Version:    8.7


	Tk-Ticket:      2996760


-----

# Abstract

This TIP is to allow custom sizing of menubutton indicators using
**-indwidth** and **-indheight** as options.



|

|



|
>
>
|
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# TIP 366: Variable Sized Indicators for Menubuttons
	Author:         Russell Davidson <[email protected]>
	State:          Rejected
	Type:           Project
	Vote:           Done
	Created:        29-Apr-2010
	Post-History:   
	Keywords:       Tk
	Tcl-Version:    9.0
	Tk-Branch:      tip-366
	Vote-Summary:   Rejected 1/1/1
	Votes-For:      KW
	Votes-Against:  JN
	Votes-Present:  SL
-----

# Abstract

This TIP is to allow custom sizing of menubutton indicators using
**-indwidth** and **-indheight** as options.

31
32
33
34
35
36
37
38
39
40
41
42
43
44
   indicator in 10ths of a mm \(will be converted to an integer number of pixels\).

 > The **-indheight** option allows the specification of the height of the
   indicator in 10ths of a mm \(will be converted to an integer number of pixels\).

# Implementation

A patch exists in SourceForge \(Feature Request 2996760
<https://sourceforge.net/support/tracker.php?aid=2996760> \).

# Copyright

This document has been placed in the public domain.








|
|





35
36
37
38
39
40
41
42
43
44
45
46
47
48
   indicator in 10ths of a mm \(will be converted to an integer number of pixels\).

 > The **-indheight** option allows the specification of the height of the
   indicator in 10ths of a mm \(will be converted to an integer number of pixels\).

# Implementation

A patch exists in [Tk branch `tip-366`](https://core.tcl-lang.org/tk/timeline?r=tip-366) or SourceForge
[Feature Request 2996760](https://sourceforge.net/support/tracker.php?aid=2996760).

# Copyright

This document has been placed in the public domain.

Changes to tip/369.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 369: Widget cargo command
	Author:         Russell Davidson <[email protected]>
	Author:         Trevor Davel <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        15-Jul-2010
	Post-History:   
	Keywords:       Tk,user-defined data,dictionary
	Tcl-Version:    8.7
	Tk-Ticket:      3023578
-----

# Abstract

This TIP is to add a **cargo** subcommand to widgets for storing data in a
data dictionary. This TIP is related to [[349]](349.md).









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 369: Widget cargo command
	Author:         Russell Davidson <[email protected]>
	Author:         Trevor Davel <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        15-Jul-2010
	Post-History:   
	Keywords:       Tk,user-defined data,dictionary
	Tcl-Version:    9.1
	Tk-Ticket:      3023578
-----

# Abstract

This TIP is to add a **cargo** subcommand to widgets for storing data in a
data dictionary. This TIP is related to [[349]](349.md).

Changes to tip/370.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 370: Extend Tk's selection with a -time option
	Author:		George Petasis <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending
	Created:	04-Aug-2010
	Post-History:
-----

# Abstract





|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 370: Extend Tk's selection with a -time option
	Author:		George Petasis <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Created:	04-Aug-2010
	Post-History:
-----

# Abstract

Changes to tip/371.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 371: Improvements for the dict command
	Author:         Thomas Perschak <[email protected]>
	Author:         Trevor Davel <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        05-Aug-2010
	Post-History:   
	Tcl-Version:    8.7
-----

# Abstract

The **dict** command is limited by allowing manipulation of only the first
level of key elements.  Not only should the **dict get** accept a nested key
list, but also the other commands like **dict replace**.








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 371: Improvements for the dict command
	Author:         Thomas Perschak <[email protected]>
	Author:         Trevor Davel <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        05-Aug-2010
	Post-History:   
	Tcl-Version:    9.1
-----

# Abstract

The **dict** command is limited by allowing manipulation of only the first
level of key elements.  Not only should the **dict get** accept a nested key
list, but also the other commands like **dict replace**.

Changes to tip/374.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 374: Stackless Vwait
	Author:         Thomas Perschak <[email protected]>
	Author:         Trevor Davel <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Aug-2010
	Post-History:   
	Tcl-Version:    8.7
-----

# Abstract

This TIP proposes a way to have multiple procedures waiting for an event to happen, where the command that gets executed depends on the order of the
events.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 374: Stackless Vwait
	Author:         Thomas Perschak <[email protected]>
	Author:         Trevor Davel <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Aug-2010
	Post-History:   
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes a way to have multiple procedures waiting for an event to happen, where the command that gets executed depends on the order of the
events.

Changes to tip/379.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 379: Add a Command for Delivering Events Without Tk
	Author:		Will Duquette <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending
	Created:	17-Oct-2010
	Post-History:	
	Keywords:	event
	Implementation-URL: http://www.wjduquette.com/notifier/hook-0.1.zip
-----





|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 379: Add a Command for Delivering Events Without Tk
	Author:		Will Duquette <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Created:	17-Oct-2010
	Post-History:	
	Keywords:	event
	Implementation-URL: http://www.wjduquette.com/notifier/hook-0.1.zip
-----

Changes to tip/384.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 384: Add File Alteration Monitoring to the Tcl Core
	Author:         Reinhard Max <[email protected]>
	Author:         Gerald W. Lester <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        02-Dec-2010
	Post-History:   
	Keywords:       kqueue,inotify,dnotify,gamin,FSevents,fam
	Tcl-Version:    8.7
-----

# Abstract

This TIP proposes to add capabilities for monitoring changes in the file
system to the Tcl core.










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 384: Add File Alteration Monitoring to the Tcl Core
	Author:         Reinhard Max <[email protected]>
	Author:         Gerald W. Lester <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        02-Dec-2010
	Post-History:   
	Keywords:       kqueue,inotify,dnotify,gamin,FSevents,fam
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes to add capabilities for monitoring changes in the file
system to the Tcl core.

Changes to tip/385.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 385: Functional Traces On Variables
	Author:         Alexandre Ferrieux <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Feb-2011
	Post-History:   
	Keywords:       Tcl, traces
	Tcl-Version:    9.0
-----

# Abstract

Functional traces are new variants of variable traces, that rely
purely on value passing rather than variable updating. Applied to array
traces, they allow a much more efficient implementation of various storage backends.








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 385: Functional Traces On Variables
	Author:         Alexandre Ferrieux <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Feb-2011
	Post-History:   
	Keywords:       Tcl, traces
	Tcl-Version:    9.1
-----

# Abstract

Functional traces are new variants of variable traces, that rely
purely on value passing rather than variable updating. Applied to array
traces, they allow a much more efficient implementation of various storage backends.

Changes to tip/390.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
# TIP 390: A Logging API for Tcl
	Author:         Jeff Rogers <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Tcl-Version:    8.7
	Created:        27-Oct-2011
	Vote:           Pending
	Post-History:	
-----

# Abstract






|







1
2
3
4
5
6
7
8
9
10
11
12
13
# TIP 390: A Logging API for Tcl
	Author:         Jeff Rogers <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Tcl-Version:    9.1
	Created:        27-Oct-2011
	Vote:           Pending
	Post-History:	
-----

# Abstract

Changes to tip/392.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 392: Allow Bignums to be Disabled at Runtime on a Per-Interp Basis
	Author:		Joe Mistachkin <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	30-Oct-2011
	Keywords:	bignum,runaway,safe,math,precision,integer,tcl
	Tcl-Version:	8.7
	Post-History:	
-----

# Abstract

This TIP proposes the ability to enable or disable all use of bignums at
runtime on a per-interpreter basis.  The mechanism being presented to







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 392: Allow Bignums to be Disabled at Runtime on a Per-Interp Basis
	Author:		Joe Mistachkin <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	30-Oct-2011
	Keywords:	bignum,runaway,safe,math,precision,integer,tcl
	Tcl-Version:	9.1
	Post-History:	
-----

# Abstract

This TIP proposes the ability to enable or disable all use of bignums at
runtime on a per-interpreter basis.  The mechanism being presented to

Changes to tip/393.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 393: Add -command Option to lsearch
	Author:         Pawel Salawa <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        25-Apr-2011
	Post-History:   
	Tcl-Version:    8.7
	Implementation-URL: http://sqlitestudio.pl/tcl/patches/tip-393-lsearch-command.patch
-----

# Abstract

This document describes new option for **lsearch** named **-command** that
lets the developer define a custom comparision algorithm for searching for an







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 393: Add -command Option to lsearch
	Author:         Pawel Salawa <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        25-Apr-2011
	Post-History:   
	Tcl-Version:    9.1
	Implementation-URL: http://sqlitestudio.pl/tcl/patches/tip-393-lsearch-command.patch
-----

# Abstract

This document describes new option for **lsearch** named **-command** that
lets the developer define a custom comparision algorithm for searching for an

Changes to tip/394.md.

1
2
3
4
5
6
7

8
9
10
11
12
13
14
# TIP 394: Platform-Independent Handling of Contemporary Mice
	Author:		Andreas Leitgeb <[email protected]>
	Type:		Project
	Tcl-Version:	8.7
	State:		Draft
	Vote:		Pending
	Created:	30-Nov-2011

	Post-History:	
-----

# Abstract

This TIP proposes a change to Tk's Events such as to support new features of
modern pointer devices \(mice\) in a platform-independent way.







>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 394: Platform-Independent Handling of Contemporary Mice
	Author:		Andreas Leitgeb <[email protected]>
	Type:		Project
	Tcl-Version:	8.7
	State:		Draft
	Vote:		Pending
	Created:	30-Nov-2011
	Obsoleted-By:	474
	Post-History:	
-----

# Abstract

This TIP proposes a change to Tk's Events such as to support new features of
modern pointer devices \(mice\) in a platform-independent way.

Changes to tip/401.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 401: Comment Words with Leading {#}
	Author:         Lars Hellström <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        29-Apr-2012
	Post-History:   
	Tcl-Version:    8.7
	Tcl-Branch:     tip-401
-----

# Abstract

The basic syntax rules of Tcl \(the "dodekalogue"\) are modified to allow words
that are comments. In analogy with the argument expansion **\{\*\}**, such







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 401: Comment Words with Leading {#}
	Author:         Lars Hellström <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        29-Apr-2012
	Post-History:   
	Tcl-Version:    9.1
	Tcl-Branch:     tip-401
-----

# Abstract

The basic syntax rules of Tcl \(the "dodekalogue"\) are modified to allow words
that are comments. In analogy with the argument expansion **\{\*\}**, such

Changes to tip/402.md.

1
2
3
4
5
6
7
8
9
10
11




12
13
14
15
16
17
18
# TIP 402: General Platform UNC Support
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        16-Jul-2011
	Post-History:   
	Discussions-To: Tcl Core list
	Keywords:       Tcl
	Tcl-Version:    8.7
	Tcl-Branch:     jn-unc-vfs




-----

# Abstract

Both Windows and Cygwin interpret paths starting with **//** as a special
prefix, indicating that the path has the form: **//server/share/file\_path**.
Windows has built-in handling of such paths built-in. UNIX doesn't have this.


|

|





|
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# TIP 402: General Platform UNC Support
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        16-Jul-2011
	Post-History:   
	Discussions-To: Tcl Core list
	Keywords:       Tcl
	Tcl-Version:    8.7
	Tcl-Branch:     tip-402
	Vote-Results:   3/0/2 accepted
	Votes-For:      FV, KW, JN
	Votes-Against:  none
	Votes-Present:  DGP, SL
-----

# Abstract

Both Windows and Cygwin interpret paths starting with **//** as a special
prefix, indicating that the path has the form: **//server/share/file\_path**.
Windows has built-in handling of such paths built-in. UNIX doesn't have this.
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

 * Extend the special case built-in for Windows and Cygwin to UNIX, so paths
   starting with double-slash will no longer normalize to paths starting with
   a single slash.

	 > **POTENTIAL INCOMPATIBILITY**

 * As **//** becomes a special prefix, the **file split** will return

   **//** as its first list element when the original path starts with a
   double slash.

# Compatibility

On UNIX, this means that paths like **//usr/bin/tclsh** might no longer do
what it did earlier, if a VFS exists which uses **//** as path prefix. If no
such VFS exists, it will probably still work, only comparing normalized paths
will no longer regard **//<foo>** as equal to **/<foo>**.

Handling of multiple slashes in other locations of the string will not
change. So normalizing **/foo//bar** will still give **/foo/bar**.  The
most likely cause of multiple slashes appearing in a path is because of
appending a file name to a path which already ends with a slash, e.g.

	set dir "somedir/"
	set path $dir/filename

Of course, the **file join** command does not have this danger:

	set dir "somedir/"
	set path [file join $dir filename]

On Windows and Cygwin, there is no change in behavior at all.

# Alternatives

Variations are possible in the handling of paths starting with 3 or more
slashes. The current TIP implementation collapes more than 2 slashes to
exactly 2 slashes, as the current Windows and Cygwin implementations do.

# Reference Implementation

A reference implementation is available at <https://core.tcl-lang.org/tcl> in branch
_jn-unc-vfs_.

# Copyright

This document has been placed in the public domain.








|
>
|
<






|



















|





|





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

 * Extend the special case built-in for Windows and Cygwin to UNIX, so paths
   starting with double-slash will no longer normalize to paths starting with
   a single slash.

	 > **POTENTIAL INCOMPATIBILITY**

 * As **//&lt;foo>** becomes a special prefix (where **&lt;foo>** can be anything not
   containing '/'), the **file split** command will return **//&lt;foo>** as its
   first list element when the original path starts with a double slash.


# Compatibility

On UNIX, this means that paths like **//usr/bin/tclsh** might no longer do
what it did earlier, if a VFS exists which uses **//** as path prefix. If no
such VFS exists, it will probably still work, only comparing normalized paths
will no longer regard **//&lt;foo>** as equal to **/&lt;foo>**.

Handling of multiple slashes in other locations of the string will not
change. So normalizing **/foo//bar** will still give **/foo/bar**.  The
most likely cause of multiple slashes appearing in a path is because of
appending a file name to a path which already ends with a slash, e.g.

	set dir "somedir/"
	set path $dir/filename

Of course, the **file join** command does not have this danger:

	set dir "somedir/"
	set path [file join $dir filename]

On Windows and Cygwin, there is no change in behavior at all.

# Alternatives

Variations are possible in the handling of paths starting with 3 or more
slashes. The current TIP implementation collapses more than 2 slashes to
exactly 2 slashes, as the current Windows and Cygwin implementations do.

# Reference Implementation

A reference implementation is available at <https://core.tcl-lang.org/tcl> in branch
_tip-402_.

# Copyright

This document has been placed in the public domain.

Changes to tip/408.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 408: Allow Any Command for expr Functions
	Author:		Brian Griffin <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	17-Aug-2012
	Post-History:	
	Tcl-Version:	8.7
-----

# Abstract

Proposed expansion of what constitutes a function in an **expr** expression.

# Rationale: Nested expr Calls







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 408: Allow Any Command for expr Functions
	Author:		Brian Griffin <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	17-Aug-2012
	Post-History:	
	Tcl-Version:	9.1
-----

# Abstract

Proposed expansion of what constitutes a function in an **expr** expression.

# Rationale: Nested expr Calls

Changes to tip/409.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# TIP 409: UDP in Tcl
	Author:         Alexandre Ferrieux <[email protected]>
	Author:         Colin McCormack <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        17-Aug-2012
	Post-History:   
	Keywords:       udp,datagram,message
	Obsoletes:      391
	Tcl-Version:    8.7
-----

# Abstract

This TIP  adds support for UDP in  Tcl, with a pure  event approach to
packet  reception  \(as  opposed  to  hijacking  the  existing  channel
infrastructure\).










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# TIP 409: UDP in Tcl
	Author:         Alexandre Ferrieux <[email protected]>
	Author:         Colin McCormack <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        17-Aug-2012
	Post-History:   
	Keywords:       udp,datagram,message
	Obsoletes:      391
	Tcl-Version:    9.1
-----

# Abstract

This TIP  adds support for UDP in  Tcl, with a pure  event approach to
packet  reception  \(as  opposed  to  hijacking  the  existing  channel
infrastructure\).

Changes to tip/410.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 410: Three Features of scan Adapted for binary scan/format
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        26-Aug-2012
	Post-History:   
	Tcl-Version:    8.7
-----

# Abstract

This proposal specifies three new features for **binary scan** and **binary
format** that already exist similarly for **scan**, namely: **\#** for
consuming a count-value from the parameter list \(like "**scan %\***"\),







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 410: Three Features of scan Adapted for binary scan/format
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        26-Aug-2012
	Post-History:   
	Tcl-Version:    9.1
-----

# Abstract

This proposal specifies three new features for **binary scan** and **binary
format** that already exist similarly for **scan**, namely: **\#** for
consuming a count-value from the parameter list \(like "**scan %\***"\),

Changes to tip/411.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 411: Improved Channel Introspection via "chan info"
	Author:         Pawel Salawa <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        31-Aug-2012
	Post-History:   
	Tcl-Version:    8.7
	Implementation-URL: http://sqlitestudio.pl/tcl/patches/tip-411-chan_info.patch
-----

# Abstract

This document describes new subcommand for **chan**, **chan info**, that
provides a unified interface to deeper introspection of information about a







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 411: Improved Channel Introspection via "chan info"
	Author:         Pawel Salawa <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        31-Aug-2012
	Post-History:   
	Tcl-Version:    9.1
	Implementation-URL: http://sqlitestudio.pl/tcl/patches/tip-411-chan_info.patch
-----

# Abstract

This document describes new subcommand for **chan**, **chan info**, that
provides a unified interface to deeper introspection of information about a

Changes to tip/413.md.

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
string, but in the past it could as being a zero-width no-break space. It had
the _White\_Space_ property in Unicode 2.0, but later versions of Unicode do
not; the use of the BOM as a space was deprecated.

When the use as space was deprecated for \(U\+FEFF\), another character was put
forward as replacement for it: word joiner \(U\+2060\). As this character has no
visible representation, and has no meaning at all when at the start or the end
of a string, it makes sense to include it in the "Tcl space set" as well, the
more because its predecessor had the _White\_Space_ property.

Finally, zero width space \(U\+200B\), had the _White\_Space_ property in
Unicode 3.0. In the current Unicode Charts it is still listed as being a
space, even though the White\_Space property was removed later. Therefore it
should be in the "Tcl space set" as well.

# Specification

This document proposes:

 * For the ASCII set, **string is space** stays as is.  **string trim**
   will be modified to trim all characters for which **string is space**
   returns 1, augmented with the NUL character. This means that NUL, VT and FF
   will be added to the set. This is a **potential incompatibility**.

 * For characters outside ASCII, the Unicode **White\_Space**
   <http://www.unicode.org/Public/6.2.0/ucd/PropList.txt>  property forms the
   basis of what **string is space** and **string trim** consider being
   space. But 3 characters are added to the set: zero with space \(U\+200B\),
   word joiner \(U\+2060\) and zero width no-break space \(U\+FEFF\) \(i.e., the
   BOM\).

The **string trimleft** and **string trimright** commands will also be
modified, as they track **string trim**.

# Compatibility







|
|


















|







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
string, but in the past it could as being a zero-width no-break space. It had
the _White\_Space_ property in Unicode 2.0, but later versions of Unicode do
not; the use of the BOM as a space was deprecated.

When the use as space was deprecated for \(U\+FEFF\), another character was put
forward as replacement for it: word joiner \(U\+2060\). As this character has no
visible representation, and has no meaning at all when at the start or the end
of a string, it makes sense to include it in the "Tcl space set" as well, and 
more so because its predecessor had the _White\_Space_ property.

Finally, zero width space \(U\+200B\), had the _White\_Space_ property in
Unicode 3.0. In the current Unicode Charts it is still listed as being a
space, even though the White\_Space property was removed later. Therefore it
should be in the "Tcl space set" as well.

# Specification

This document proposes:

 * For the ASCII set, **string is space** stays as is.  **string trim**
   will be modified to trim all characters for which **string is space**
   returns 1, augmented with the NUL character. This means that NUL, VT and FF
   will be added to the set. This is a **potential incompatibility**.

 * For characters outside ASCII, the Unicode **White\_Space**
   <http://www.unicode.org/Public/6.2.0/ucd/PropList.txt>  property forms the
   basis of what **string is space** and **string trim** consider being
   space. But 3 characters are added to the set: zero width space \(U\+200B\),
   word joiner \(U\+2060\) and zero width no-break space \(U\+FEFF\) \(i.e., the
   BOM\).

The **string trimleft** and **string trimright** commands will also be
modified, as they track **string trim**.

# Compatibility
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
 2. NUL could be left out of the **string trim** set.

 3. Additional characters I considered being part of the set:

		    break permitted here (U+0082)
		    no break here (U+0083)
		    zero width joiner (U+200C)
		    zero with non-joiner (U+200D)

	  > Those are clearly useful characters to be stripped, as they have no
    meaning and no visible appearance at the beginning or end of a string. But
    they are not spaces, so it would diverge the two commands.

# Reference Implementation








|







103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
 2. NUL could be left out of the **string trim** set.

 3. Additional characters I considered being part of the set:

		    break permitted here (U+0082)
		    no break here (U+0083)
		    zero width joiner (U+200C)
		    zero width non-joiner (U+200D)

	  > Those are clearly useful characters to be stripped, as they have no
    meaning and no visible appearance at the beginning or end of a string. But
    they are not spaces, so it would diverge the two commands.

# Reference Implementation

Changes to tip/417.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 417: Use Explicit Option Names for "file tempfile"
	Author:		Christophe Curis <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending
	Created:	16-Nov-2012
	Post-History:
	Keywords:	Tcl, future expansion, extensibility
-----

# Abstract




|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 417: Use Explicit Option Names for "file tempfile"
	Author:		Christophe Curis <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Created:	16-Nov-2012
	Post-History:
	Keywords:	Tcl, future expansion, extensibility
-----

# Abstract

Changes to tip/418.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 418: Add [binary] Subcommands for In-Place Modification
	Author:         Jeff Rogers <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        27-Aug-2012
	Post-History:   
	Keywords:       Tcl,binary data
	Tcl-Version:    8.7
-----

# Abstract

This TIP proposes adding new subcommands to the **binary** to better enable
parsing and manipulation of binary values.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 418: Add [binary] Subcommands for In-Place Modification
	Author:         Jeff Rogers <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        27-Aug-2012
	Post-History:   
	Keywords:       Tcl,binary data
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes adding new subcommands to the **binary** to better enable
parsing and manipulation of binary values.

Changes to tip/419.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 419: A New Command for Binding to Tk Events
	Author:         Jeff Rogers <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        28-Aug-2012
	Post-History:   
	Tcl-Version:    8.7
	Implementation-URL: http://wiki.tcl.tk/tkevent
-----

# Abstract

This TIP proposes a more modern mechanism for binding callbacks to Tk's
events.







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 419: A New Command for Binding to Tk Events
	Author:         Jeff Rogers <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        28-Aug-2012
	Post-History:   
	Tcl-Version:    9.1
	Implementation-URL: http://wiki.tcl.tk/tkevent
-----

# Abstract

This TIP proposes a more modern mechanism for binding callbacks to Tk's
events.

Changes to tip/420.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 420: 'vexpr', a Vector Expression Command
	Author:         Sean Woods <[email protected]>
	Author:         Andreas Kupries <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        15-Nov-2012
	Post-History:   
	Tcl-Version:    8.7
	Implementation-URL: http://www.etoyoc.com/tclmatrix3d
-----

# Abstract

This TIP proposes to add a new command to Tcl for manipulating vectors and
related mathematical objects. The command, **vexpr**, will provide








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 420: 'vexpr', a Vector Expression Command
	Author:         Sean Woods <[email protected]>
	Author:         Andreas Kupries <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        15-Nov-2012
	Post-History:   
	Tcl-Version:    9.1
	Implementation-URL: http://www.etoyoc.com/tclmatrix3d
-----

# Abstract

This TIP proposes to add a new command to Tcl for manipulating vectors and
related mathematical objects. The command, **vexpr**, will provide

Changes to tip/423.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 423: Formatting Timestamps with Milliseconds
	Author:		Thomas Perschak <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending
	Created:	07-Jun-2013
	Post-History:
	Keywords:	Tcl, time, millisecond resolution
-----

# Abstract




|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 423: Formatting Timestamps with Milliseconds
	Author:		Thomas Perschak <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Created:	07-Jun-2013
	Post-History:
	Keywords:	Tcl, time, millisecond resolution
-----

# Abstract

Changes to tip/424.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 424: Improving [exec]
	Author:         Alexandre Ferrieux <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        07-Jul-2013
	Post-History:   
	Keywords:       Tcl,subprocess,execution
	Tcl-Version:    8.7
	Tcl-Branch:     tip-improve-exec
-----

# Abstract

This extension overcomes day-1 limitations of [**exec**]'s syntax,
allowing for unconstrained arguments to commands, and opening the path to more








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 424: Improving [exec]
	Author:         Alexandre Ferrieux <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        07-Jul-2013
	Post-History:   
	Keywords:       Tcl,subprocess,execution
	Tcl-Version:    9.1
	Tcl-Branch:     tip-improve-exec
-----

# Abstract

This extension overcomes day-1 limitations of [**exec**]'s syntax,
allowing for unconstrained arguments to commands, and opening the path to more

Changes to tip/428.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 428: Produce Error Dictionary from 'fconfigure -error'
	Author:         Harald Oehlmann <[email protected]>
	Author:         Harald Oehlmann <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        16-Mar-2014
	Post-History:   
	Keywords:       socket,non-blocking,error reporting,option dictionary
	Tcl-Version:    8.7
	Tcl-Branch:     tip-428
-----

# Abstract

This TIP proposes a new method which allows to return the error message and the error code of a background socket error \(as reported by **fconfigure -error**\), similar to the option dictionaries produced by catch and try and consumed by return.










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 428: Produce Error Dictionary from 'fconfigure -error'
	Author:         Harald Oehlmann <[email protected]>
	Author:         Harald Oehlmann <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        16-Mar-2014
	Post-History:   
	Keywords:       socket,non-blocking,error reporting,option dictionary
	Tcl-Version:    9.1
	Tcl-Branch:     tip-428
-----

# Abstract

This TIP proposes a new method which allows to return the error message and the error code of a background socket error \(as reported by **fconfigure -error**\), similar to the option dictionaries produced by catch and try and consumed by return.

Changes to tip/430.md.

164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
## New Tclsh features for TEA

To assist in packaging extensions, **tclsh** will take on a new command _install_. If
_install_ is the first argument, set subsequent arguments are passed to a new file
in library **install.tcl**.

**tclsh install** with no arguments is designed to return immediately with a normal return code,
thus making it easy to test if a tclsh is tip430 savvy but running in autoconf:

    AS_IF([$TCLSH_PROG install],[
        ZIP_PROG=${TCLSH_PROG}
        ZIP_PROG_OPTIONS="install mkzip"
        ZIP_PROG_VFSSEARCH="."
        AC_MSG_RESULT([Can use Native Tclsh for Zip encoding])
    ])

This tip only defines 2 function for install:

 * **tclsh install mkzip** ...

    This command is a passthrough to the **zipfs mkzip** command, and allows
    tclsh to operate as zip encoder from make.

 * **tclsh install mkimg** ....







|








|







164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
## New Tclsh features for TEA

To assist in packaging extensions, **tclsh** will take on a new command _install_. If
_install_ is the first argument, set subsequent arguments are passed to a new file
in library **install.tcl**.

**tclsh install** with no arguments is designed to return immediately with a normal return code,
thus making it easy to test if a tclsh is TIP #430 savvy but running in autoconf:

    AS_IF([$TCLSH_PROG install],[
        ZIP_PROG=${TCLSH_PROG}
        ZIP_PROG_OPTIONS="install mkzip"
        ZIP_PROG_VFSSEARCH="."
        AC_MSG_RESULT([Can use Native Tclsh for Zip encoding])
    ])

This TIP only defines 2 function for install:

 * **tclsh install mkzip** ...

    This command is a passthrough to the **zipfs mkzip** command, and allows
    tclsh to operate as zip encoder from make.

 * **tclsh install mkimg** ....
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
*tclIOUtil.c* has a minor patch to exclude UNC style paths that contain a colon \(:\) in
the server field from being resolved by the operating system. (Which by standard is
not allowed anyway.) This allows VFS file systems to use **//**_FSTYPE_**:** namespace
with impunity.

## Modifications to the Tcl build system

Tcl will now attempt to find a zip encoder in the environment. If a tip430 savvy tclsh is
discovered, that shell will be used. Failing that, the system will search for an executable
named **zip**. Failing that, tcl will build it's own zip encoder.

When it cannot locate a zip encoded in the environment, Tcl will now build a copy of the
**minizip** program, whose source is currently distributed
in */compat/zlib/contrib/minizip*. The *tcl.m4* macro now detects if the compiler used
can produce native native executables, and in cases where it cannot, will search for







|







263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
*tclIOUtil.c* has a minor patch to exclude UNC style paths that contain a colon \(:\) in
the server field from being resolved by the operating system. (Which by standard is
not allowed anyway.) This allows VFS file systems to use **//**_FSTYPE_**:** namespace
with impunity.

## Modifications to the Tcl build system

Tcl will now attempt to find a zip encoder in the environment. If a TIP #430 savvy tclsh is
discovered, that shell will be used. Failing that, the system will search for an executable
named **zip**. Failing that, tcl will build it's own zip encoder.

When it cannot locate a zip encoded in the environment, Tcl will now build a copy of the
**minizip** program, whose source is currently distributed
in */compat/zlib/contrib/minizip*. The *tcl.m4* macro now detects if the compiler used
can produce native native executables, and in cases where it cannot, will search for

Changes to tip/439.md.

1
2
3
4
5
6
7
8



9
10
11
12
13
14
15
# TIP 439: Semantic Versioning
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Dec-2015
	Post-History:   
	Tcl-Version:    8.7



	Tcl-Branch:     semver
-----

# Abstract

The version schema used by Tcl and Tk has the form MAJOR.MINOR.PATCH, which is
the same schema used by "Semantic Versioning" <http://semver.org/> . For alpha








>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# TIP 439: Semantic Versioning
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Dec-2015
	Post-History:   
	Tcl-Version:    8.7
	Obsoleted-By:   595
	Obsoleted-By:   599
	Obsoleted-By:   628
	Tcl-Branch:     semver
-----

# Abstract

The version schema used by Tcl and Tk has the form MAJOR.MINOR.PATCH, which is
the same schema used by "Semantic Versioning" <http://semver.org/> . For alpha

Changes to tip/445.md.

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
# Abstract

Proposes additional public routines useful for extensions that implement
custom `Tcl_ObjType`s.

# Background

When an extension creates a custom **Tcl\_ObjType** it needs to operate on the fields of the **Tcl\_Obj** and the **Tcl\_ObjType** structs.


Almost all of these operations have been nicely encapsulated in utility routines, so for example, an extension calls **Tcl\_GetString** to make sure a value is set for _objPtr->bytes_, rather than worrying about the backing details of calling the routine _objPtr->typePtr->updateStringProc_ \(if present\) for itself.  Likewise **Tcl\_DuplicateObj** routes processing to type-specific routines as needed.






There are gaps in this interface.  Most glaring is the lack of any way to call the _freeIntRepProc_ of an incumbent type other than directly through the _typePtr_ field.  Another missing bit is an encapsulated way to set the string rep without direct manipulation of the _bytes_ and _length_ fields.  Within Tcl itself, there are internal utility macros **TclFreeIntRep** and **TclInitStringRep** for these tasks, but extensions have nothing.







Besides convenience, utility routines such as these improve chances for correctness, since they bring constraints into one place instead of many places.  For example, the requirement that when _objPtr->typePtr_ is not NULL, it must be paired with an appropriate _objPtr->internalRep_.  The **TclFreeIntRep** macro has a history of fixing such bugs.  A corresponding routine will offer the same benefit to extensions.






# Proposal

Add to Tcl's stub table of public C routines a new routine

 > void **Tcl\_FreeIntRep**\(Tcl\_Obj\* _objPtr_\)

that performs precisely the same task as the existing internal
macro **TclFreeIntRep**.

Add to Tcl's stub table of public C routines a new routine 

 > char \* **Tcl\_InitStringRep**\(Tcl\_Obj\* _objPtr_, const char\* _bytes_, unsigned int _numBytes_\)







|
>

|
>
>
>
>
>

|
>
>
>
>
>
>

|
>
>
>
>
>





|







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
# Abstract

Proposes additional public routines useful for extensions that implement
custom `Tcl_ObjType`s.

# Background

When an extension creates a custom **Tcl\_ObjType** it needs to operate
on the fields of the **Tcl\_Obj** and the **Tcl\_ObjType** structs.

Almost all of these operations have been nicely encapsulated in utility
routines, so for example, an extension calls **Tcl\_GetString** to make
sure a value is set for _objPtr->bytes_, rather than worrying about the
backing details of calling the routine _objPtr->typePtr->updateStringProc_
\(if present\) for itself.  Likewise **Tcl\_DuplicateObj** routes
processing to type-specific routines as needed.

There are gaps in this interface.  Most glaring is the lack of any way
to call the _freeIntRepProc_ of an incumbent type other than directly
through the _typePtr_ field.  Another missing bit is an encapsulated way
to set the string rep without direct manipulation of the _bytes_
and _length_ fields.  Within Tcl itself, there are internal utility
macros **TclFreeIntRep** and **TclInitStringRep** for these tasks,
but extensions have nothing.

Besides convenience, utility routines such as these improve chances
for correctness, since they bring constraints into one place instead of
many places.  For example, the requirement that when _objPtr->typePtr_
is not NULL, it must be paired with an appropriate _objPtr->internalRep_.
The **TclFreeIntRep** macro has a history of fixing such bugs.  A
corresponding routine will offer the same benefit to extensions.

# Proposal

Add to Tcl's stub table of public C routines a new routine

 > void **Tcl\_FreeInternalRep**\(Tcl\_Obj\* _objPtr_\)

that performs precisely the same task as the existing internal
macro **TclFreeIntRep**.

Add to Tcl's stub table of public C routines a new routine 

 > char \* **Tcl\_InitStringRep**\(Tcl\_Obj\* _objPtr_, const char\* _bytes_, unsigned int _numBytes_\)
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
wants to act on _objPtr_ differently depending on whether or
not it is a _pure_ value.  Typically this only makes sense in
an extension if it is already known that _objPtr_ possesses
an internal type that is managed by the extension.

Define a new public type

 > typedef union **Tcl\_ObjIntRep** \{...\} **Tcl\_ObjIntRep**

where the contents are exactly the existing contents of the union
in the _internalRep_ field of the **Tcl\_Obj** struct.  This definition
permits us to pass internal representations and pointers to them as
arguments and results in public routines.

Add to Tcl's stub table of public C routines a new routine 

 > void **Tcl\_StoreIntRep**\(Tcl\_Obj\* _objPtr_, const Tcl\_ObjType\* _typePtr_, const Tcl\_ObjIntRep\* _irPtr_\)

which stores in _objPtr_ a copy of the internal representation pointed
to by _irPtr_ and sets its type to _typePtr_.  When _irPtr_ is NULL,
this leaves _objPtr_ without a representation for type _typePtr_.

Add to Tcl's stub table of public C routines a new routine 

 > Tcl\_ObjIntRep\* **Tcl\_FetchIntRep**\(Tcl\_Obj\* _objPtr_, const Tcl\_ObjType\* _typePtr_\)

which returns a pointer to the internal representation stored
in _objPtr_ that matches the requested type _typePtr_.  If no such
internal representation is in _objPtr_, return NULL.

# Compatibility

These are new routines, so they have no compatibility concerns in the sense of cause trouble for existing working code.


They do help set up an improved compatibility scenario for the future however.  Extensions that use these new routines to stop directly referring to the fields of the **Tcl\_Obj** and **Tcl\_ObjType** structs are prepared to support a source-compatible migration to a Tcl 9 that might then be free to make revisions to those structs.





# Implementation

Taking shape on the tip-445 branch.

# Rejected Alternatives









# Copyright

This document has been placed in the public domain.








|








|







|







|
>

|
>
>
>
>



|


>
>
>
>
>
>
>
>





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
wants to act on _objPtr_ differently depending on whether or
not it is a _pure_ value.  Typically this only makes sense in
an extension if it is already known that _objPtr_ possesses
an internal type that is managed by the extension.

Define a new public type

 > typedef union **Tcl\_ObjInternalRep** \{...\} **Tcl\_ObjInternalRep**

where the contents are exactly the existing contents of the union
in the _internalRep_ field of the **Tcl\_Obj** struct.  This definition
permits us to pass internal representations and pointers to them as
arguments and results in public routines.

Add to Tcl's stub table of public C routines a new routine 

 > void **Tcl\_StoreInternalRep**\(Tcl\_Obj\* _objPtr_, const Tcl\_ObjType\* _typePtr_, const Tcl\_ObjInternalRep\* _irPtr_\)

which stores in _objPtr_ a copy of the internal representation pointed
to by _irPtr_ and sets its type to _typePtr_.  When _irPtr_ is NULL,
this leaves _objPtr_ without a representation for type _typePtr_.

Add to Tcl's stub table of public C routines a new routine 

 > Tcl\_ObjInternalRep\* **Tcl\_FetchInternalRep**\(Tcl\_Obj\* _objPtr_, const Tcl\_ObjType\* _typePtr_\)

which returns a pointer to the internal representation stored
in _objPtr_ that matches the requested type _typePtr_.  If no such
internal representation is in _objPtr_, return NULL.

# Compatibility

These are new routines, so they have no compatibility concerns in
the sense of cause trouble for existing working code.

They do help set up an improved compatibility scenario for the future
however.  Extensions that use these new routines to stop directly
referring to the fields of the **Tcl\_Obj** and **Tcl\_ObjType** structs
are prepared to support a source-compatible migration to a Tcl 9 that
might then be free to make revisions to those structs.

# Implementation

See the tip-445 branch.

# Rejected Alternatives

At the time of its approval vote, this TIP proposed routines and a type 
with the names **Tcl\_FreeIntRep**, **Tcl\_ObjIntRep**, **Tcl\_StoreIntRep**,
and **Tcl\_FetchIntRep**.  Post-vote discussion on the TCLCORE mailing list
raised the criticisms that **IntRep** was easily confused and typoed with
the common **Tcl\_Interp** variable name *interp*, and could also falsely
suggest some relationship to integer types in the minds of many programmers.
All names were changed to replace **IntRep** with **InternalRep**.

# Copyright

This document has been placed in the public domain.

Changes to tip/448.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 448: Update Tcl_SetNotifier to Reinitialize Event Loop
	Author:		Jeff Rogers <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	8.7
	Vote:		Pending
	Created:	24-May-2016
	Post-History:
	Keywords: Tcl, C API
	Implementation-URL: http://fossil.etoyoc.com/sandbox/tcllib/artifact/b2b272a285811272
-----





|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 448: Update Tcl_SetNotifier to Reinitialize Event Loop
	Author:		Jeff Rogers <[email protected]>
	State:		Draft
	Type:		Project
	Tcl-Version:	9.1
	Vote:		Pending
	Created:	24-May-2016
	Post-History:
	Keywords: Tcl, C API
	Implementation-URL: http://fossil.etoyoc.com/sandbox/tcllib/artifact/b2b272a285811272
-----

Changes to tip/450.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 450: Add [binary] subcommand "set" for in-place modification
	Author:         Arjen Markus <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        18-Jul-2016
	Post-History: 
	Tcl-Version:    8.7
	Keywords:       Tcl, binary data
	Tcl-Branch:     tip-450
-----

# Abstract

This TIP proposes a simpler extension of the **binary** command than the related








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 450: Add [binary] subcommand "set" for in-place modification
	Author:         Arjen Markus <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        18-Jul-2016
	Post-History: 
	Tcl-Version:    9.1
	Keywords:       Tcl, binary data
	Tcl-Branch:     tip-450
-----

# Abstract

This TIP proposes a simpler extension of the **binary** command than the related

Changes to tip/451.md.

1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
# TIP 451: Modify [update] to Give Full Script Access to Tcl_DoOneEvent
	Author:         Colin McCormack <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        10-Aug-2016
	Post-History:   
	Keywords:       Tcl,event loop
	Tcl-Version:    8.7

	Tcl-Branch:     updateextended
-----

# Abstract

This TIP add flags to **update** to represent all the flag values available
to the underlying API, _Tcl\_DoOneEvent\(\)_, exposing them to script access.









>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 451: Modify [update] to Give Full Script Access to Tcl_DoOneEvent
	Author:         Colin McCormack <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        10-Aug-2016
	Post-History:   
	Keywords:       Tcl,event loop
	Tcl-Version:    8.7
	Obsoleted-By:	455
	Tcl-Branch:     updateextended
-----

# Abstract

This TIP add flags to **update** to represent all the flag values available
to the underlying API, _Tcl\_DoOneEvent\(\)_, exposing them to script access.

Changes to tip/452.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 452: Add "stubs" Package to or Along Side of TclTest
	Author:         Gerald Lester <[email protected]>
	Author:         Gerald W. Lester <[email protected]>
	Author:         Gerald W. Lester <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        10-Aug-2016
	Post-History:   
	Tcl-Version:    8.7
	Vote-Results:   2/4/3 rejection in favour of further work
	Votes-For:      KBK, JD
	Votes-Against:  DKF, JN, DGP, AK
	Votes-Present:  BG, FV, SL
	Tcl-Branch:     tip-452
-----










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 452: Add "stubs" Package to or Along Side of TclTest
	Author:         Gerald Lester <[email protected]>
	Author:         Gerald W. Lester <[email protected]>
	Author:         Gerald W. Lester <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        10-Aug-2016
	Post-History:   
	Tcl-Version:    9.1
	Vote-Results:   2/4/3 rejection in favour of further work
	Votes-For:      KBK, JD
	Votes-Against:  DKF, JN, DGP, AK
	Votes-Present:  BG, FV, SL
	Tcl-Branch:     tip-452
-----

Changes to tip/453.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 453: Tcl Based Automation for tcl/pkgs
	Author:         Sean Woods <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Sep-2016
	Post-History:   
	Keywords:       Build tooling
	Tcl-Version:    8.7
	Implementation-URL: https://core.tcl-lang.org/tclconfig/timeline?r=practcl
-----

# Abstract

This TIP proposes replacing the **make package** process currently employed
by the core with a Tcl-based build automation tool.








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 453: Tcl Based Automation for tcl/pkgs
	Author:         Sean Woods <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Sep-2016
	Post-History:   
	Keywords:       Build tooling
	Tcl-Version:    9.1
	Implementation-URL: https://core.tcl-lang.org/tclconfig/timeline?r=practcl
-----

# Abstract

This TIP proposes replacing the **make package** process currently employed
by the core with a Tcl-based build automation tool.

Changes to tip/455.md.

1
2
3
4
5
6
7
8

9



10
11
12
13
14
15
16
# TIP 455: Extensions to [vwait]: Variable Sets and Scripted Access to Tcl_DoOneEvent
	Author:	Christian Werner <[email protected]>
	State:	Draft
	Type:	Project
	Tcl-Version:	8.7
	Vote:	Pending
	Created:	07-Oct-2016
	Keywords:	Tcl, event loop

	Post-History: 



-----

# Abstract

This TIP generalizes the **vwait** command to allow waiting on zero, one, or
more variable changes, on zero or more file events, to time-limit the wait,
and to control on which kinds of events is to be waited by partially exposing


|


|


>
|
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# TIP 455: Extensions to [vwait]: Variable Sets and Scripted Access to Tcl_DoOneEvent
	Author:	Christian Werner <[email protected]>
	State:	Final
	Type:	Project
	Tcl-Version:	8.7
	Vote:	Done
	Created:	07-Oct-2016
	Keywords:	Tcl, event loop
	Tcl-Branch:     tip-455
	Vote-Summary:	Accepted 4/0/2
	Votes-For:	BG, JN, KW, SL
	Votes-Against:	none
	Votes-Present:	KBK, MC
-----

# Abstract

This TIP generalizes the **vwait** command to allow waiting on zero, one, or
more variable changes, on zero or more file events, to time-limit the wait,
and to control on which kinds of events is to be waited by partially exposing
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

 3. an optional timeout specified as milliseconds as in the **after**
    command.

Additional flags to **vwait** control which types of events are to be dealt
with in its event loop, i.e. the underlying _Tcl\_DoOneEvent\(\)_ API.

When more than one kind of active input \(both, variables and file channels\) is
involved in an instance of **vwait**, another flag controls if any one of
the inputs or all inputs must have been activated in order to terminate the
event loop. This allows for scenarios, where **vwait** can be used as a kind
of "barrier" getting broken if all required conditions are fulfilled, i.e.,
axe, saw, spade, fire accelerant, water, in order to demolish, burn down,
extinct the glow, and finally bury the trellis-work fence.

However, in contrast to the illustrious demolition job, the order of occurence
of events breaking that "barrier" is indeterminate.

If the **vwait** is constrained by a timeout, and the time limit is reached,
its event loop terminates early and **vwait** indicates that timeout by a
negative integer result. Otherwise, the return value is the remaining number
of milliseconds \(positive integer which can be zero\) of the timeout
constraint. This property combined with [[302]](302.md) allows to implement \(soft
real-time\) control loops.





# Proposal

The **vwait** command shall have the following signature:

 > **vwait** _variable-name_ - well known and implemented behaviour

 > **vwait** _options_ ?_variable-names_? - all available enhanced
    features; more than one variable name may be given, in which case the wait
    will terminate when any of the variables are written to \(unless the
    **-all** option below is given\)

where _options_ are:

  **--**:                              indicates end of options

  **-all**:                            all \(except timeout\) conditions must be met



  **-nofileevents**:                   don't consider file events

  **-noidleevents**:                   don't consider idle events

  **-notimerevents**:                  don't consider timer events

  **-nowindowevents**:                 don't consider window system events

  **-readable** _<chan>_:                _<chan>_ becomes readable

  **-timeout** _<ms>_: timeout in milliseconds; return the estimated number of
    milliseconds remaining in the wait.


  **-writable** _<chan>_:                _<chan>_ becomes writable

The return value of **vwait** shall be the empty string except when the
**-timeout** option is in effect \(see above\).











Where the combination of options doesn't make sense, or even conflicts, an
appropriate error message shall be thrown, e.g., **-timeout** and
**-notimerevents** can't be specified at the same time.

If all event types except idle events are excluded, the event loop
\(_Tcl\_DoOneEvent_\) shall be constrained by **TCL\_DONT\_WAIT**.







|
|













|
|
>
>
>
>





|

|






|

|

>
>
|

|

|

|

|

|
|
>

|


|
>
>
>
>
>
>
>
>
>
>







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

 3. an optional timeout specified as milliseconds as in the **after**
    command.

Additional flags to **vwait** control which types of events are to be dealt
with in its event loop, i.e. the underlying _Tcl\_DoOneEvent\(\)_ API.

When more than one kind of active input \(both, variables and file channels\)
is involved in an instance of **vwait**, another flag controls if any one of
the inputs or all inputs must have been activated in order to terminate the
event loop. This allows for scenarios, where **vwait** can be used as a kind
of "barrier" getting broken if all required conditions are fulfilled, i.e.,
axe, saw, spade, fire accelerant, water, in order to demolish, burn down,
extinct the glow, and finally bury the trellis-work fence.

However, in contrast to the illustrious demolition job, the order of occurence
of events breaking that "barrier" is indeterminate.

If the **vwait** is constrained by a timeout, and the time limit is reached,
its event loop terminates early and **vwait** indicates that timeout by a
negative integer result. Otherwise, the return value is the remaining number
of milliseconds \(positive integer which can be zero\) of the timeout
constraint. This property combined with [[302]](302.md) allows to implement
\(soft real-time\) control loops.

An extended result list can be obtained from **vwait** by another flag
which gives detailed information on the cause of the termination of the
event loop.

# Proposal

The **vwait** command shall have the following signature:

 > **vwait** _var-name_ - well known and implemented behaviour

 > **vwait** _options_ ?_var-names_? - all available enhanced
    features; more than one variable name may be given, in which case the wait
    will terminate when any of the variables are written to \(unless the
    **-all** option below is given\)

where _options_ are:

  **--**:                   indicates end of options

  **-all**:                 all \(except timeout\) conditions must be met

  **-extended**:            result is a list (see below)

  **-nofileevents**:        don't consider file events

  **-noidleevents**:        don't consider idle events

  **-notimerevents**:       don't consider timer events

  **-nowindowevents**:      don't consider window system events

  **-readable** _channel_:  _channel_ becomes readable

  **-timeout** _ms_:        timeout in milliseconds

  **-variable** _var-name_: _var-name_ is written or unset

  **-writable** _channel_:  _channel_ becomes writable

The return value of **vwait** shall be the empty string except when the
**-timeout** and/or **-extended** options are in effect \(see above\).

The normal result format when **-timeout** is given is the number of
milliseconds remaining in the wait. Otherwise it's an empty string.

The extended result format is a list with even number of elements. Odd
elements take the values **readable**, **timeleft**, **variable**, and
**writable**, i.e. qualify the event. Even elements are the corresponding
variable and channel names or the remaining number of milliseconds.
The list is ordered by the occurrences of the event(s) with the exception
of **timeleft**, which always comes last.

Where the combination of options doesn't make sense, or even conflicts, an
appropriate error message shall be thrown, e.g., **-timeout** and
**-notimerevents** can't be specified at the same time.

If all event types except idle events are excluded, the event loop
\(_Tcl\_DoOneEvent_\) shall be constrained by **TCL\_DONT\_WAIT**.

Changes to tip/457.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 457: Add Support for Named Arguments
	Author:         Mathieu Lafon <[email protected]>
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        21-Nov-2016
	Post-History:   
	Keywords:       Tcl,procedure,argument handling
	Tcl-Version:    8.7
	Tcl-Branch:     tip-457
-----

# Abstract

This TIP proposes an enhancement of the Tcl language to support named
arguments and additional features when calling a procedure.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 457: Add Support for Named Arguments
	Author:         Mathieu Lafon <[email protected]>
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        21-Nov-2016
	Post-History:   
	Keywords:       Tcl,procedure,argument handling
	Tcl-Version:    9.1
	Tcl-Branch:     tip-457
-----

# Abstract

This TIP proposes an enhancement of the Tcl language to support named
arguments and additional features when calling a procedure.

Changes to tip/460.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 460: An Alternative to Upvar
	Author:         Don Hathway <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Dec-2016
	Post-History:   
	Keywords:       Tcl,variable,link,upvar
	Tcl-Version:    9.0
	Tcl-Branch:     dah-proc-arg-upvar
-----

# Abstract

Variable linking with the _upvar_ command is not as intuitive or effecient
as it should be. This TIP proposes an alternative through automatic variable








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 460: An Alternative to Upvar
	Author:         Don Hathway <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Dec-2016
	Post-History:   
	Keywords:       Tcl,variable,link,upvar
	Tcl-Version:    9.1
	Tcl-Branch:     dah-proc-arg-upvar
-----

# Abstract

Variable linking with the _upvar_ command is not as intuitive or effecient
as it should be. This TIP proposes an alternative through automatic variable

Changes to tip/465.md.

1
2
3
4
5
6
7
8
9




10
11
12
13
14
15
16
# TIP 465: Change Rule 8 of the Dodekalogue to Cut Some Corner Cases
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        03-Mar-2017
	Post-History:   
	Tcl-Version:    8.7
	Tcl-Branch:     tip-465




-----

# Abstract

This TIP proposes to make **$**-substitution more conforming to naive
expectations and just rule out certain odd-ball uses that can safely be
assumed to not appear in serious use, but only in crafted examples "serving"


|

|


|

>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# TIP 465: Change Rule 8 of the Dodekalogue to Cut Some Corner Cases
	Author:         Andreas Leitgeb <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        03-Mar-2017
	Post-History:   
	Tcl-Version:    9.0
	Tcl-Branch:     tip-465
	Vote-Results:   4/0/0 accepted
	Votes-For:      FV, KW, JN, SL
	Votes-Against:  none
	Votes-Present:  none
-----

# Abstract

This TIP proposes to make **$**-substitution more conforming to naive
expectations and just rule out certain odd-ball uses that can safely be
assumed to not appear in serious use, but only in crafted examples "serving"
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
following assignment operator.

Without having array parses and function parses agreeing on close paren, then
it is possible that parsing as an array will see a trailing assignment
operator that would otherwise have been nested in a subexpression, or even
part of a quoted literal value.

Because of the low expected impact on real code, a target of 8.7 is considered
feasible.

# Implementation

A full implementation of this TIP is now checked in on branch _tip-465_.

# Alternatives

The following points show alternatives that would make sense, but would make







<
<
<







64
65
66
67
68
69
70



71
72
73
74
75
76
77
following assignment operator.

Without having array parses and function parses agreeing on close paren, then
it is possible that parsing as an array will see a trailing assignment
operator that would otherwise have been nested in a subexpression, or even
part of a quoted literal value.




# Implementation

A full implementation of this TIP is now checked in on branch _tip-465_.

# Alternatives

The following points show alternatives that would make sense, but would make

Changes to tip/466.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 466: Revised Implementation of the Text Widget
	Author:         François Vogel <[email protected]>
	Author:         Gregor Cramer <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        10-Mar-2017
	Post-History:   
	Keywords:       Tk,text widget
	Tcl-Version:    8.7
	Tk-Branch:      revised_text
-----

# Abstract

This TIP proposes the replacement of the current implementation of the text
widget \(the "legacy" text widget\) by a revised implementation offering a large









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 466: Revised Implementation of the Text Widget
	Author:         François Vogel <[email protected]>
	Author:         Gregor Cramer <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        10-Mar-2017
	Post-History:   
	Keywords:       Tk,text widget
	Tcl-Version:    9.1
	Tk-Branch:      revised_text
-----

# Abstract

This TIP proposes the replacement of the current implementation of the text
widget \(the "legacy" text widget\) by a revised implementation offering a large
366
367
368
369
370
371
372








































373
374
375
376
377
378
379

 * The increase in memory usage is not very high \(but a bit high\), and despite
   this, in many cases, especially if many tags are used, and/or undo is
   enabled, the revised version is even decreasing the memory usage.

Detailed memory comparison between legacy code and revised code can be found
at <http://scidb.sourceforge.net/tk/comparison.html>









































## Known Issues in the Revised Implementation

Based on the author's website, currently only these issues are known: 

 * The code for the implementation has increased by more than 100%, and about
   70% of the old code has been changed. The revised implementation needs more







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419

 * The increase in memory usage is not very high \(but a bit high\), and despite
   this, in many cases, especially if many tags are used, and/or undo is
   enabled, the revised version is even decreasing the memory usage.

Detailed memory comparison between legacy code and revised code can be found
at <http://scidb.sourceforge.net/tk/comparison.html>

## Miscellaneous

 * No function signature pertaining to a public interface was changed. Also
   public data structures haven't been touched.

 * All recent new features brought in trunk in the legacy version have their
   counterpart in the revised version, have been improved in performance and
   have no known drawbacks. Minor incompatibilities are however identified
   here and there.

# Target Release

Given the amount of changes, also because of our usual precautions regarding
backwards compatibility, and despite the very high quality of the code and the
fact it passes \(almost all\) the previously existing test suite, it is deemed
reasonable to target Tcl/Tk 8.7 \(or 9.0\), but neither the 8.6 nor the 8.5
streams of releases, which will continue to implement the legacy text widget
code.

Support of versions back to 8.5 is currently included in the revised code, but
will be removed \(because it's useless for use in trunk only\) at the time the
new code will get merged into trunk.

# Implementation

Implementation of the revised text widget code has been placed in branch
<https://core.tcl-lang.org/tk/timeline?r=revised_text>  of the fossil repository.

This implementation compiles on Linux, Windows, and OS X. It respects the
standards of Tk \(C99 standard, and also the Tcl source code formatting
described in [[247]](247.md)\).

The man page for the text widget has been contributed by jima and is included
in the revised\_text branch.

The expected results of many tests were adjusted to take into account that the
revised implementation is better optimizing, so some trace results of display
line computation are different. Other adjustments were required because of bug
fixes.

## Known Issues in the Revised Implementation

Based on the author's website, currently only these issues are known: 

 * The code for the implementation has increased by more than 100%, and about
   70% of the old code has been changed. The revised implementation needs more
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
   need to be fixed \(by fixing the expected result in the test, or by fixing
   the text widget code\).

 * More tests should be written to exercise the new or changed features.

 * The OS X case should be more tested on a real Mac, because it's the only
   platform using context drawing.

## Miscellaneous

 * No function signature pertaining to a public interface was changed. Also
   public data structures haven't been touched.

 * All recent new features brought in trunk in the legacy version have their
   counterpart in the revised version, have been improved in performance and
   have no known drawbacks. Minor incompatibilities are however identified
   here and there.

# Target Release

Given the amount of changes, also because of our usual precautions regarding
backwards compatibility, and despite the very high quality of the code and the
fact it passes \(almost all\) the previously existing test suite, it is deemed
reasonable to target Tcl/Tk 8.7 \(or 9.0\), but neither the 8.6 nor the 8.5
streams of releases, which will continue to implement the legacy text widget
code.

Support of versions back to 8.5 is currently included in the revised code, but
will be removed \(because it's useless for use in trunk only\) at the time the
new code will get merged into trunk.

# Implementation

Implementation of the revised text widget code has been placed in branch
<https://core.tcl-lang.org/tk/timeline?r=revised_text>  of the fossil repository.

This implementation compiles on Linux, Windows, and OS X. It respects the
standards of Tk \(C99 standard, and also the Tcl source code formatting
described in [[247]](247.md)\).

The man page for the text widget has been contributed by jima and is included
in the revised\_text branch.

The expected results of many tests were adjusted to take into account that the
revised implementation is better optimizing, so some trace results of display
line computation are different. Other adjustments were required because of bug
fixes.

# Open Questions

 * tkTextUndo.c implements a specialized undo/redo, not using the legacy
   tkUndo.c. Reasons for this are stated at the top of tkTextUndo.c. It is
   interesting to note that, in the revised\_text branch, tkUndo.c is not even
   compiled anymore, except on Linux \(for no apparent reason\). This is dead







|
<
|
<
<

<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
<
<
<
|
<
<
<
<
<
<
<







457
458
459
460
461
462
463
464

465


466




467
















468
469



470







471
472
473
474
475
476
477
   need to be fixed \(by fixing the expected result in the test, or by fixing
   the text widget code\).

 * More tests should be written to exercise the new or changed features.

 * The OS X case should be more tested on a real Mac, because it's the only
   platform using context drawing.
 

## Known bugs







Two bugs, namely [[a34b49f8c6]](https://core.tcl-lang.org/tk/tktview?name=a34b49f8c6)
















and [[6a78781cc3]](https://core.tcl-lang.org/tk/tktview?name=6a78781cc3), make
the corresponding testcases fail but these are not the only known bugs. The complete



list of known bugs can be requested from the Tk bug tracker: <https://core.tcl-lang.org/tk/rptview?rn=27>








# Open Questions

 * tkTextUndo.c implements a specialized undo/redo, not using the legacy
   tkUndo.c. Reasons for this are stated at the top of tkTextUndo.c. It is
   interesting to note that, in the revised\_text branch, tkUndo.c is not even
   compiled anymore, except on Linux \(for no apparent reason\). This is dead

Changes to tip/467.md.

46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

# Specification

Proposed URL for the new repository will be <https://core.tcl-lang.org/tips>

## Backwards compatibility

 * _tip.tcl.tk/<NUM>.html_ should still show a rendered result. This could be redirected to _core.tcl-lang.org/tips/doc/trunk/tip/<NUM>.md_

 * _tip.tcl.tk_ offers several converted formats \(XML, \*roff, ...\). The fossil option will be to use the _core.tcl-lang.org/tips/file/tip/<NUM>.md?download_ URL to get the raw Markdown downloads. For getting the other options one could convert the markdown source file using something like pandoc.

 * E-mail address are not hidden in the source and in the rendered result.  If e-mail addresses need to be hidden there are two options

    1. Remove mails from source.








|







46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

# Specification

Proposed URL for the new repository will be <https://core.tcl-lang.org/tips>

## Backwards compatibility

 * _tip.tcl.tk/<NUM>.html_ should still show a rendered result. This could be redirected to _core.tcl-lang.org/tips/doc/main/tip/<NUM>.md_

 * _tip.tcl.tk_ offers several converted formats \(XML, \*roff, ...\). The fossil option will be to use the _core.tcl-lang.org/tips/file/tip/<NUM>.md?download_ URL to get the raw Markdown downloads. For getting the other options one could convert the markdown source file using something like pandoc.

 * E-mail address are not hidden in the source and in the rendered result.  If e-mail addresses need to be hidden there are two options

    1. Remove mails from source.

Changes to tip/468.md.

1
2
3
4
5
6
7
8
9
10




11
12
13
14
15
16
17
# TIP 468: Support Passing TCP listen Backlog Size Option to TCP Socket Creation
	Author:		Shannon Noe <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	03-Apr-2017
	Post-History:
	Keywords:	Tcl, socket, SOMAXCONN
	Tcl-Version:	8.7
	Tcl-Branch:		tip-468




-----

# Abstract

This TIP adds the ability to control the TCP backlog depth used by the
_listen_ system call within the **socket** Command. The API function,
**Tcl\_OpenTcpServerEx**, will be extended to allow the passing of the


|

|




|
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# TIP 468: Support Passing TCP listen Backlog Size Option to TCP Socket Creation
	Author:		Shannon Noe <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	03-Apr-2017
	Post-History:
	Keywords:	Tcl, socket, SOMAXCONN
	Tcl-Version:	8.7
	Tcl-Branch:	tip-468
        Vote-Summary:	Accepted 3/0/0
        Votes-For:	JN, KBK, KW, SL
        Votes-Against:	none
        Votes-Present:	none
-----

# Abstract

This TIP adds the ability to control the TCP backlog depth used by the
_listen_ system call within the **socket** Command. The API function,
**Tcl\_OpenTcpServerEx**, will be extended to allow the passing of the

Changes to tip/469.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 469: A Callback for Channel-Exception Conditions
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        16-Apr-2017
	Post-History:   
	Keywords:       Tcl,event handling
	Tcl-Version:    8.7
	Tcl-Branch:     tip-469
-----

# Abstract

This TIP proposes to extend the **fileevent** Tcl command to also accept the
keyword **exception** for its second argument. This will allow to register a








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 469: A Callback for Channel-Exception Conditions
	Author:         Andreas Leitgeb <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        16-Apr-2017
	Post-History:   
	Keywords:       Tcl,event handling
	Tcl-Version:    9.1
	Tcl-Branch:     tip-469
-----

# Abstract

This TIP proposes to extend the **fileevent** Tcl command to also accept the
keyword **exception** for its second argument. This will allow to register a

Changes to tip/471.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
# TIP 471: Add [info linkedname] Introspection Command
	Author:         Mathieu Lafon <[email protected]>
	State:          Draft
	Type:           Project
	Created:        05-May-2017
	Tcl-Version:    8.7
	Vote:		Done
	Post-History:
	Tcl-Branch:     info-linkedname
	Vote-Summary:   Rejected 2/2/3
	Votes-For:      DKF, JN
	Votes-Against:  KBK, DGP
	Votes-Present:  BG, FV, SL





|







1
2
3
4
5
6
7
8
9
10
11
12
13
# TIP 471: Add [info linkedname] Introspection Command
	Author:         Mathieu Lafon <[email protected]>
	State:          Draft
	Type:           Project
	Created:        05-May-2017
	Tcl-Version:    9.1
	Vote:		Done
	Post-History:
	Tcl-Branch:     info-linkedname
	Vote-Summary:   Rejected 2/2/3
	Votes-For:      DKF, JN
	Votes-Against:  KBK, DGP
	Votes-Present:  BG, FV, SL

Changes to tip/474.md.

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
buttons 4 to 7 are not accessible through script any more,
the only way to access those are through the translated
MouseWheel events. On X11, buttons 4 up to 9 in scripts
will handle the X11 buttons numbered 8 up to 13.

On macOS, the scaling for MouseWheel buttons has always
been different from those on Windows, with a factor of 120.
This means that applications assuming Tk 8.6 <MouseWheel>
events will need to be modified to the new behaviour,
otherwise the screen movements will be far too much.
On Windows, everything works as before, no incompatibility
there. Many applications already define the <MouseWheel>
binding on X11, even though in Tk 8.6 they are not
used. Such applications will work on X11 in Tk 8.7 the
same as in Tk 8.6

If the application needs to support Tcl/Tk 8.6, an extra
check is required to decide which events to listen to.
An example can be found in the "cscroll" demo.

This seems a minor inconvenience for gaining further
platform-independence.

# Reference Implementation

In tk branch tip474.

# Copyright

This document is placed in public domain.








|



|













|





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
buttons 4 to 7 are not accessible through script any more,
the only way to access those are through the translated
MouseWheel events. On X11, buttons 4 up to 9 in scripts
will handle the X11 buttons numbered 8 up to 13.

On macOS, the scaling for MouseWheel buttons has always
been different from those on Windows, with a factor of 120.
This means that applications assuming Tk 8.6 `<MouseWheel>`
events will need to be modified to the new behaviour,
otherwise the screen movements will be far too much.
On Windows, everything works as before, no incompatibility
there. Many applications already define the `<MouseWheel>`
binding on X11, even though in Tk 8.6 they are not
used. Such applications will work on X11 in Tk 8.7 the
same as in Tk 8.6

If the application needs to support Tcl/Tk 8.6, an extra
check is required to decide which events to listen to.
An example can be found in the "cscroll" demo.

This seems a minor inconvenience for gaining further
platform-independence.

# Reference Implementation

In Tk branch `tip474`.

# Copyright

This document is placed in public domain.

Changes to tip/479.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 479: Add Named Procedures as a New Command in Tcl (dictargs::proc)
	Author:         Sean Woods <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        23-Oct-2017
	Post-History:
	Keywords:       Tcl,procedure,argument handling
	Tcl-Version:    8.7
	Tcl-Branch:     tip479
-----
# Abstract

This TIP proposes an enhancement of the Tcl language to support named
parameters when defining a procedure or OO method.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 479: Add Named Procedures as a New Command in Tcl (dictargs::proc)
	Author:         Sean Woods <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        23-Oct-2017
	Post-History:
	Keywords:       Tcl,procedure,argument handling
	Tcl-Version:    9.1
	Tcl-Branch:     tip479
-----
# Abstract

This TIP proposes an enhancement of the Tcl language to support named
parameters when defining a procedure or OO method.

182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
		> {Don't be pedanditic} {a {Don't be pedantic} alpha {Less usefull}}

### type:
Type: string
Default: null
Options: null, boolean, integer, wide, entier, double

To support [tip#480](https://core.tcl-lang.org/tips/doc/trunk/tip/480.md). For now strictly advisory.
In the future this will check that the incoming values are the specified type.

# Implementation

This TIP will be rolled out in 3 stages.

## Stage 1 - Pure Tcl (finished)







|







182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
		> {Don't be pedanditic} {a {Don't be pedantic} alpha {Less usefull}}

### type:
Type: string
Default: null
Options: null, boolean, integer, wide, entier, double

To support [tip#480](https://core.tcl-lang.org/tips/doc/main/tip/480.md). For now strictly advisory.
In the future this will check that the incoming values are the specified type.

# Implementation

This TIP will be rolled out in 3 stages.

## Stage 1 - Pure Tcl (finished)

Changes to tip/480.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 480: Type and Alias Assertions for Tcl
	Author:		Kevin B. Kenny <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	25-Oct-2017
	Tcl-Version:	8.7
	Keywords:	assertion, pragma, type, alias, compilation
	Post-History:
	Tcl-Branch:	tip-480
------

# Abstract







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 480: Type and Alias Assertions for Tcl
	Author:		Kevin B. Kenny <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	25-Oct-2017
	Tcl-Version:	9.1
	Keywords:	assertion, pragma, type, alias, compilation
	Post-History:
	Tcl-Branch:	tip-480
------

# Abstract

Changes to tip/481.md.

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
# TIP 481: `Tcl_GetStringFromObj()` with `size_t` length parameter
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        27-Oct-2017
	Post-History:
	Keywords:       Tcl
	Tcl-Version:    8.7
	Tcl-Branch:     tip-481




-----
# Abstract

This TIP proposes enhancing various C API functions which having a `int *` parameter,
to be used with a `size_t *` parameter as well. In addition, a new `Tcl_GetValue()`
function is proposed which can retrieve a signed or unsigned (wide) integer or a
float/double/long double from a `Tcl_Obj`, .

# Rationale

In Tcl 9, the range of various functions need to be increased. For example
`Tcl_GetStringFromObj` now is limited to returning 32 bit for the maximum
string length. This can be fixed by introducing an internal function
`Tcl_GetStringFromObj2()` which has a `size_t *` parameter in stead of `int *`.
On top of that, `Tcl_GetStringFromObj` is provided as a macro, which switches
between the two possible functions depending on the size of the parameter.

The same is done for `Tcl_GetUnicodeFromObj` and `Tcl_GetByteArrayFromObj`.

This way, we have a compatibility layer, easing the transition to Tcl 9.
In Tcl 8.7, although the parameter has type size\_t, the actual length range
that can be returned is actually -1 up to 4294967294. In Tcl 9, the full
size\_t range is available.






# Specification

Add to Tcl's stub table of public C routines the following new routines

 > int **Tcl\_GetStringFromObj2**\(Tcl\_Obj \*_objPtr_, size\_t \*_lengthPtr_\)

 > int **Tcl\_GetUnicodeFromObj2**\(Tcl\_Obj \*_objPtr_, size\_t \*_lengthPtr_\)

 > int **Tcl\_GetByteArrayFromObj2**\(Tcl\_Obj \*_objPtr_, size\_t \*_lengthPtr_\)

Those 3 functions do exactly the same as their existing counterparts, only the _lengthPtr_
parameter is of type size\_t in stead of int. The original 3 functions will be wrapped in
a macro of the same name, so depending on the actual size of the variable where _lengthPtr_
points to, the switch between the two function versions are done automatically. So, the
new functions don't need to be used in code, the original function can be used pointing to
a size_t length variable as well.

 > int **Tcl\_GetValue**\(Tcl\_Interp \*interp, Tcl\_Obj \*_objPtr_, void \*_valuePtr_, int _flags_\)

This functions is able to function the same as Tcl\_GetIntFromObj, Tcl\_GetLongFromObj,
Tcl\_GetWideFromObj and Tcl\_GetDoubleFromObj. The flags argument determines the actual
conversion done. The following flags are possible.

 > **TCL\_TYPE\_I**(int \| long \| Tcl_WideInt) :  valuePtr points at an integer of given size
 
 > **TCL\_TYPE\_U**(int \| long \| Tcl_WideInt) :  valuePtr points at an unsigned integer of given size
 
 > **TCL\_TYPE\_D**(float \| double) : valuePtr points at a float or double

Those 3 macro's use the sizeof() macro on the type to provide the requested size to Tcl\_GetValue(). Actually,
you can use any integer type, so e.g. size\_t or intmax\_t work as well.
  
 > int **Tcl\_GetUIntFromObj**\(Tcl\_Interp \*interp, Tcl\_Obj \*_objPtr_, void \*_valuePtr_\)

This is a wrapper macro around **Tcl\_GetValue**, handling unsigned integer values only.

For Tcl 9.0, the function **Tcl\_GetIntFromObj** is modified to return 1 when the Tcl\_Obj
value is in the range -2147483648 .. 2147483647.

# Implementation

See the _tip-481_ branch in Tcl's fossil repository
<https://core.tcl-lang.org/tcl/timeline?r=tip-481> .
|

|

|





>
>
>
>




|
<
<




|
|
|
|


|


|
|
|
>
>
>
>
>



|

|

|

|


|

|
<
<
|
<
|
<
<
<

<
|
<
|
<
|
<
<
|
<
|
<
<
<
<





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
# TIP 481: `Tcl_GetStringFromObj()` with `ptrdiff_t` length parameter
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        27-Oct-2017
	Post-History:
	Keywords:       Tcl
	Tcl-Version:    8.7
	Tcl-Branch:     tip-481
	Vote-Summary:	Accepted 4/0/2
	Votes-For:	JN, KW, KK, MC
	Votes-Against:	none
	Votes-Present:	FV, SL
-----
# Abstract

This TIP proposes enhancing various C API functions which having a `int *` parameter,
to be used with a `ptrdiff_t *` parameter as well.



# Rationale

In Tcl 9, the range of various functions need to be increased. For example
`Tcl_GetStringFromObj()` is currently limited to returning 31 bit for the
maximum string length. This can be fixed by introducing a new internal
function which has a `ptrdiff_t *` parameter in stead of `int *`.
On top of that, `Tcl_GetStringFromObj()` is provided as a macro, which switches
between the two possible functions depending on the size of the parameter.

The same is done for `Tcl_GetUnicodeFromObj()` and `Tcl_GetByteArrayFromObj()`.

This way, we have a compatibility layer, easing the transition to Tcl 9.
In Tcl 8.7, although the parameter has type ptrdiff\_t, the length range
that can be returned is actually only 0 up to 4294967294. In Tcl 9, the full
ptrdiff\_t range is available.

Commits like [this one](https://core.tcl-lang.org/tk/info/1597671a5e01ad99) (in Tk)
will no longer be needed; the function `TkGetStringFromObj()` will just become
obsolete: `Tcl_GetStringFromObj()` will be useable no matter the string length
being stored in an `int` or a ptrdiff_t' variable.

# Specification

Add to Tcl's stub table of public C routines the following new (internal) routines

 > int **TclGetStringFromObj**\(Tcl\_Obj \*_objPtr_, ptrdiff\_t \*_lengthPtr_\)

 > int **TclGetUnicodeFromObj**\(Tcl\_Obj \*_objPtr_, ptrdiff\_t \*_lengthPtr_\)

 > int **TclGetByteArrayFromObj**\(Tcl\_Obj \*_objPtr_, ptrdiff\_t \*_lengthPtr_\)

Those 3 functions do exactly the same as their existing counterparts, only the _lengthPtr_
parameter is of type `ptrdiff_t` in stead of `int`. The original 3 functions will be wrapped in
a macro of the same name, so depending on the actual size of the variable where _lengthPtr_
points to, the switch between the two function versions are done automatically. Therefore, the


new functions are not supposed to be used directly in code, usage is fully transparent

through the Tcl\_GetStringFromObj/Tcl\_GetUnicodeFromObj/Tcl\_GetByteArrayFromObj macros.





# Addendum



After [TIP #660](660.md) was accepted, a lot of functions changed from


using size\_t to ptrdiff\_t parameters. In order to prevent confusion,

this change has been adapted in the TIP text above as well.





# Implementation

See the _tip-481_ branch in Tcl's fossil repository
<https://core.tcl-lang.org/tcl/timeline?r=tip-481> .

Changes to tip/494.md.

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
# TIP 494: More use of size_t in Tcl 9
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        29-Dec-2017
	Post-History:
	Keywords:       tcl
	Tcl-Version:    9.0
	Tcl-Branch:     memory-API




-----

# Abstract

This TIP describes the non-controversial part of the Tcl 9 changes: Make Tcl 9 ready for the 64-bit era.

# Rationale

Many Tcl API functions and struct fields have _int_ parameters, which don't provide sufficient room on 64-bit platforms.

# Proposal

  * Enhance the hash functions, such that the hash value is stored in a size\_t in stead of unsigned int. This allows hash tables to grow beyond 4Gb on 64-bit platforms

  * Enhance all struct fields representing refCounts or epochs, make them of type size_t

  * All memory-related functions, such as Tcl\_Alloc\(\), will change its size argument from _int_ to _size\_t_, and its "char *" arguments to "void *"
  
  * Many functions, which have size parameters of type _int_ (but NOT _int *_) will change to type _size\_t_

  * All _ClientData_ type arguments will be changed to _void *_ arguments. This is actually the same type, but it prevents the need for type-casts in some situations.

  * Provide a compilation option -D_TCL\_8\_COMPAT_, which provides fully source compatibility. Using this option, extensions compile and run fine using either Tcl 8 or Tcl 9 headers.
    More explanation below.

  * Provide 2 new macro's TCL\_IO\_FAILURE and TCL\_AUTO\_LENGTH, both equal to ((size_t)-1). They can help making extensions use the full 64-bit range with Tcl 9, which still compile with Tcl 8 as well (see below). 
    Tcl 8.7 will get those macro's too, but the value there is (-1)

  * The functions Tcl\_Alloc(), Tcl\_Free() (and friends) change to redirect to their debugging variants if the TCL\_MEM\_DEBUG is defined. So, Tcl\_Alloc() becomes the same as ckalloc(), ending the general confusion regarding the difference between those two groups of functions: Starting with Tcl 9.0 there is no difference anymore.
    ckalloc() and friends are deprecated starting with 9.0, but there are no plans to actually remove those and no deprecation warning will be given if extensions use it.


On 32-bit platforms, this is all 100% upwards binary compatible, provided no _internal_ API is used (since some internal structs might have incompatible but externally invisible changes)

On 64-bit platforms, those changes cause binary incompatibility. Therefore the TCL\_STUB\_MAGIC value needs to change, so extensions compiled using Tcl 9 headers will not load in Tcl 8 and reverse.


# Implications

Although those changes are binary compatible on 32-bit platforms, there is a small potential source incompatibility.
There are 10 functions which previously had an _int_ return argument, which is changed to _size\_t_ (for now, see below).
This signed/unsigned change might lead to subtle difference in behavior.

The 10 functions are:

  * Tcl_Gets

  * Tcl_GetsObj

  * Tcl_Read

  * Tcl_ReadChars

  * Tcl_ReadRaw

  * Tcl_Write

  * Tcl_WriteChars

  * Tcl_WriteObj

  * Tcl_WriteRaw

  * Tcl_Ungets

If the return value of such function is directly used in a compare, this could lead to the use of an unsigned compare in stead of a signed compare.
If you compile your extension with -D_TCL\_8\_COMPAT_, those 10 functions will be changed to wrapper macro's which makes everything behave as if those functions return Tcl_WideInt. That's the easiest way to resolve this potential problem.

There are 2 other ways to make this change, which can do it without the use of the _TCL\_8\_COMPAT_ macro:

  * Add _1_ to the left and right hand side of the comparison. E.g. [as here](https://core.tcl-lang.org/tk/fdiff?v1=100235897e9cf359&v2=9cf86629040df0d3)

  * Don't compare to -1 using < or >, but always to TCL\_IO\_FAILURE using == or != . E.g. [as here](https://core.tcl-lang.org/tk/info/abe0d3b121cbb12d)

Tk and [sqlite](http://cyqlite.sourceforge.net/cgi-bin/sqlite/info/17c148b94008df81) are already converted to make full use of TIP #494. Other extensions included with Tcl (e.g. tdbc) are unaffected.

# Open issues

There has been discussion, whether the return-type of these 10 functions (and possibly other functions) should actually be size\_t or maybe some other type.
A Tcl-specific type *Tcl\_Size* could also be defined for this. Actually, this TIP provides 2 possibilities: Without -D_TCL\_8\_COMPAT_, the type is size\_t, with -D_TCL\_8\_COMPAT_ it is Tcl_WideInt.

This gives enough room for experimenting which one is best, maybe it would be better to make it ssize\_t or ptrdiff\_t.

There - for sure - will be more future TIP's, which propose more API changes for 9.0.
This one - definitely - is not the last one.
So, this TIP doesn't make a final decision yet what will be the final type returned by those 10 functions.

# Implementation

The implementation of this TIP can be found in the [memory-API branch]
(https://core.tcl-lang.org/tcl/timeline?r=memory-API).

# Copyright
|









>
>
>
>








|



<
|
<

<
|
<

<
|
<
<
|
<
<
|
<
<

|
<

<
|
|
<
<
<
<
<
<
<
<
<
<
<

|
|
<
|
<
|
<
|
<
|
<
|
<

<

<
<
|
<

<
|
<

<

|

<
<
>
|
|
<
|
<







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
# TIP 494: More use of size_t/ptrdiff_t in Tcl 9
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        29-Dec-2017
	Post-History:
	Keywords:       tcl
	Tcl-Version:    9.0
	Tcl-Branch:     memory-API
	Vote-Results:   3/0/2 accepted
	Votes-For:      DKF, JN, KBK
	Votes-Against:  none
	Votes-Present:  JD, SL
-----

# Abstract

This TIP describes the non-controversial part of the Tcl 9 changes: Make Tcl 9 ready for the 64-bit era.

# Rationale

`int` is the type of many Tcl API function arguments and return values, and also of many struct fields, but it doesn't provide sufficient room on 64-bit platforms.

# Proposal


  * For hash functions, replace `unsigned int` with `size_t` as the type of the hash value, which allows hash tables to grow beyond 4Gb on 64-bit platforms.



  * Make `size_t` the type of all struct fields representing reference counts or epochs.



  * Change the type of the `size` parameter of each memory-related function, e.g. `Tcl_Alloc()`, from `int` to `size_t` and change the `char *` argument to `void *`.


  


  * Change the type of the `size` parameter of many functions from `int` (but NOT `int *`) to `Tcl_Size`.



  * Change the type of all `ClientData` arguments `void *`.  This is actually the same type, but it prevents the need for type casts in some situations.



  * Provide two new macros, `TCL_IO_FAILURE` and `TCL_AUTO_LENGTH`, each defined as `((Tcl_Size)-1)`, to help extensions use the full 64-bit range with Tcl 9, but still compile with Tcl 8 as well (see below). 
    Provide those macros in Tcl 8.7 too, but defined as `(-1)`.












  * Modify `Tcl_Alloc()`, `Tcl_Free()`, and related functions to redirect to
	their debugging variants if `TCL_MEM_DEBUG` is defined: `Tcl_Alloc()`

	becomes the same as `ckalloc()`, ending the general confusion regarding the

	difference between those two groups of functions: Starting with Tcl 9.0

	there no longer any difference.  `ckalloc()` and related functions are

	deprecated starting with 9.0, but there are no plans to remove them, and no

	deprecation warning will be given if extensions use them.






On 32-bit platforms this is all 100% upwards binary compatible provided no _internal_ API is used, since some internal structs might have incompatible but externally invisible changes.



On 64-bit platforms, those changes cause binary incompatibility. Therefore the `TCL_STUB_MAGIC` value needs to change, so extensions compiled using Tcl 9 headers will not load in Tcl 8 and reverse.




# Addendum



After [TIP #660](660.md) was accepted, a lot of functions changed from
using size\_t to ptrdiff\_t parameters. In order to prevent confusion,
this change has been adapted in the TIP text above as well. Also

`-DTCL_8_COMPAT` is not provided any more, because it is no longer needed.


# Implementation

The implementation of this TIP can be found in the [memory-API branch]
(https://core.tcl-lang.org/tcl/timeline?r=memory-API).

# Copyright

Changes to tip/495.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 495: Tcl Based Build System for TEA projects
	Author:         Sean Woods <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        14-Jan-2018
	Post-History:
	Keywords:       Tcl,build system,extension building
	Tcl-Version:    8.7
-----
# Abstract
This tip proposes that we switch extension development away from implementing automation
in autoconf and nmake and towards using Tcl.

# Rationale









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 495: Tcl Based Build System for TEA projects
	Author:         Sean Woods <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        14-Jan-2018
	Post-History:
	Keywords:       Tcl,build system,extension building
	Tcl-Version:    9.1
-----
# Abstract
This tip proposes that we switch extension development away from implementing automation
in autoconf and nmake and towards using Tcl.

# Rationale

Changes to tip/498.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 498: Simplify Tcl_DeleteNamespace
	Author:         Nathan Coulter <tcl[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        18-Jan-2016
	Post-History:
	Keywords:       tcl
	Tcl-Version:    8.7
	Tcl-Branch:     bug-e593adf103-core-8
-----


# Abstract

Simplify the implementation of `Tcl_DeleteNamespace` in order to make behaviour

|






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 498: Simplify Tcl_DeleteNamespace
	Author:         Nathan Coulter <org.tcl-lang.[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        18-Jan-2016
	Post-History:
	Keywords:       tcl
	Tcl-Version:    9.1
	Tcl-Branch:     bug-e593adf103-core-8
-----


# Abstract

Simplify the implementation of `Tcl_DeleteNamespace` in order to make behaviour

Changes to tip/502.md.

1
2
3
4
5
6
7
8
9




10
11
12
13
14
15
16
# TIP 502: Index Value Reform
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        26-Feb-2018
	Post-History:   
	Tcl-Version:	8.7
	Tcl-Branch:     tip-502




-----

# Abstract

Proposes reformed handling of Tcl index values.

# Background









>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# TIP 502: Index Value Reform
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        26-Feb-2018
	Post-History:   
	Tcl-Version:	8.7
	Tcl-Branch:     tip-502
	Vote-Results:   5/0/0 accepted
	Votes-For:      DKF, JN, JD, KBK, SL
	Votes-Against:  none
	Votes-Present:  none
-----

# Abstract

Proposes reformed handling of Tcl index values.

# Background

Changes to tip/510.md.

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
# TIP 510: Add Rbc and Tkpath widgets to Tk
	Author:         René Zaumseil <[email protected]>
	State:          Deferred
	Type:           Project
	Vote:           Done
	Created:        5-Jun-2018
	Post-History:   
	Keywords:       Tk
	Tcl-Version:    8.7
	Tk-Branch:      tip-510
	Vote-Summary:   Rejected 1/3/1
	Votes-For:      DKF
	Votes-Against:  KBK, JN, FV
	Votes-Present:  BG
	Vote-Comments:  code not yet ready, needs porting to macOS; alternate
	                might be to just co-distribute, just as TDBC is with Tcl
-----

**This tip depends on tip556. It is deferred until tip556 is accepted.**

# Abstract

[Rbc][] aka "Refactored [BLT][] Components" have graph widgets and Tk commands which are missing in *Tk*.

[Tkpath][] is a 2D-canvas like widget modelled after [SVG][].









|









|







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
# TIP 510: Add Rbc and Tkpath widgets to Tk
	Author:         René Zaumseil <[email protected]>
	State:          Deferred
	Type:           Project
	Vote:           Done
	Created:        5-Jun-2018
	Post-History:   
	Keywords:       Tk
	Tcl-Version:    9.0
	Tk-Branch:      tip-510
	Vote-Summary:   Rejected 1/3/1
	Votes-For:      DKF
	Votes-Against:  KBK, JN, FV
	Votes-Present:  BG
	Vote-Comments:  code not yet ready, needs porting to macOS; alternate
	                might be to just co-distribute, just as TDBC is with Tcl
-----

**This tip depends on [TIP #556](556.md). It is deferred until TIP #556 is accepted.**

# Abstract

[Rbc][] aka "Refactored [BLT][] Components" have graph widgets and Tk commands which are missing in *Tk*.

[Tkpath][] is a 2D-canvas like widget modelled after [SVG][].

Changes to tip/511.md.

1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
17
18
19
20
21
# TIP 511: Implement Tcl_AsyncMarkFromSignal()
	Author:         Christian Werner <[email protected]>
	State:          Accepted
	Type:           Project
	Vote:           Done
	Created:        14-June-2018
	Post-History:   
	Keywords:       Tcl,threads
	Tcl-Version:	8.7

	Vote-Results:   4/0/5 accepted
	Votes-For:      DKF, BG, KBK, JN, JD, SL
	Votes-Against:  none
	Votes-Present:  DGP, FV, AK
	Implementation-URL: https://www.androwish.org/index.html/info/40790af1e8e4ec9f
-----

# Abstract

This TIP proposes to add a Tcl API for marking `Tcl_AsyncHandlers` ready for
processing from POSIX signal contexts.



|






>




<







1
2
3
4
5
6
7
8
9
10
11
12
13
14

15
16
17
18
19
20
21
# TIP 511: Implement Tcl_AsyncMarkFromSignal()
	Author:         Christian Werner <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        14-June-2018
	Post-History:   
	Keywords:       Tcl,threads
	Tcl-Version:	8.7
	Tcl-Branch:     tip-511
	Vote-Results:   4/0/5 accepted
	Votes-For:      DKF, BG, KBK, JN, JD, SL
	Votes-Against:  none
	Votes-Present:  DGP, FV, AK

-----

# Abstract

This TIP proposes to add a Tcl API for marking `Tcl_AsyncHandlers` ready for
processing from POSIX signal contexts.

Changes to tip/513.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 513: Better support for 'agendas' as arrays, dictionaries or lists
	Author:         Florian Murr <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        02-Aug-2017
	Post-History:   
	Keywords:       Tcl,data structure
	Tcl-Version:	8.7
	Implementation-URL: https://core.tcl-lang.org/tips/doc/trunk/attach/513/agendas.tcl
-----

# Abstract

This proposes new commands for Tcl to support efficient dynamically-changing
data structures.









|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 513: Better support for 'agendas' as arrays, dictionaries or lists
	Author:         Florian Murr <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        02-Aug-2017
	Post-History:   
	Keywords:       Tcl,data structure
	Tcl-Version:	9.1
	Implementation-URL: https://core.tcl-lang.org/tips/doc/main/attach/513/agendas.tcl
-----

# Abstract

This proposes new commands for Tcl to support efficient dynamically-changing
data structures.

Changes to tip/514.md.

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
# TIP 514: Platform differences in handling int/wide
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        20-Aug-2018
	Post-History:   
	Keywords:       Tcl
	Tcl-Version:	8.7
	Tcl-Branch:     tip-514




-----

# Abstract

This TIP proposes to resolve the platform differences between int/wide/entier math functions and commands like "sting is integer"/"string is wide"/"string is entier".
At the script level it should not be relevant whether the platform is 32-bit or 64-bit any more.

Most Tcl commands already accept unlimited integers, so there is hardly any command left which need to checked for correct range.

# Rationale

Some examples:

<pre>
% string is int -4294967296
0
% string is int -4294967295
1
% string is int 4294967295
1
% string is int 4294967296
0
</pre>

So, valid integers appear to range from -(2^32-1) to +2^32-1.  Most people learn in school that 32-bit integers range from -2^31 to 2^31-1. Are Tcl's integers 33-bit, but then excluding -4294967296?

<pre>
% string is wide -18446744073709551616
0
% string is wide -18446744073709551615
1
% string is wide 18446744073709551615
1
% string is wide 18446744073709551616
0
</pre>

So, valid wide integers appear to range from -(2^64-1) to +2^64-1.  Most people learn in school that 64-bit integers range from -2^63 to 2^63-1. Are Tcl's wide integers 65-bit, but then excluding -18446744073709551616?


<pre>
% expr int(2147483648)          ; #on LP64/ILP64 platforms
2147483648
% expr int(2147483648)          ; #on other platforms
-2147483648










>
>
>
>




|


|
















|












|







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
# TIP 514: Platform differences in handling int/wide
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        20-Aug-2018
	Post-History:   
	Keywords:       Tcl
	Tcl-Version:	8.7
	Tcl-Branch:     tip-514
	Vote-Results:   3/0/2 accepted
	Votes-For:      DKF, JN, KBK
	Votes-Against:  none
	Votes-Present:  JD, SL
-----

# Abstract

This TIP proposes to resolve the platform differences between int/wide/entier math functions and commands like "string is integer"/"string is wide"/"string is entier".
At the script level it should not be relevant whether the platform is 32-bit or 64-bit any more.

Most Tcl commands already accept unlimited integers, so there is hardly any command left which need to be checked for correct range.

# Rationale

Some examples:

<pre>
% string is int -4294967296
0
% string is int -4294967295
1
% string is int 4294967295
1
% string is int 4294967296
0
</pre>

So valid integers appear to range from -(2^32-1) to +2^32-1.  Most people learn in school that 32-bit integers range from -2^31 to 2^31-1. Are Tcl's integers 33-bit, but then excluding -4294967296?

<pre>
% string is wide -18446744073709551616
0
% string is wide -18446744073709551615
1
% string is wide 18446744073709551615
1
% string is wide 18446744073709551616
0
</pre>

So valid wide integers appear to range from -(2^64-1) to +2^64-1.  Most people learn in school that 64-bit integers range from -2^63 to 2^63-1. Are Tcl's wide integers 65-bit, but then excluding -18446744073709551616?


<pre>
% expr int(2147483648)          ; #on LP64/ILP64 platforms
2147483648
% expr int(2147483648)          ; #on other platforms
-2147483648
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
   So, it succeeds if the number fits in a Tcl\_WideInt.

 * The C function Tcl\_GetLongFromObj() is changed to behave like Tcl\_GetIntFromObj() if sizeof(long) == sizeof(int), and to behave like Tcl\_GetWideIntFromObj() if sizeof(long) == sizeof(Tcl_WideInt)

# Implications

 * "string is integer" can no longer be used to check for a specific range.
   That doesn't matter any more, because the command argument that was being protected, doesn't throw an exception any more in case of under/overflow since the introduction of bignums.

 * int() can no longer be used for 32-bit/64-bit (platform-dependent) truncation.

 * If you still really want to protect some command argument from overflowing, Use Tcl\_GetWideIntFromObj() in this command, and use "string is wide" to check for proper range.
   But - still better - is use Tcl\_GetWideIntFromObj(), while falling back to Tcl\_GetBignumFromObj() if the range requires it.
   That's what Tcl itself is doing almost everywhere to prevent under/overflow errors.








|







87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
   So, it succeeds if the number fits in a Tcl\_WideInt.

 * The C function Tcl\_GetLongFromObj() is changed to behave like Tcl\_GetIntFromObj() if sizeof(long) == sizeof(int), and to behave like Tcl\_GetWideIntFromObj() if sizeof(long) == sizeof(Tcl_WideInt)

# Implications

 * "string is integer" can no longer be used to check for a specific range.
   That doesn't matter any more, because since the introduction of bignums the command argument that was being protected doesn't throw an exception any more.

 * int() can no longer be used for 32-bit/64-bit (platform-dependent) truncation.

 * If you still really want to protect some command argument from overflowing, Use Tcl\_GetWideIntFromObj() in this command, and use "string is wide" to check for proper range.
   But - still better - is use Tcl\_GetWideIntFromObj(), while falling back to Tcl\_GetBignumFromObj() if the range requires it.
   That's what Tcl itself is doing almost everywhere to prevent under/overflow errors.

Changes to tip/518.md.

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

# Reference Implementation

Emiliano has provided a [ticket 2863003fff](https://core.tcl-lang.org/tk/info/2863003fff) with the implementation in [branch bug-d6b95ce492](https://core.tcl-lang.org/tk/timeline?r=bug-d6b95ce492&nd&c=2016-09-21+06%3A32%3A55&n=200).

This solution is now continued with the tag "tip518-event-last-child-unmanaged".

Koen Dankart and François Vogel have worked on the solution of the similar tip474, which is available in [branch tip-454](https://core.tcl-lang.org/tk/timeline?n=100&r=tip-454).
This information may eventually also be relevant.

# Rejected Proposal

[TIP 454](454.md) has proposed to set the size of the widget automatically to 1x1 (the initial size if no widget packed/gridded).

Please read the discussion within the TIP which led to withdraw the proposal.

# Discussion

## Why not use the event name \<\<Configure\>\> ?

This is a logical and elegant proposal.

TIP 454 was withdrawn due to:

   1. if the geometry manager is changed (ex: pack to grid), there is a flickering introduced.
   2. an additional Configure event was introduced which breaks present script.

To invoke `<<Configure>>` instead `<<NoManagedChild>>` would trigger incompatibility 2 of TIP454.
Due to that, a new virtual event is proposed.

# Copyright

This document has been placed in the public domain.







|














|




|





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

# Reference Implementation

Emiliano has provided a [ticket 2863003fff](https://core.tcl-lang.org/tk/info/2863003fff) with the implementation in [branch bug-d6b95ce492](https://core.tcl-lang.org/tk/timeline?r=bug-d6b95ce492&nd&c=2016-09-21+06%3A32%3A55&n=200).

This solution is now continued with the tag "tip518-event-last-child-unmanaged".

Koen Dankart and François Vogel have worked on the solution of the similar [TIP #474](474.md), which is available in [branch tip-454](https://core.tcl-lang.org/tk/timeline?n=100&r=tip-454).
This information may eventually also be relevant.

# Rejected Proposal

[TIP 454](454.md) has proposed to set the size of the widget automatically to 1x1 (the initial size if no widget packed/gridded).

Please read the discussion within the TIP which led to withdraw the proposal.

# Discussion

## Why not use the event name \<\<Configure\>\> ?

This is a logical and elegant proposal.

TIP #454 was withdrawn due to:

   1. if the geometry manager is changed (ex: pack to grid), there is a flickering introduced.
   2. an additional Configure event was introduced which breaks present script.

To invoke `<<Configure>>` instead `<<NoManagedChild>>` would trigger incompatibility 2 of TIP #454.
Due to that, a new virtual event is proposed.

# Copyright

This document has been placed in the public domain.

Changes to tip/520.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 520: Make NaN Quiet
	Author:		Kevin B. Kenny <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	18 October 2018
	Post-History:
	Tcl-Version:	8.7
	Keywords:	Tcl, floating point, NaN, not a number
	Tcl-Branch:	tip-520
-----
# Abstract

This TIP proposes that the special floating point constants `NaN`,
`±NaN`, and `[±]NaN(`_hex_`)` be accepted in any context where







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 520: Make NaN Quiet
	Author:		Kevin B. Kenny <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	18 October 2018
	Post-History:
	Tcl-Version:	9.1
	Keywords:	Tcl, floating point, NaN, not a number
	Tcl-Branch:	tip-520
-----
# Abstract

This TIP proposes that the special floating point constants `NaN`,
`±NaN`, and `[±]NaN(`_hex_`)` be accepted in any context where

Changes to tip/526.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 526: Make [expr] Only Accept One Argument
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Nov-2018
	Tcl-Version:    9.0
	Post-History:
	Tcl-Branch:     tip-526
------

# Abstract

This TIP proposes that `expr` should only accept a single argument and stop






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
# TIP 526: Make [expr] Only Accept One Argument
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Nov-2018
	Tcl-Version:    9.1
	Post-History:
	Tcl-Branch:     tip-526
------

# Abstract

This TIP proposes that `expr` should only accept a single argument and stop

Changes to tip/529.md.

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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293

294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317





318
319
320
321
322
323
324
325
326
327
328
329
330
# TIP 529: Add metadata dict property to tk photo image
    Author:         Harald Oehlmann <[email protected]>
    State:          Draft
    Type:           Project
    Vote:           Pending




    Created:        07-Dec-2018
    Keywords:       Tk, image
    Tcl-Version:    8.7
    Tk-Branch:     tip-529-image-metadata
-----

# Abstract

An additional property is proposed for photo images to hold a dictionary with image metadata:


    myimage cget -metadata
    myimage configure -metadata [dict create DPI 300.0]

The content of the dictionary is initialized on image load and used on image save.

# Rationale

Image files may contain a lot of metadata like resolution, comments, GPS location etc.
This metadata should be accessible and setable for the following aims:

   *   Make it available after image load on script level
   *   Make it setable within the image
   *   Write its data to the image file.

## image resolution

This TIP specially targets the resolution (DPI) value of the image.

The image resolution included in an image file is crucial for its usage, as many applications (word & co.) use this field to calculate a default size.
One may imagine, that image files used in pdf4tcl are automatically scaled at the right resolution (e.g. the resolution saved in the image file).

This information is included in png files (supported by tk core) and many other image formats included in the Img patch.

I authored an extension to the Img patch to specify the dpi field of a bmp file on file writing. The syntax was accorded with Jeff Hobbs:

    myimage write file.bmp -format [list bmp -resolution 300 i]

This may be expressed (when all packages are adopted) by:

    myimage configure -metadata [dict create DPI 300.0]
    myimage write file.bmp

## Comment data

A comment may be used to save custom data in the image file.

An example is a vision automation project where a test procedure is connected to each image.
My solution is to use GIF images and to store the test procedure (a TCL script) in the gif comment.

## Preview extension for new command "image find"

The match functions should also be able to output the metadata dict.
This is due to the plan by Paul Obermeier to make the match function alone available on the script level.
See the discussion section for the message.

# Specification

## Metadata Dict

The propery "**-metadata**" is added to each image.  It contains a dictionary,
where the keys of the dictionary are specific to each photo image format.

The following default keys are proposed:

| Key       | Description      | Example image formats |
|:---------:|:----------------:|:---------------------:|
| `DPI`     | Horizontal Image resolution in DPI (double) | png |
| `aspect`  | Aspect ratio horizontal/vertical (double)   | png,gif |
| `comment` | Text comment     | png, gif |

Comments on the key choice:

   *   Abreviation are in upper case
   *   Words are in Americal English in small case (except propper nouns)
   *   Vertical DPI is expressed as DPI/aspect. The reason is, that some image formats may feature aspect and no resolution value.

It is valid to set any key within the application.
Any unknown key should be ignored by the application and image format drivers.

If a particular image does not specify any keys (whether during creation or otherwise) then the dictionary will be empty.

Each photo image format driver may define additional keys and may decide to use them for input (as a parameter for image read and/or image write), output (as an image read result) or both.

The TIP implementation does not target to implement all possible keys of all image formats for reading and writing imediately.
Image key format may grow over time on a use-case basis.

## Commands

The following commands are extended by a -metadata parameter:

    image create photo myimage -metadata $metadict
    myimage cget -metadata
    myimage configure -metadata $metadict
    myimage data -metadata $metadict
    myimage put -metadata $metadict
    myimage read -metadata $metadict
    myimage write -metadata $metadict

Any image format handler may use the content of the metadata dict.
This may be an ongoing process, specially within the Img patch.

Here is an overview, which command reads or sets the metadata dict:

| Command | Reads current image metadata dict | reads command options metadata dict | Writes current image metadata dict | Driver data merged in |
| :-: | :-: | :-: | :-: | :-: |
| image create | no | yes | yes | yes |
| myimage cget | yes | no | no | no |
| myimage configure | yes (1) | yes | yes | yes |
| myimage put | no | yes | no | no |
| myimage read | no | yes | no | no |
| myimage data | yes (1) | yes | no | no |
| myimage write | yes (1) | yes | no | no |

Footnotes:

(1) The current metadata is ignored if a metadata dict is given as command parameter.

(3) The current metadata is ignored by the image export if a metadata dict is given as command parameter.

Each command is now discussed within a subchapter:

### image create

Image create will parse the image data and create the metadata dict of the image.

As an example, a gif file with a comment would create a comment metadata key within the image:

    % image create photo myimage -format GIF -file testwithcomment.gif
    % myimage cget -metadata
    Comment "This is the image comment"

A metadata dict given on the command line will be merged with the parsed metadata dict with priority to the file metadata.

This allows to specify default values for keys which should be present.

An example with the same image as above:

    % image create photo myimage -format GIF -file testwithcomment.gif\
       -metadata [dict create User A Comment "Comment from command line"]
    % myimage cget -metadata
    User A Comment "This is the image comment"

### myimage cget

The metadata dict may be retrieved by:

    myimage cget -metadata

### myimage configure

The metadata dict of the image may be overwritten by:

    myimage configure -metadata [dict create Comment "Comment from cconfigure"]

The image data is not touched and no image data interpretation is triggered.

The retrival methods will return the metadata dict as for any other option:

    % myimage configure -metadata
    -metadata {} {} {} {Comment "Current comment"}

Setting one of the -format, -data or -file option to a different value will recreate the image with the new parameters.
In this case, an eventually present -metadata option will first replace the present metadata of the image.
Then, the image recreation will take place (using an eventually specified metadata dict) and may add keys to the image metadata dict.

It is not possible to trigger an image recreation by just specifying a metadata dict.
This is to avoid unneeded image recreation.

Note: parameters to change the rendered image should use the -format option. The metadata may provide additional data.

When the image is rendered again due to a change of the options -file, -data or -format, the following procedure applies:

   *   The current image metadata is replaced by an eventually  specified metadata.
   *   The image driver is called with the resulting metadata to render the image.
   *   Any metadata key outputted by the image driver rendering is set in the image metadata. In consequence, we get a merge of the current and the generated metadata.

### myimage put

The put command sets (parts of) the image data by specified new image data.

The -metadata property of the image is not changed.
This is consistent of other parameters like -format.

To replace the whole image including metadata, the configure command may be used by setting the -data option.

Example with gif data containing a comment:

    % image create myimage -metadata [dict create Comment "Comment from image create"]
    % myimage put $GIFWithCommentData
    % myimage cget -metadata
    Comment "Comment from image create"

A -metadata option may be specified to support the image read. Nevertheless, this metadata is not included in the metadata property of the image.

Example:

    % image create myimage -metadata [dict create Comment "Comment from image create"]
    % myimage put $GIFWithCommentData -metadata [dict create Comment "Comment from put command line"]
    % myimage cget -metadata
    Comment "Comment from image create"

### myimage read

The read command sets (parts of) the image data by new image data read from a file.
This command acts like the put command with the difference, that the image data comes from a file.

The -metadata property of the image is not changed.
This is consistent of other parameters like -format.

To replace the whole image including metadata, the configure command may be used by setting the -file option.

Example with a gif file containing a comment:

    % image create myimage -metadata [dict create Comment "Comment from image create"]
    % myimage read gifwithcomment.gif
    % myimage cget -metadata
    Comment "Comment from image create"

A -metadata option may be specified to support the image read. Nevertheless, this metadata is not included in the metadata property of the image. There is currently no practical application for this, but there might be examples which use that.

Example:

    % image create myimage -metadata [dict create Comment "Comment from image create"]
    % myimage read test.gif -metadata [dict create Comment "Comment from put command line"]
    % myimage cget -metadata
    Comment "Comment from image create"

### myimage data

The data command writes the image data into a variable.

If the image formats supports a specified metadata key, it is included in the output file.

If a -metadata option is given, the metadata property of the image is ignored.
Otherwise, the metadata property of the image is used.

Example to write a comment in gif data included in the image properties:

    % image create myimage -file test.png -metadata [dict create Comment "Comment from image create"]
    % myimage data -format "GIF"
    ... GIF data with comment included

Example to specify the comment with the command options

    % image create myimage -file test.png
    % myimage data -format "GIF"-metadata [dict create Comment "Comment from data command"]
    ... GIF data with comment included

### myimage write

The write command writes the image data to a file.
With respect to metadata, it works the same way as the data command.

Example to write a metadata comment:

    % image create myimage -file test.png
    % myimage write GifwithComment.gif -format "GIF"-metadata [dict create Comment "Comment from write command"]
    ... GIF data with comment included

### Notes on Options to image and metadata creation

The metadata is not suited to pass processing options to the driver.
For this aim, options should be added to the "-format" option.

In contrast, a driver may understand options passed by the "-format" option to modify its metadata processing.

Lets try the following imaginary example:
An image driver contains a full EXIF parser which creates many keys as output.
This processing is expensive in processing time and output data creation.
In consequence, the driver creator may decide to only create the EXIF output on a given option:

    image create photo photo.jpg -format "jpg -exif 1"

## Image format driver interface

The image format driver interface is changed in the following aspects:

### Pass metadata dict as parameter

Each driver function gets a tcl object pointer "metadataIn" as parameter.
This parameter serves to input a metadata dict to the driver function.
It may be NULL to flag that the metadata dict is empty.

A typical driver code snipped to check for a metadata key is:

    if (NULL != metadataIn) {
        Tcl_Obj *itemData;
        Tcl_DictObjGet(interp, metadataIn, Tcl_NewStringObj("Comment",-1), &itemData));


The receiving of the metadata by the format driver functions is only necessary for the Write functions to fulfill strictly the objective of the TIP.
Nevertheless, it is implemented the same way as the -format parameter which is available to all functions.
The reason is to support use cases not specified jet.
My feeling is, that it would be sad to limit the functionality by not passing the metadata to all format driver functions.

### Receive a metadata dict from the driver (FileRead,StringRead)

The image match and read functions (FileMatch, StringMatch, FileRead, StringRead) may set keys in a prepared metadata dict to return them.
Those function get an additional tcl object pointer as "metadataOut" as parameter.

This parameter may be NULL to indicate, that no metadata return is attended (put, read subcommands).

This parameter is initialized to an empty unshared dict object if metadata return is attended (image create command, configure subcommand).
The driver may set dict keys in this object to return metadata.

A sample driver code snippet is:

    if (NULL != metadataOut) {
        Tcl_DictObjPut(NULL, metadataOut, Tcl_NewStringObj("XMP",-1), Tcl_NewStringObj(xmpMetadata);

### Image format driver interface

For image format drivers, a new registration procedure is proposed which includes functions with the new parameters.
In addition, the parameters are reordered to always have the order interp, input parameter, output parameter, accillary functions.






The new stubs enabled function is:

    void Tk_CreatePhotoImageFormatVersion3(const Tk_PhotoImageFormatVersion3 *formatPtr)

The function parameters in Tk_PhotoImageFormatVersion3 are as follows:

    int (Tk_ImageFileMatchProcVersion3) (Tcl_Interp *interp, Tcl_Channel chan,
            const char *fileName, Tcl_Obj *format, Tcl_Obj *metadataIn, int *widthPtr,
            int *heightPtr, Tcl_Obj *metadataOut,);

    int (Tk_ImageStringMatchProcVersion3) (Tcl_Interp *interp, Tcl_Obj *dataObj,
            Tcl_Obj *format, Tcl_Obj *metadataIn, int *widthPtr, int *heightPtr,
|

|

|
>
>
>
>



|




|
>









|

|
|
|



|


|

|

|



|









|

|

|
|




|

|












|
|
|








|
|













|
|

|

|











|

<
<
|



|





|

|
>
|










|





|





|


|

|
|
|

|


|

|

|
|
|



|

|
|

|






|

|






|



|
|

|
|

|






|

|










|



|








|







|
|









|
|

|



|
|







|

|
|
|

|





>
|
|
<
|

|

|
|

|

|
|








|
|
>
>
>
>
>





|







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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300

301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
# TIP 529: Add metadata dictionary property to tk photo image
    Author:         Harald Oehlmann <[email protected]>
    State:          Final
    Type:           Project
    Vote:           Done
    Vote-Summary:   Accepted 7/0/1
    Votes-For:      AK, FV, JD, JN, KW, MC, SL 
    Votes-Against:  None
    Votes-Present:  KK
    Created:        07-Dec-2018
    Keywords:       Tk, image
    Tcl-Version:    8.7
    Tk-Branch:     tip529-image-metadata-no-match-method
-----

# Abstract

An additional property is proposed for photo images.
This property shall hold a dictionary with image metadata:

    myimage cget -metadata
    myimage configure -metadata [dict create DPI 300.0]

The content of the dictionary is initialized on image load and used on image save.

# Rationale

Image files may contain a lot of metadata like resolution, comments, GPS location etc.
This metadata should be accessible and modifiable for the following aims:

  * Make it available after image load on script level
  * Make it setable within the image
  * Write its data to the image file.

## image resolution

This TIP especially targets the resolution (DPI) value of the image.

The image resolution included in an image file is crucial for its usage, as many applications (word & co.) use this field to calculate a default size.
One may imagine, that image files used in `pdf4tcl` are automatically scaled to the correct resolution (e.g. the resolution saved in the image file).

This information is included in `.png` files (supported by core `Tk`) and many other image formats included in the `Img` package.

I authored an extension to the `Img` package to specify the `dpi` field of a `.bmp` file when writing. The syntax was accorded with Jeff Hobbs:

    myimage write file.bmp -format [list bmp -resolution 300 i]

This may be expressed (when all packages are adapted) by:

    myimage configure -metadata [dict create DPI 300.0]
    myimage write file.bmp

## Comment data

A comment may be used to save custom data in the image file.

An example is a vision automation project where a test procedure is connected to each image.
My solution is to use `.gif` images and to store the test procedure (a TCL script) in the gif's comment.

## Preview extension for new command "image metadata"

The match functions should also be able to return the metadata dictionary.
This is due to the plan by Paul Obermeier to make the `match` function available on the script level by itself.
See the discussion section for the message.

# Specification

## Metadata Dictionary

The property "**-metadata**" is added to each image.  It contains a dictionary,
where the keys of the dictionary are specific to each photo image format.

The following default keys are proposed:

| Key       | Description      | Example image formats |
|:---------:|:----------------:|:---------------------:|
| `DPI`     | Horizontal Image resolution in DPI (double) | png |
| `aspect`  | Aspect ratio horizontal/vertical (double)   | png,gif |
| `comment` | Text comment     | png, gif |

Comments on the key choice:

  * Abreviations are in upper case
  * Words are in American English, and in lower case (except proper nouns)
  * Vertical DPI is expressed as `DPI/aspect`. This is because some image formats may feature `aspect`, and no `resolution` value.

It is valid to set any key within the application.
Any unknown key should be ignored by the application and image format drivers.

If a particular image does not specify any keys (whether during creation or otherwise) then the dictionary will be empty.

Each photo image format driver may define additional keys and may decide to use them for input (as a parameter for image read and/or image write), output (as an image read result) or both.

The TIP implementation does not propose to immediately implement all possible keys of all image formats for reading and writing.
The set of predefined image keys may grow over time on a per-case basis instead.

## Commands

The following commands are extended by a -metadata parameter:

    image create photo myimage -metadata $metadict
    myimage cget -metadata
    myimage configure -metadata $metadict
    myimage data -metadata $metadict
    myimage put -metadata $metadict
    myimage read -metadata $metadict
    myimage write -metadata $metadict

Any image format handler may use the content of the metadata dictionary.
This may be an ongoing process, especially within the Img package.

Here is an overview, which command reads or sets the metadata dictionary:

| Command | Reads current image metadata dict | Reads command options metadata dict | Writes current image metadata dict | Driver data merged in |
| :-: | :-: | :-: | :-: | :-: |
| image create | no | yes | yes | yes |
| myimage cget | yes | no | no | no |
| myimage configure | yes (1) | yes | yes | yes |
| myimage put | no | yes | no | no |
| myimage read | no | yes | no | no |
| myimage data | yes (1) | yes | no | no |
| myimage write | yes (1) | yes | no | no |

Footnotes:

(1) The current metadata is ignored if a metadata dictionary is given as command parameter.



Each command is now discussed within its own section:

### image create

The `create` command will parse the image data and create the metadata dictionary of the image.

As an example, a gif file with a comment would create a comment metadata key within the image:

    % image create photo myimage -format GIF -file testwithcomment.gif
    % myimage cget -metadata
    Comment {This is the image comment}

A metadata dictionary given on the command line will be merged with the parsed metadata dictionary.
The meta data read from the file will be given priority.
This enables the specification of default values for keys which should be present.

An example with the same image as above:

    % image create photo myimage -format GIF -file testwithcomment.gif\
       -metadata [dict create User A Comment "Comment from command line"]
    % myimage cget -metadata
    User A Comment "This is the image comment"

### myimage cget

The metadata dictionary may be retrieved by:

    myimage cget -metadata

### myimage configure

The metadata dictionary of the image may be overwritten by:

    myimage configure -metadata [dict create Comment "Comment from cconfigure"]

The image data is not touched and no image data interpretation is triggered.

The retrieval methods will return the metadata dictionary as for any other option:

    % myimage configure -metadata
    -metadata {} {} {} {Comment {Current comment}}

Setting one of the `-format`, `-data` or `-file` options to a different value will recreate the image with the new parameters.
In this case, an eventually present `-metadata` option will first replace the present metadata of the image.
Then, the image recreation will take place (using an eventually specified metadata dictionary) and may add keys to the image metadata dictionary.

It is not possible to trigger an image recreation by just specifying a metadata dictionary.
This is to avoid unneeded image recreation.

Note: parameters to change the rendered image should use the `-format` option. The metadata may provide additional data.

When the image is rendered again due to a change of the options `-file`, `-data` or `-format`, the following procedure applies:

  * The current image metadata is replaced by an eventually specified metadata.
  * The image driver is called with the resulting metadata to render the image.
  * Any metadata key returned by the image driver rendering is set in the image metadata. In consequence, we get a merge of the current and the generated metadata.

### myimage put

The `put` command sets (parts of) the image data to the specified new image data.

The `-metadata` property of the image is not changed.
This is consistent of other parameters like `-format`.

To replace the whole image including metadata, the `configure` command may be used by setting the `-data` option.

Example with gif data containing a comment:

    % image create myimage -metadata [dict create Comment "Comment from image create"]
    % myimage put $GIFWithCommentData
    % myimage cget -metadata
    Comment {Comment from image create}

A `-metadata` option may be specified to support the read operation. Nevertheless, this metadata is not included in the metadata property of the image.

Example:

    % image create myimage -metadata [dict create Comment "Comment from image create"]
    % myimage put $GIFWithCommentData -metadata [dict create Comment "Comment from put command line"]
    % myimage cget -metadata
    Comment {Comment from image create}

### myimage read

The `read` command sets (parts of) the image data to new image data read from a file.
This command acts like the `put` command, except that the image data comes from a file.

The `-metadata` property of the image is not changed.
This is consistent of other parameters like `-format`.

To replace the whole image including metadata, the `configure` command may be used by setting the `-file` option.

Example with a gif file containing a comment:

    % image create myimage -metadata [dict create Comment "Comment from image create"]
    % myimage read gifwithcomment.gif
    % myimage cget -metadata
    Comment {Comment from image create}

A `-metadata` option may be specified to support the read operation. Nevertheless, this metadata is not included in the metadata property of the image. There is currently no practical application for this, but there might be examples which use that.

Example:

    % image create myimage -metadata [dict create Comment "Comment from image create"]
    % myimage read test.gif -metadata [dict create Comment "Comment from put command line"]
    % myimage cget -metadata
    Comment "Comment from image create"

### myimage data

The `data` command writes the image data into a variable.

If the image formats supports a specified metadata key, it is included in the output file.

If a `-metadata` option is given, the metadata property of the image is ignored.
Otherwise, the metadata property of the image is used.

Example to write a comment in gif data included in the image properties:

    % image create myimage -file test.png -metadata [dict create Comment "Comment from image create"]
    % myimage data -format "GIF"
    ... GIF data with comment included

Example to specify the comment with the command options:

    % image create myimage -file test.png
    % myimage data -format "GIF"-metadata [dict create Comment "Comment from data command"]
    ... GIF data with comment included

### myimage write

The `write` command writes the image data to a file.
With respect to metadata, it works the same way as the `data` command.

Example to write a metadata comment:

    % image create myimage -file test.png
    % myimage write GifwithComment.gif -format "GIF"-metadata [dict create Comment "Comment from write command"]
    ... GIF data with comment included

### Notes on Options to image and metadata creation

The metadata is not suited to passing processing options to the driver.
Such options should be added to the `-format` option instead.

In contrast, a driver may understand options passed through the `-format` option to modify its metadata processing.

Lets try the following imaginary example:
An image driver contains a full EXIF parser which creates many keys as output.
This processing is expensive, in both time and output data creation.
As a consequence, the driver creator may decide to only create the EXIF output when an option requesting such is specified:

    image create photo photo.jpg -format "jpg -exif 1"

## Image format driver interface

The image format driver interface is changed in the following aspects:

### Pass metadata dictionary as parameter

Each driver function receives a Tcl object pointer `metadataIn` as parameter.
This parameter serves to pass a metadata dictionary to the driver function.
It may be NULL. Doing so indicates that the metadata dictionary is empty.

A typical driver code snippet to check for a metadata key is:

    if (NULL != metadataIn) {
        Tcl_Obj *itemData;
        Tcl_DictObjGet(interp, metadataIn, Tcl_NewStringObj("Comment",-1), &itemData));

To strictly fulfill the objective of the TIP it is only necessary for the `Write` functions of the format driver to receive metadata.

Nevertheless, it is implemented the same way as the `-format` parameter which is available to all functions.

This allows the passing of additional options to the driver which only concern the metadata processing.

### Receive a metadata dictionary from the driver (FileRead,StringRead)

The image match and read functions (FileMatch, StringMatch, FileRead, StringRead) may set keys in a prepared metadata dictionary to return them.
These functions receive an additional Tcl object pointer as "metadataOut" as parameter.

This parameter may be NULL. This indicates that no metadata can be returned (`put`, `read` subcommands).

This parameter is initialized to an empty unshared dictionary object if metadata return is intended (`image create` command, `configure` subcommand).
The driver may set dictionary keys in this object to return metadata.

A sample driver code snippet is:

    if (NULL != metadataOut) {
        Tcl_DictObjPut(NULL, metadataOut, Tcl_NewStringObj("XMP",-1), Tcl_NewStringObj(xmpMetadata);

### Image format driver interface

For image format drivers a new registration procedure is proposed. This new procedure includes functions with the new parameters.
In addition, the parameters are reordered to always have the order of

  - interp,
  - input parameter(s),
  - output parameter(s),
  - auxiliary function(s).

The new stubs enabled function is:

    void Tk_CreatePhotoImageFormatVersion3(const Tk_PhotoImageFormatVersion3 *formatPtr)

The function parameters of `Tk_PhotoImageFormatVersion3` are as follows:

    int (Tk_ImageFileMatchProcVersion3) (Tcl_Interp *interp, Tcl_Channel chan,
            const char *fileName, Tcl_Obj *format, Tcl_Obj *metadataIn, int *widthPtr,
            int *heightPtr, Tcl_Obj *metadataOut,);

    int (Tk_ImageStringMatchProcVersion3) (Tcl_Interp *interp, Tcl_Obj *dataObj,
            Tcl_Obj *format, Tcl_Obj *metadataIn, int *widthPtr, int *heightPtr,
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371


372


373
374
375
376
377
378

379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
            Tcl_Obj *format, Tcl_Obj *metadataIn, Tk_PhotoImageBlock *blockPtr);

    int (Tk_ImageStringWriteProcVersion3) (Tcl_Interp *interp, Tcl_sObj *format,
            Tcl_Obj *metadataIn, Tk_PhotoImageBlock *blockPtr);

## Documentation

The manual page of "Tk_CreatePhotoImageFormat" will describe the new version 3 interface.
The following remark about the life cycle of the interfaces is added in a similar way as the current remark about the version 1 (old) interface:

Version 3 format driver interface is recommended for new projects.
Expect version 2 format driver interface and the command Tk_PhotoImageFormat to be removed with Tk 9.0.

In addition, it might be a good idea to speak about version 1 (old), version 2 and version 3 interface.

# Implementation

Implementation is in branch "tip-529-image-metadata".
The following metadata keys are implemented:

   * gif: comment
   * png: DPI, ratio

Thanks to Paul Obermaier, the TkImg package has implemented the new interface and uses it currently for DPI setting and reporting.

A set of test cases is included in the implementation.
In addition, the TkImg package features additional tests for this patch which exercise additional features like stub table, image parameters.
The TkImg patch links currently against the optional branch (see below), not against the branch tag tip-529-image-metadata.





It was necessary to fix the file tests/earth.gif as the file is incomplete.
# Discussion

## image find command planned by Paul Obermeier

What about extending and exposing the functionality of the MatchProc function at the Tcl level?

That way it would be possible to implement a command like "image info <fileName>", where
you can retrieve the image size, resolution and additional metadata without explicitely loading
the image.
In my image browser (http://www.posoft.de/html/poImgBrowseShots.html#Img1)
I am currently using a modified version of the Tcllib fileutil::fileType procedure to extract the
image size without creating a photo image. Getting that information (and additional metadata)
directly from the C-based image parsers would be faster and there would be no need to code that
functionality twice.

HaO: This functionality is prepared by the possibility that the match driver functions also may output metadata.

## Update DPI metadata property on image script

Paul Obermeier has made the following proposal:

How do you want to handle the physical resolution (DPI) in the case of image scaling?
Just keep the original DPI value or adjust the DPI values automatically, maybe using an option.

HaO: Currently, this is not prevued and may be implemented by another TIP.

## No use of other optional features by Paul Obermeier

I asked Paul, if he sees any use of the optional features below for him or TkImg.
The answer was: no, I don't see any use.

# Rejected Alternatives

Within the last two years development process, the following additional ideas were implemented in addition.
They are all implemented in the tk branch "tip-529-image-metadata-optional".
They are not included in the TIP and not included in the main implementation.
People may speak up to get any feature back in the main feature branch.

The optional features are:

   *   Implement XMP metadata type for gif.
   *   Optimize the SVG processing to store the preparsed binary blob in the metadata. This blob may be used for fast scaling of the image.
   *   Optimize driver internal communication: provide a DString memory to the image format driver to pass data from the match functions to the read functions.
   *   Optimize file access: allow the image driver to indicate, that the file is not needed any more after the match call.

The following subchapter discuss the optional features.
The format driver interface with all options is shown in a following additional subchapter.

Another rejected alternative to use only one metadata pointer in the interface is following as last subchapter.

## XMP data

Photo images may contain an XMP data structure which may hold structured data.
The aim is to make this data accessible.
The parsing of the XML structure is not part of this TIP and may be done by other packages.

The metadata key is:

| Key       | Description      | Example image formats |
|:---------:|:----------------:|:---------------------:|
| `XMP`     | xmp image data   | gif,png               |

XMP support is implemented for gif format.
Due to missing use case, it was removed from the main branch.

## SVG optimization by a metadata key holding the preparsed svg blob

### Rationale

The application is within the current SVG implementation included in Tk8.7a3.

The used svg routines from the nanosvg project split svg processing into two steps:

   *   Step 1: transform the xml data to a binary representation of the splines
   *   Step 2: render the splines to an image presentation

When svg files are loaded by:

    image create photo i1 -file test.svg -format {svg -scaletoheight 16}

then the file is accessed and the xml data loaded and processing step 1 and 2 is performed.

When the image is scaled by:

    i1 configure -file "" -data {<svg source="metadata" >} -format {svg -scaletoheight 32}

then the same steps are performed as on image load, while only step 2 would be necessary.
The performance is poor and the file must still be available.

The idea is to store the binary representation of the splines (result of processing step 1) as a key in the **-metadata** dict (say SVGBLOB) and to achieve to only perform step 2 on scaling.

In addition, svg image may even be "compiled" to the metadata structure, so the following command may work:

    image create i1 -metadata {SVGBLOB ...}  -data {<svg source="metadata" >}-format {svg -scaletoheight 32}

This will only work within the same patchlevel of TK on the same architecture (endianess, int size) , as the format may change, but it may be useful for example when packing to a starkit.

In my talk on ETCL 2019, I showed an Android GUI where buttons may be scaled by a pinch to zoom gesture. The current performance is quite poor.

### Specification

The svg driver returns a preparsed image blob in the metadata key "SVGBLOB".
This data is used as image data, if the -data parameter contains the string "\<svg data=\"metadata\" />".

A sample script is as follows:

    image create photo foo -data $svggradient -format svg
    foo configure -file "" -data "\<svg data=\\"metadata\\" />" -format "svg -scale 2"

Internally, the driver uses the driver internal DString to communicate between the match and read functions.

The output of the svg parser is serialized in arrays and put into the memory block.
All functions of the rendering functions dealing with the input data are changed to use the array.

### Discussion

I see only a small speed-up (around 10%) by this solution.
In addition, the version without this option is as fast as the optimized version.
So, we have a slowdown for the normal case and no gain for the optimized version.

My test script is as follows:

   *   take the file from [https://svgstudio.com/pages/free-sample]
   *   use the following script:
   
   image create photo foo -file Freesample.svg -format svg
    proc switch {} {
        foo configure -format {svg -scale 2}
        foo configure -format {svg -scale 1}
    }
    time switch 100
    40139.367 microseconds per iteration
    
    * now activate the use of the metadata
    
    foo configure -file "" -data "<svg data=\"metadata\" />" -format "svg"
    38641.935 microseconds per iteration

For me, even removing the file operations and the parsing should be a magnitude faster.
But the facts are different.
Apparently copying all this data around in addition takes a lot of time.
And the svg-nano parser is super fast.
And most processing time is taken by image rendering.

## Match and read function communication memory

The match functions and the image read functions get an additional parameter "driverInternalPtr" which points to an initialized DString.
The DString is cleared by the framework.

Using this DString, the driver match function may pass data to its read function.

The rationale is the current implementation of the SVG driver:

   *   The driver currently uses ThreadSpecific data to pass data from the match procedure to the read procedure. Due to that, a more simple alternate possibility is proposed.

## Flag that the match function does not need the channel any more

The driver file match function may flag, that it does not need the channel any more.
Only in this case, the additional output int "closeChannel" should be set to 1.
In this case, a NULL driver is passed to the read driver function.

The rationale is the current implementation of the SVG driver:

   *   The driver does not need the file any more after the match procedure. Thus, any preparing file operations (seek etc) may be omitted and a NULL channel may be passed.

## Format driver interface with all options

The function parameters in Tk_PhotoImageFormatVersion3 are as follows:

    int (Tk_ImageFileMatchProcVersion3) (Tcl_Interp *interp, Tcl_Channel chan,
        const char *fileName, Tcl_Obj *format, Tcl_Obj *metadataIn, int *widthPtr,
        int *heightPtr, Tcl_Obj *metadataOut, int *closeChannelPtr,
        Tcl_DString *driverInternalPtr);

    int (Tk_ImageStringMatchProcVersion3) (Tcl_Interp *interp, Tcl_Obj *dataObj,







<
<
|
<
<
|
<



|


|
|

|


|
|
>
>

>
>
|


|


>
|
|
|
|
|




|








|








|
|

|



|
|
|
|

|
|

|













|
|





|

|

|
|

|



|

|



|


|

|

|

|

|



|
|






|

|










|
|

|







|








|



|
|

|



|

|

|
|




|



|







353
354
355
356
357
358
359


360


361

362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
            Tcl_Obj *format, Tcl_Obj *metadataIn, Tk_PhotoImageBlock *blockPtr);

    int (Tk_ImageStringWriteProcVersion3) (Tcl_Interp *interp, Tcl_sObj *format,
            Tcl_Obj *metadataIn, Tk_PhotoImageBlock *blockPtr);

## Documentation



The script-visible changes are documented in the manpage `doc/photo.n`.


The changes to the C level interface on the other hand are documented in `doc/CrtPhImgFmt.3`.


# Implementation

The implementation is done in branch `tip-529-image-metadata-no-match-method` of the Tk fossil repository.
The following metadata keys are implemented:

  * gif: comment
  * png: DPI, ratio

With thanks to Paul Obermeier, the `Img` package has implemented the new interface and uses it currently for setting and reporting of DPI information.

A set of test cases is included in the implementation.
In addition, the `Img` package features additional tests for this change which exercise additional features like the stub table and image parameters.

Note that the `Img` package currently links against the optional branch (see below), and not against the branch tag `tip-529-image-metadata-no-match-method`.
This was necessary to fix the file `tests/earth.gif`, as it is incomplete.

__Warning__: The two following chapters ("Discussion" and "Rejected alternatives") contain a lot of information not relevant for the TIP.
A reader only interested in the functionality of the TIP may stop here.

# Discussion

## `image metadata` command planned by Paul Obermeier

What about extending and exposing the functionality of the MatchProc function at the Tcl level?

That way it would be possible to implement a command like `image metadata <fileName>`, where
you can retrieve the image size, resolution and additional metadata without explicitely loading the image.

In my image browser ([Screenshot](http://www.posoft.de/html/poImgBrowseShots.html#Img1))
I am currently using a modified version of Tcllib's `fileutil::fileType` command to extract the
image size without creating a photo image. Getting that information (and additional metadata)
directly from the C-based image parsers would be faster and there would be no need to code that
functionality twice.

This function is implemented in Tk branch `tip-529-image-metadata`.

## Update DPI metadata property on image script

Paul Obermeier has made the following proposal:

How do you want to handle the physical resolution (DPI) in the case of image scaling?
Just keep the original DPI value or adjust the DPI values automatically, maybe using an option.

HaO: Currently, this is not thought out and may be implemented by another TIP.

## No use of other optional features by Paul Obermeier

I asked Paul, if he sees any use of the optional features below for him or TkImg.
The answer was: no, I don't see any use.

# Rejected Alternatives

Within the last two years of development, the following additional ideas were implemented as well.
They are all implemented in the Tk branch `tip-529-image-metadata-optional`.
They are not included in the TIP and not included in the main implementation.
People may speak up to get any feature back into the main feature branch.

The optional features are:

  * Implemented XMP metadata type for gif.
  * Optimized SVG processing to store the preparsed binary blob into the metadata. This blob may be used for fast scaling of the image.
  * Optimized driver internal communications: Provided a DString structure to the image format driver for the passing of data from the match functions to the read functions.
  * Optimized file access: Gave the image driver the ability to indicate that the file is not needed any more after the match call.

The following section discusses these optional features.
The format driver interface with all options is shown in the section after that.

Another rejected alternative using only one metadata pointer in the interface follows as the last section.

## XMP data

Photo images may contain an XMP data structure which may hold structured data.
The aim is to make this data accessible.
The parsing of the XML structure is not part of this TIP and may be done by other packages.

The metadata key is:

| Key       | Description      | Example image formats |
|:---------:|:----------------:|:---------------------:|
| `XMP`     | xmp image data   | gif,png               |

XMP support is implemented for the `gif` format.
It was removed from the main branch, due to not having a use case at the moment.

## SVG optimization by a metadata key holding the preparsed svg blob

### Rationale

This is used within the current SVG implementation included in Tk8.7a3.

The routines imported from the nanosvg project split SVG processing into two steps:

  1. Transform the xml data to a binary representation of the splines
  2. Render the splines to an image presentation

When an SVG file is loaded via

    image create photo i1 -file test.svg -format {svg -scaletoheight 16}

the file is read, the xml data loaded, and processing steps 1 and 2 are performed.

When the image is later scaled by:

    i1 configure -file "" -data {<svg source="metadata" >} -format {svg -scaletoheight 32}

the same steps are performed as on image load, while only step 2 would be necessary.
The performance is poor and the file must still be available.

The idea is to store the binary representation of the splines (result of processing step 1) as a key in the **-metadata** dictionary (say SVGBLOB). This then enables the code to only perform step 2 on scaling.

In addition, an svg image may even be "compiled" to the metadata structure, so the following command may work:

    image create i1 -metadata {SVGBLOB ...} -data {<svg source="metadata" >} -format {svg -scaletoheight 32}

While this will only work within the same patchlevel of Tk and on the same architecture (endianess, int size), as the format may change, it may be useful when creating a starkit, for example.

In my talk at ETCL 2019 I showed an Android GUI where buttons could be scaled by a pinch-to-zoom gesture. The current performance is quite poor.

### Specification

The SVG driver returns a preparsed image blob in the metadata key "SVGBLOB".
This data is used as image data, if the `-data` parameter contains the string "\<svg data=\"metadata\" />".

A sample script is as follows:

    image create photo foo -data $svggradient -format svg
    foo configure -file "" -data "\<svg data=\\"metadata\\" />" -format "svg -scale 2"

Internally, the driver uses a hidden DString structure to communicate between the match and read functions.

The output of the SVG parser is serialized into an array and put into the memory block.
All functions of the rendering functions dealing with the input data are changed to use the array.

### Discussion

I see only a small speed-up (around 10%) by this solution.
In addition, the version without this option is as fast as the optimized version.
So, we have a slowdown for the normal case and no gain for the optimized version.

My test script is as follows:

  * Take the file from [https://svgstudio.com/pages/free-sample]
  * Use the following script:
   
    image create photo foo -file Freesample.svg -format svg
    proc switch {} {
        foo configure -format {svg -scale 2}
        foo configure -format {svg -scale 1}
    }
    time switch 100
    40139.367 microseconds per iteration
    
  * Now activate the use of the metadata
    
    foo configure -file "" -data "<svg data=\"metadata\" />" -format "svg"
    38641.935 microseconds per iteration

For me, even removing the file operations and the parsing should be a magnitude faster.
But the facts are different.
Apparently copying all this data around in addition takes a lot of time.
And the svg-nano parser is super fast.
Most of the processing time is taken by image rendering.

## Match and read function communication memory

The image match and read functions get an additional parameter `driverInternalPtr` which points to an initialized DString structure.
The DString structure is cleared by the framework.

Via this DString the driver match function can pass data to its read function.

The rationale is the current implementation of the SVG driver:

  * The driver currently uses ThreadSpecific data to pass data from the match procedure to the read procedure. Due to that, a more simple alternate possibility is proposed.

## Indicate that the match function does not need the channel any more

The driver file match function may indicate that it does not need the channel any more.
This is done by setting the additional output int `closeChannel` to `1`.
In this case, a NULL driver is passed to the read driver function.

The rationale is the current implementation of the SVG driver:

  * The driver does not need the file any more after the match procedure. Thus, any preparing file operations (seek etc) may be omitted and a NULL channel may be passed.

## Format driver interface with all options

The function parameters in `Tk_PhotoImageFormatVersion3` are as follows:

    int (Tk_ImageFileMatchProcVersion3) (Tcl_Interp *interp, Tcl_Channel chan,
        const char *fileName, Tcl_Obj *format, Tcl_Obj *metadataIn, int *widthPtr,
        int *heightPtr, Tcl_Obj *metadataOut, int *closeChannelPtr,
        Tcl_DString *driverInternalPtr);

    int (Tk_ImageStringMatchProcVersion3) (Tcl_Interp *interp, Tcl_Obj *dataObj,
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585

        Tcl_Obj *format, Tcl_Obj *metadataIn, Tk_PhotoImageBlock *blockPtr);

    int (Tk_ImageStringWriteProcVersion3) (Tcl_Interp *interp, Tcl_sObj *format,
        Tcl_Obj *metadataIn, Tk_PhotoImageBlock *blockPtr);

## Single metadata parameter for input and output

A first approach was to use one metadata parameter to the format driver functions which allowed combined input and output.
The properties are:

   *   no new image format definition required.
   *   it is not possible to inform the driver routines, that no metadata output is expected.
   *   the image driver function must take care about shared object and create a copy on modification. Thus, a pointer to an object pointer must be passed.
   *   a metadata must be prepared even if there is no metadata and cleaned after each match round.

This solution was not chosen due to the complicated way to set a metadata dict by the format driver functions.
In addition, it is seen as valueable, that the information "no metadata output, please" may be transmitted.

The implementation is in branch "tip-529-image-metadata-jan".

# Copyright

This document has been placed in the public domain.








|


|
|
|
|

|


|




>
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
        Tcl_Obj *format, Tcl_Obj *metadataIn, Tk_PhotoImageBlock *blockPtr);

    int (Tk_ImageStringWriteProcVersion3) (Tcl_Interp *interp, Tcl_sObj *format,
        Tcl_Obj *metadataIn, Tk_PhotoImageBlock *blockPtr);

## Single metadata parameter for input and output

A first approach was to use one metadata parameter to the format driver functions, combining input and output.
The properties are:

  * No new image format definition required.
  * It is not possible to tell the driver routines when no metadata output is expected.
  * The image driver function has to take shared objects into account and create a copy when doing modifications. Thus, a pointer to an object pointer must be passed.
  * A metadata dictionary must be prepared even if there is no metadata, and also cleaned after each match round.

This solution was not chosen due to the complicated way for the format driver functions to set a metadata dictionary.
In addition, it is seen as valueable, that the information "no metadata output, please" may be transmitted.

The implementation is in branch `tip-529-image-metadata-jan`.

# Copyright

This document has been placed in the public domain.

Changes to tip/531.md.

1
2
3
4
5
6
7
8
9
10




11
12
13
14
15
16
17
# TIP 531: Static Tcl Interpreter Creation Function
	Author:         Shannon Noe <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        14-Dec-2018
	Post-History:  
	Keywords:       Tcl, stubs
	Tcl-Version:    8.7
	Tcl-Branch:     tip-531




----

# Abstract

This TIP adds a helper function to the tclstubs library for creating an interpreter.
The `Tcl_CreateInterp` function is dependent on the order defining `USE_TCL_STUBS` and inclusion of `tcl.h`.
When users get this wrong the error is a null pointer exception (NPE) on the stubs table.


|

|





>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# TIP 531: Static Tcl Interpreter Creation Function
	Author:         Shannon Noe <[email protected]>
	State:          Rejected
	Type:           Project
	Vote:           Done
	Created:        14-Dec-2018
	Post-History:  
	Keywords:       Tcl, stubs
	Tcl-Version:    8.7
	Tcl-Branch:     tip-531
	Vote-Summary:	Rejected 0/4/1
	Votes-For:	none
	Votes-Against:	JN, KBK, KW, MC
	Votes-Present:	BG
----

# Abstract

This TIP adds a helper function to the tclstubs library for creating an interpreter.
The `Tcl_CreateInterp` function is dependent on the order defining `USE_TCL_STUBS` and inclusion of `tcl.h`.
When users get this wrong the error is a null pointer exception (NPE) on the stubs table.

Changes to tip/534.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 534: Faster Hashing of Small Integers
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        02-March-2019
	Post-History:   
	Keywords:       Tcl
	Tcl-Version:	8.7
	Tcl-Branch:     dkf-experimental-fast-number-hash
-----

# Abstract

This TIP proposes to change the Tcl hashing algorithm _slightly_ to allow integers to be used as hash keys without computing their string representation.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 534: Faster Hashing of Small Integers
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        02-March-2019
	Post-History:   
	Keywords:       Tcl
	Tcl-Version:	9.1
	Tcl-Branch:     dkf-experimental-fast-number-hash
-----

# Abstract

This TIP proposes to change the Tcl hashing algorithm _slightly_ to allow integers to be used as hash keys without computing their string representation.

Changes to tip/537.md.

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
	Tcl-Branch:     regexp-api-64bit
-----

# Abstract
 
This TIP proposes to modify `struct Tcl_RegExpInfo` and `struct
Tcl_RegExpIndices`, such that the fields indicating indexes change from type
`int` to type `size_t`.

# Rationale

This TIP should have been part of [TIP #502](502.md) (Index Value Reform) and/or [TIP #494](494.md) (More use of `size_t` in Tcl 9), but it was overlooked. Without changing this public API, regular expression
indexes never can exceed 2GiB in value.

# Specification and Documentation

Here are the new struct definitions:

    typedef struct Tcl_RegExpInfo {
        size_t nsubs;
        Tcl_RegExpIndices *matches;
        size_t extendStart;
    } Tcl_RegExpInfo;
    
    typedef struct Tcl_RegExpIndices {
        size_t start;
        size_t end;
    } Tcl_RegExpIndices;

Also a new macro `TCL_INDEX_NONE` will be provided, which is the value of the
`start` and `end` fields when there is no match.
This macro will be provided to 8.7 as well, but in Tcl 8.7 it will have the value (-1).







# Implementation

An implementation of this TIP is present in the [regexp-api-64bit](https://core.tcl-lang.org/tcl/timeline?r=regexp-api-64bit) branch. 

# Copyright

This document has been placed in the public domain.







|



|







|

|



|
|






>
>
>
>
>
>







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
	Tcl-Branch:     regexp-api-64bit
-----

# Abstract
 
This TIP proposes to modify `struct Tcl_RegExpInfo` and `struct
Tcl_RegExpIndices`, such that the fields indicating indexes change from type
`int` to type `Tcl_Size`.

# Rationale

This TIP should have been part of [TIP #502](502.md) (Index Value Reform) and/or [TIP #494](494.md) (More use of `Tcl_Size` in Tcl 9), but it was overlooked. Without changing this public API, regular expression
indexes never can exceed 2GiB in value.

# Specification and Documentation

Here are the new struct definitions:

    typedef struct Tcl_RegExpInfo {
        Tcl_Size nsubs;
        Tcl_RegExpIndices *matches;
        Tcl_Size extendStart;
    } Tcl_RegExpInfo;
    
    typedef struct Tcl_RegExpIndices {
        Tcl_Size start;
        Tcl_Size end;
    } Tcl_RegExpIndices;

Also a new macro `TCL_INDEX_NONE` will be provided, which is the value of the
`start` and `end` fields when there is no match.
This macro will be provided to 8.7 as well, but in Tcl 8.7 it will have the value (-1).

# Addendum

After [TIP #660](660.md) was accepted, a lot of functions changed from
using size\_t to ptrdiff\_t parameters. In order to prevent confusion,
this change has been adapted in the TIP text above as well.

# Implementation

An implementation of this TIP is present in the [regexp-api-64bit](https://core.tcl-lang.org/tcl/timeline?r=regexp-api-64bit) branch. 

# Copyright

This document has been placed in the public domain.

Changes to tip/540.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 540: Add -signal Channel Configure Option to POSIX Pipes
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Tcl-Version:    8.7
	Vote:           Pending
	Created:        03-May-2019
	Keywords:       Tcl, Unix, pipeline
	Post-History:
-----

# Abstract




|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 540: Add -signal Channel Configure Option to POSIX Pipes
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Tcl-Version:    9.1
	Vote:           Pending
	Created:        03-May-2019
	Keywords:       Tcl, Unix, pipeline
	Post-History:
-----

# Abstract

Changes to tip/542.md.

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Androwish made the choice to use an (at that time) un-supported Tcl mode: Changing the size
of the Tcl\_UniChar type using TCL\_UTF\_MAX=6. This causes a binary incompatibility
which results that all extensions need to be re-compiled with TCL\_UTF\_MAX=6 as well.
This TIP proposes to add a supported TCL\_UTF\_MAX=4 compilation mode to Tcl, which has
the same effect as the earlier unsupported TCL\_UTF\_MAX=6, but without the need to
re-compile all extensions.

There are 5 functions which expose the internal structure of Tcl strings to extensions,
functions that are rarely used in extensions. Those are `Tcl_AppendUnicodeToObj()`,
`Tcl_UniCharCaseMatch()`, `Tcl_UniCharLen()`, `Tcl_UniCharNcmp()` and `Tcl_UniCharNcasecmp()`.
They all have a UTF-8 equivalent which can be used instead. Switching TCL\_UTF\_MAX
to a different value causes a binary incompatibility, but it's not worth to do
anything about it. That's why this TIP proposes to deprecate them, and have them
removed completely in Tcl 9.0 (actually: they will become MODULE\_SCOPE internal
functions in 9.0).








|
|







41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Androwish made the choice to use an (at that time) un-supported Tcl mode: Changing the size
of the Tcl\_UniChar type using TCL\_UTF\_MAX=6. This causes a binary incompatibility
which results that all extensions need to be re-compiled with TCL\_UTF\_MAX=6 as well.
This TIP proposes to add a supported TCL\_UTF\_MAX=4 compilation mode to Tcl, which has
the same effect as the earlier unsupported TCL\_UTF\_MAX=6, but without the need to
re-compile all extensions.

There are 4 functions which expose the internal structure of Tcl strings to extensions,
functions that are rarely used in extensions. Those are
`Tcl_UniCharCaseMatch()`, `Tcl_UniCharLen()`, `Tcl_UniCharNcmp()` and `Tcl_UniCharNcasecmp()`.
They all have a UTF-8 equivalent which can be used instead. Switching TCL\_UTF\_MAX
to a different value causes a binary incompatibility, but it's not worth to do
anything about it. That's why this TIP proposes to deprecate them, and have them
removed completely in Tcl 9.0 (actually: they will become MODULE\_SCOPE internal
functions in 9.0).

69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
   In the latter mode, the Tcl_UniChar type becomes a 32-bit type.

 * Allow Tcl extensions to be compiled with either -DTCL\_UTF\_MAX=3 (default), or with -DTCL\_UTF\_MAX=4,
   independent from how Tcl is compiled.

 * Deprecate the following functions:

     Tcl\_AppendUnicodeToObj()

     Tcl\_UniCharCaseMatch()

     Tcl\_UniCharLen()

     Tcl\_UniCharNcmp()

     Tcl\_UniCharNcasecmp()







<
<







69
70
71
72
73
74
75


76
77
78
79
80
81
82
   In the latter mode, the Tcl_UniChar type becomes a 32-bit type.

 * Allow Tcl extensions to be compiled with either -DTCL\_UTF\_MAX=3 (default), or with -DTCL\_UTF\_MAX=4,
   independent from how Tcl is compiled.

 * Deprecate the following functions:



     Tcl\_UniCharCaseMatch()

     Tcl\_UniCharLen()

     Tcl\_UniCharNcmp()

     Tcl\_UniCharNcasecmp()
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

     Tcl\_GetUnicodeFromObj()

     Tcl\_NewUnicodeObj()

     Tcl\_SetUnicodeObj()



   If Tcl is compiled with a different TCL\_UTF\_MAX value than the extension, those 4 functions cannot be used.
   In order to keep binary compatibility with 8.6, those 4 functions are not supported for extensions compiled
   with -DTCL\_UTF\_MAX=4. You can use the functions in TIP #548 instead, for converting between Tcl_UniChar
   and UTF-8.

# Compatibility

As long as Tcl is compiled with -DTCL\_UTF\_MAX=3, this is fully upwards compatible.

When Tcl is compiled with -DTCL\_UTF\_MAX=4, this is at the Tcl level, compatible with the Androwish-version
of Tcl. At the C-API level, it's upwards compatible with Tcl 8.6 in TCL\_UTF\_MAX=6 mode, except for the
functions mentioned above.








# Caveats

 * Extensions compiled with -DTCL\_UTF\_MAX=4 cannot use any of the deprecated functions mentioned in this TIP.
   Using any of them results in a link error.

 * If Tcl is compiled with -DTCL\_UTF\_MAX=4, the deprecated functions will be removed from the stub-table. Any
   extension using those, even if the extension is compiled with -DTCL\_UTF\_MAX=3, won't work any more: This







>
>
|
|











>
>
>
>
>
>
>







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

     Tcl\_GetUnicodeFromObj()

     Tcl\_NewUnicodeObj()

     Tcl\_SetUnicodeObj()

     Tcl\_AppendUnicodeToObj()

   If Tcl is compiled with a different TCL\_UTF\_MAX value than the extension, those 5 functions cannot be used.
   In order to keep binary compatibility with 8.6, those 5 functions are not supported for extensions compiled
   with -DTCL\_UTF\_MAX=4. You can use the functions in TIP #548 instead, for converting between Tcl_UniChar
   and UTF-8.

# Compatibility

As long as Tcl is compiled with -DTCL\_UTF\_MAX=3, this is fully upwards compatible.

When Tcl is compiled with -DTCL\_UTF\_MAX=4, this is at the Tcl level, compatible with the Androwish-version
of Tcl. At the C-API level, it's upwards compatible with Tcl 8.6 in TCL\_UTF\_MAX=6 mode, except for the
functions mentioned above.

# Later change

The original version of this TIP (as voted upon), proposed to fully deprecate the
Tcl\_AppendUnicodeToObj(). However the later [TIP #622](622.md) changed that: Only
deprecate Tcl\_AppendUnicodeToObj() when Tcl is compiled in a different -DTCL\_UTF\_MAX
mode than the extension. 

# Caveats

 * Extensions compiled with -DTCL\_UTF\_MAX=4 cannot use any of the deprecated functions mentioned in this TIP.
   Using any of them results in a link error.

 * If Tcl is compiled with -DTCL\_UTF\_MAX=4, the deprecated functions will be removed from the stub-table. Any
   extension using those, even if the extension is compiled with -DTCL\_UTF\_MAX=3, won't work any more: This

Changes to tip/544.md.

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

This TIP proposes to export the internal function `TclGetIntForIndex()`
as `Tcl_GetIntForIndex()`. The signature is:

  * int **Tcl\_GetIntForIndex**(Tcl\_Interp \*_interp_, Tcl\_Obj \*_objPtr_,
	    int _endValue_, int \*_indexPtr_)

For Tcl 9.0, all indexes have type `size_t`, so there the signature is:

  * int **Tcl\_GetIntForIndex**(Tcl\_Interp \*_interp_, Tcl\_Obj \*_objPtr_,
	    size\_t _endValue_, size\_t \*_indexPtr_)

# Rationale

This function can be used for extensions to parse indexes like
"`end-5`", "`12+1`" ... See [TIP 502: Index Value Reform](502.md) and
[TIP 176: Add String index Values](176.md).

Use case  in Tk: see
[Tcl-core list discussion](http://code.activestate.com/lists/tcl-core/20663/)
of
[TIP 541: Add support for 'end' index in ttk::combobox current](176.md).

# Compatibility

This is fully upwards compatible with Tcl 8.6.







# Reference Implementation

Available on branch [tip-544](https://core.tcl-lang.org/tcl/timeline?t=tip-544).

# Copyright

This document has been placed in the public domain.







|


|










|





>
>
>
>
>
>







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

This TIP proposes to export the internal function `TclGetIntForIndex()`
as `Tcl_GetIntForIndex()`. The signature is:

  * int **Tcl\_GetIntForIndex**(Tcl\_Interp \*_interp_, Tcl\_Obj \*_objPtr_,
	    int _endValue_, int \*_indexPtr_)

For Tcl 9.0, all indexes have type `Tcl_Size`, so there the signature is:

  * int **Tcl\_GetIntForIndex**(Tcl\_Interp \*_interp_, Tcl\_Obj \*_objPtr_,
	    Tcl\_Size _endValue_, Tcl\_Size \*_indexPtr_)

# Rationale

This function can be used for extensions to parse indexes like
"`end-5`", "`12+1`" ... See [TIP 502: Index Value Reform](502.md) and
[TIP 176: Add String index Values](176.md).

Use case  in Tk: see
[Tcl-core list discussion](http://code.activestate.com/lists/tcl-core/20663/)
of
[TIP 541: Add support for 'end' index in ttk::combobox current](541.md).

# Compatibility

This is fully upwards compatible with Tcl 8.6.

# Addendum

After [TIP #660](660.md) was accepted, a lot of functions changed from
using size\_t to ptrdiff\_t parameters. In order to prevent confusion,
this change has been adapted in the TIP text above as well.

# Reference Implementation

Available on branch [tip-544](https://core.tcl-lang.org/tcl/timeline?t=tip-544).

# Copyright

This document has been placed in the public domain.

Changes to tip/549.md.

1
2
3
4
5
6
7
8
9
10
11
# TIP 549: Make configure --enable-64bit the default
	Author:         Jan Nijtmans <[email protected]>
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        7-June-2019
	Post-History:   
	Discussions-To: Tcl Core list
	Keywords:       Tcl
	Tcl-Version:    8.7



|







1
2
3
4
5
6
7
8
9
10
11
# TIP 549: Make configure --enable-64bit the default
	Author:         Jan Nijtmans <[email protected]>
	Author:         Jan Nijtmans <[email protected]>
	State:          Withdrawn
	Type:           Project
	Vote:           Pending
	Created:        7-June-2019
	Post-History:   
	Discussions-To: Tcl Core list
	Keywords:       Tcl
	Tcl-Version:    8.7

Changes to tip/550.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 550: Garbage Collection for TclOO
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        11-Jun-2019
	Post-History: 
	Tcl-Version:    9.0
	Keywords:       Tcl, memory
-----

# Abstract

This TIP changes the semantics of Tcl and TclOO so that objects can be
reclaimed automatically when they are no longer referenced.







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 550: Garbage Collection for TclOO
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        11-Jun-2019
	Post-History: 
	Tcl-Version:    9.1
	Keywords:       Tcl, memory
-----

# Abstract

This TIP changes the semantics of Tcl and TclOO so that objects can be
reclaimed automatically when they are no longer referenced.

Changes to tip/552.md.

1
2
3
4
5




6
7
8
9
10
11
12
# TIP 552: Extended treeview functionality.
        Author:        Peter Spjuth <[email protected]>
        State:         Draft
        Type:          Project
        Vote:          Pending




        Created:       19-Sep-2019
        Post-History:
        Tcl-Version:   8.7
        Keywords:      Tk, treeview
        Tk-Branch:     pspjuth-treeview
-----



|

|
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 552: Extended treeview functionality.
        Author:        Peter Spjuth <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Vote-Summary:  Accepted 5/0/0
        Votes-For:     BG, SL, JN, FV, KW
        Votes-Against: none
        Votes-Present: none
        Created:       19-Sep-2019
        Post-History:
        Tcl-Version:   8.7
        Keywords:      Tk, treeview
        Tk-Branch:     pspjuth-treeview
-----

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
A new option **-striped** *bool* is added. This makes every other item to be
drawn with the **-stripedbackground** color, if that option is set by the
theme or tags.
Built in themes are updated to put something fitting at that color.

## Column separators

The **-show** option is extended with the value `columnseparators` to
display a separator between columns.
Built in themes are updated to define the separators.



## Image anchor for tree

A new item option **-imageanchor** *anchor* is added.
This controls the placement of the image relative to the text in an
item's tree column. Default is "w".
For tags, **-imageanchor** work like **-image**, i.e. if not set in the
item, it can be set by tags.

## Item height

A new item option **-height** *height* is added.
This controls the height of the item, in multiples of **-rowheight**. Default is 1.






## Automatic -rowheight.

If the style do not set -rowheight, it is filled in based an current font and layout for an item.
An Item and a Cell layout is measured with the style's settings, and the resulting height is used as default.

## Cell tags.

To control appearance of individual cells, tags can be set on cells as well as items.
The set of tags is shared between items and cells, so things like **tag configure** are not affected.





A new subcommand **tag cell add** is added, mirroring the present **tag add** but operating on cells.

A new subcommand **tag cell remove** is added, mirroring the present **tag remove** but operating on cells.

A new subcommand **tag cell has** is added, mirroring the present **tag has** but operating on cells.












# Rejected alternatives

## Striped rows

An earlier spec implemented **-striped** as an alternate state. This did not
work well, since options are resolved in a certain order. Style defaults,







|
|

>
>






|







>
>
>
>
>


|





|
>
>
>
>






>
>
>
>
>
>
>
>
>
>
>







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
A new option **-striped** *bool* is added. This makes every other item to be
drawn with the **-stripedbackground** color, if that option is set by the
theme or tags.
Built in themes are updated to put something fitting at that color.

## Column separators

A new column option **-separator** *bool* is added.
This controls if a column separator is drawn to the right of the column. Default is 0.
Built in themes are updated to define the separators.

A new style option **-columnseparatorwidth** *width* is added. Default is 1.

## Image anchor for tree

A new item option **-imageanchor** *anchor* is added.
This controls the placement of the image relative to the text in an
item's tree column. Default is "w".
For tags, **-imageanchor** works like **-image**, i.e. if not set in the
item, it can be set by tags.

## Item height

A new item option **-height** *height* is added.
This controls the height of the item, in multiples of **-rowheight**. Default is 1.

## Item hiding

A new item option **-hidden** *bool* is added.
If true, the item and any of its decendants are hidden. Default is 0.

## Automatic -rowheight.

If the style does not set -rowheight, it is filled in based on current font and layout for an item.
An Item and a Cell layout is measured with the style's settings, and the resulting height is used as default.

## Cell tags.

To control appearance of individual cells, tags can be set on cells as well as items.
The set of tags is shared between items and cells, so things like **tag configure** are not
affected by this change.

Cell tags are distinct from item tags and they do not interfere except visually.
Cell tags take precedence over item tags when drawing.

A new subcommand **tag cell add** is added, mirroring the present **tag add** but operating on cells.

A new subcommand **tag cell remove** is added, mirroring the present **tag remove** but operating on cells.

A new subcommand **tag cell has** is added, mirroring the present **tag has** but operating on cells.

Cell tags are, like cell values, locked to a column number. Changes to **-columns** or  **-displaycolumns** do not affect cell tags.

Mouse events bound to a tag will trigger if the pointer is over a cell with that tag.

## Cell Images.

Through cell tags, -image and -imageanchor can be present on a cell. Cells will draw accordingly.

For items, and item tags, -image and -imageanchor are specifically about the tree column. They
do not propagate to other cell images.

# Rejected alternatives

## Striped rows

An earlier spec implemented **-striped** as an alternate state. This did not
work well, since options are resolved in a certain order. Style defaults,

Changes to tip/553.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 553: Ellipses: the Alternative to Scrolling and Wrapping
        Author:         Donal K. Fellows <[email protected]>
        State:          Draft
        Type:           Project
        Vote:           Pending
        Created:        07-Nov-2019
        Post-History:
        Tcl-Version:    8.7
        Keywords:       Tk, label, listbox, entry
-----

# Abstract

This TIP proposes a mechanism for getting Tk widgets to insert an ellipsis
instead of wrapping or scrolling (in widgets where this makes sense) a line







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 553: Ellipses: the Alternative to Scrolling and Wrapping
        Author:         Donal K. Fellows <[email protected]>
        State:          Draft
        Type:           Project
        Vote:           Pending
        Created:        07-Nov-2019
        Post-History:
        Tcl-Version:    9.1
        Keywords:       Tk, label, listbox, entry
-----

# Abstract

This TIP proposes a mechanism for getting Tk widgets to insert an ellipsis
instead of wrapping or scrolling (in widgets where this makes sense) a line

Changes to tip/554.md.

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
# TIP 554: Library file system for Tcl and Tk core using an C-based VFS
	Author:         Sean Woods <[email protected]>
	Author:         Roy Keene
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        14-Nov-2019
	Tcl-Version:	8.6
	Post-History:
	Tcl-Branch:     tip-554
-----

# Abstract

This tip proposes storing the /library file systems for both the Tcl core and Tk core
as C data structures presented as a virtual file system.

# Rationale

In Tip430 we explored the various issues with integrating a Zip based file system into
interpreter initialization. While this process is finished and largely working, there
are some awkward workarounds to manage the process of Zipfs encoding on exotic platforms.
Some of these workaround involve forgoing the tip entirely.

While the use of Zipfs as the VFS of record seems to be somewhat controversial, performance
gains from not having to access (and explor) the local file system for every interpreter
startup are measurable.

There is also the problem of having to expose the /library system (as built) to kit builders
who have to copy it into a designated location in order for the Tcl core and Tk to start







|











|


|







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
# TIP 554: Library file system for Tcl and Tk core using an C-based VFS
	Author:         Sean Woods <[email protected]>
	Author:         Roy Keene
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        14-Nov-2019
	Tcl-Version:	9.1
	Post-History:
	Tcl-Branch:     tip-554
-----

# Abstract

This tip proposes storing the /library file systems for both the Tcl core and Tk core
as C data structures presented as a virtual file system.

# Rationale

In [TIP #430](430.md) we explored the various issues with integrating a Zip based file system into
interpreter initialization. While this process is finished and largely working, there
are some awkward workarounds to manage the process of Zipfs encoding on exotic platforms.
Some of these workaround involve forgoing the TIP entirely.

While the use of Zipfs as the VFS of record seems to be somewhat controversial, performance
gains from not having to access (and explor) the local file system for every interpreter
startup are measurable.

There is also the problem of having to expose the /library system (as built) to kit builders
who have to copy it into a designated location in order for the Tcl core and Tk to start
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
not even be a consideration. For an embedded system where every byte counts, we can leave
out encodings, and that reduces the size to 2.7mb.

# Backward Compatibility

The main area for concern for Compatibility issues is Tk. Tk can be compiled against Tcl
cores of various vintages, including those which are not equipped with the features of
this tip. Because the VFS for Tk is self contained, and distributed by virtue of being
compiled into the library itself, for most users there will be no change. (Save, of course,
for the improved load time.)

Kit builders and speciality developers who provide their own library systems are still free
to populate their own values for tcl_library and tk_library and those contracts will still
be honored. The C-based VFS will only load if no other candidate to fill the role of the
/library file system has stepped forward by the time the interpreter initializes.

# Interactions with tip430

This tip only replaces the portions of tip430 dealing with interpreter initialization.
In all other respects the goals of this tip and non-startup goals of tip430 are parallel
to one another.

# Inspiration

This technology is influenced by Roy Keene's work with XVFS. It also draws on the lessons
learned from implementing tip430.

# Copyright

This document has been placed in the public domain.







|








|

|
|





|




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
not even be a consideration. For an embedded system where every byte counts, we can leave
out encodings, and that reduces the size to 2.7mb.

# Backward Compatibility

The main area for concern for Compatibility issues is Tk. Tk can be compiled against Tcl
cores of various vintages, including those which are not equipped with the features of
this TIP. Because the VFS for Tk is self contained, and distributed by virtue of being
compiled into the library itself, for most users there will be no change. (Save, of course,
for the improved load time.)

Kit builders and speciality developers who provide their own library systems are still free
to populate their own values for tcl_library and tk_library and those contracts will still
be honored. The C-based VFS will only load if no other candidate to fill the role of the
/library file system has stepped forward by the time the interpreter initializes.

# Interactions with TIP #430

This TIP only replaces the portions of [TIP #430](430.md) dealing with interpreter initialization.
In all other respects the goals of this tip and non-startup goals of TIP #430 are parallel
to one another.

# Inspiration

This technology is influenced by Roy Keene's work with XVFS. It also draws on the lessons
learned from implementing TIP #430.

# Copyright

This document has been placed in the public domain.

Changes to tip/555.md.

60
61
62
63
64
65
66




  
  
# Impact
  
* This feature gives me the opportunity to introspect my theme.
* This feature will gives me together with the other arguments of the ttk::style commands the opportunity to compare different themes.  
* This feature will also make it easier to clone a style and to modify it.  











>
>
>
>
60
61
62
63
64
65
66
67
68
69
70
  
  
# Impact
  
* This feature gives me the opportunity to introspect my theme.
* This feature will gives me together with the other arguments of the ttk::style commands the opportunity to compare different themes.  
* This feature will also make it easier to clone a style and to modify it.  

# Discussion

This TIP was withdrawn since TIP #584 provides the requested functionality.

Changes to tip/556.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 556: Add oo like widgets to Tk
	Author:         René Zaumseil <[email protected]>
	State:         	Deferred
	Type:           Project
	Vote:           Done
	Created:        26-Nov-2019
	Post-History:   
	Keywords:       Tk
	Tcl-Version:    8.7
	Tk-Branch:      tip-556
-----

**This tip is deferred because I could not find a sponsor for it.**
 
# Abstract









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 556: Add oo like widgets to Tk
	Author:         René Zaumseil <[email protected]>
	State:         	Deferred
	Type:           Project
	Vote:           Done
	Created:        26-Nov-2019
	Post-History:   
	Keywords:       Tk
	Tcl-Version:    9.0
	Tk-Branch:      tip-556
-----

**This tip is deferred because I could not find a sponsor for it.**
 
# Abstract

Changes to tip/558.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 558: Basic Configure Support for TclOO
        Author:         Donal K. Fellows <[email protected]>
        State:          Draft
        Type:           Project
        Vote:           Pending
        Created:        22-Dec-2019
        Post-History:
        Tcl-Version:    8.7
        Keywords:       Tcl, TclOO, properties
        Tcl-Branch:     tip-558
-----



|

|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 558: Basic Configure Support for TclOO
        Author:         Donal K. Fellows <[email protected]>
        State:          Final
        Type:           Project
        Vote:           Done
        Created:        22-Dec-2019
        Post-History:
        Tcl-Version:    8.7
        Keywords:       Tcl, TclOO, properties
        Tcl-Branch:     tip-558
-----

Changes to tip/560.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 560: Megawidget Configure/Property Support
        Author:         Donal K. Fellows <[email protected]>
        State:          Draft
        Type:           Project
        Vote:           Pending
        Created:        23-Jan-2020
        Post-History:
        Tcl-Version:    8.7
        Keywords:       Tk, TclOO, configuration, properties, options
        Tk-Branch:      tip-560
------

# Abstract

This TIP is a companion for [TIP #558](558.md) and builds upon the basic







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 560: Megawidget Configure/Property Support
        Author:         Donal K. Fellows <[email protected]>
        State:          Draft
        Type:           Project
        Vote:           Pending
        Created:        23-Jan-2020
        Post-History:
        Tcl-Version:    9.1
        Keywords:       Tk, TclOO, configuration, properties, options
        Tk-Branch:      tip-560
------

# Abstract

This TIP is a companion for [TIP #558](558.md) and builds upon the basic

Changes to tip/561.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 561: Add console Command to Unix
        Author:         Eric Taylor <[email protected]>
        State:          Draft
        Type:           Project
        Vote:           Pending
        Created:        23-Jan-2020
        Post-History:
        Tcl-Version:    8.7
        Keywords:       Tk
        Tk-Branch:      tip-561
-----

# Abstract

This TIP proposes that the `console` command be made an official supported







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# TIP 561: Add console Command to Unix
        Author:         Eric Taylor <[email protected]>
        State:          Draft
        Type:           Project
        Vote:           Pending
        Created:        23-Jan-2020
        Post-History:
        Tcl-Version:    9.1
        Keywords:       Tk
        Tk-Branch:      tip-561
-----

# Abstract

This TIP proposes that the `console` command be made an official supported

Changes to tip/565.md.

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# Rationale

Ticket [3437816fff](https://core.tcl-lang.org/tk/info/3437816fff) pointed out that `.canvas raise $tagOrId1 $tagOrId2` and `.canvas lower $tagOrId1 $tagOrId2` were not symmetrical in their error cases management: the former returned an error when `$tagOrId2` does not exist, but the latter did not. This was fixed in 2011 by making the latter return the same error as the former.

This change broke some software in the wild, see for instance [this Debian ticket](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=719109) or [that Tk ticket]  (https://core.tcl-lang.org/tk/tktview/3552805fff).

In the wake of the "Do nothing gracefully" reform, aka [TIP #323](https://core.tcl-lang.org/tips/doc/trunk/tip/323.md), the present TIP proposes to remove the error when calling .canvas raise/lower with a non-existent "aboveThis"/"belowThis" tag.

Note that the current behavior is inconsistent anyway:

<pre>
    package require Tk
    .c create line 0 0 10 10 -tags aline
    # inconsistent error spitting







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# Rationale

Ticket [3437816fff](https://core.tcl-lang.org/tk/info/3437816fff) pointed out that `.canvas raise $tagOrId1 $tagOrId2` and `.canvas lower $tagOrId1 $tagOrId2` were not symmetrical in their error cases management: the former returned an error when `$tagOrId2` does not exist, but the latter did not. This was fixed in 2011 by making the latter return the same error as the former.

This change broke some software in the wild, see for instance [this Debian ticket](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=719109) or [that Tk ticket]  (https://core.tcl-lang.org/tk/tktview/3552805fff).

In the wake of the "Do nothing gracefully" reform, aka [TIP #323](https://core.tcl-lang.org/tips/doc/main/tip/323.md), the present TIP proposes to remove the error when calling .canvas raise/lower with a non-existent "aboveThis"/"belowThis" tag.

Note that the current behavior is inconsistent anyway:

<pre>
    package require Tk
    .c create line 0 0 10 10 -tags aline
    # inconsistent error spitting

Changes to tip/567.md.

1
2
3
4
5




6
7
8
9
10
11
12
# TIP 567: Add Operation to Support Set-like Slots
        Author:         Donal K. Fellows <[email protected]>
        State:          Draft
        Type:           Project
        Vote:           In progress




        Created:        22-Feb-2020
        Post-History:
        Tcl-Version:    8.7
        Keywords:       Tcl, TclOO, slots
        Tcl-Branch:     tip-567
-----



|

|
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 567: Add Operation to Support Set-like Slots
        Author:         Donal K. Fellows <[email protected]>
        State:          Final
        Type:           Project
        Vote:           Done
        Vote-Summary:   4/0/2
        Votes-For:      DF, JN, MC, KW
        Votes-Against:  none
        Votes-Present:  DP,SL
        Created:        22-Feb-2020
        Post-History:
        Tcl-Version:    8.7
        Keywords:       Tcl, TclOO, slots
        Tcl-Branch:     tip-567
-----

Changes to tip/568.md.

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
# TIP 568: Revise ByteArray Routines To Support Proper Value Extraction
	Author:         Don Porter <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        4-Mar-2020
	Post-History:
	Keywords:       bytearray
	Tcl-Version:    9.0
	Tcl-Branch:	dgp-properbytearray





-----

# Abstract

PLEASE HOLD YOUR COMMENTS WHILE UNDER CONSTRUCTION.

This TIP revises the public routines **Tcl_GetByteArrayObj** and
**Tcl_SetByteArrayLength** to signal an error when they are passed
an _objPtr_ that does not contain a valid byte sequence.



# Background

It is a convention of the Tcl C interface to have routines with names
like **Tcl_GetFooFromObj**. Their purpose is to extract a value in
the _foo_ representation from a (*Tcl_Obj* _*_) argument. The caller
should then be able to process the extracted _foo_ value 


|

|




|
>
>
>
>
>




<
<
|
|
|
>
>







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
# TIP 568: Revise ByteArray Routines To Support Proper Value Extraction
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        4-Mar-2020
	Post-History:
	Keywords:       bytearray
	Tcl-Version:    9.0
	Tcl-Branch:     dgp-properbytearray
	Tcl-Branch:     tip-568
	Vote-Summary:   Accepted 6/0/1
	Votes-For:      DP, KK, JN, SL, AK, KW
	Votes-Against:  none
	Votes-Present:  FV
-----

# Abstract



This TIP proposes revision of the public routines **Tcl_GetByteArrayFromObj**
and **Tcl_SetByteArrayLength** to signal an error when they are passed
an _objPtr_ that does not contain a valid byte sequence, starting with
Tcl 9.0.  It also proposes a new routine **Tcl_GetBytesFromObj** to
provide robust bytearray use in Tcl 8.7.

# Background

It is a convention of the Tcl C interface to have routines with names
like **Tcl_GetFooFromObj**. Their purpose is to extract a value in
the _foo_ representation from a (*Tcl_Obj* _*_) argument. The caller
should then be able to process the extracted _foo_ value 
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
> _int_ **Tcl_GetFooFromObj**(*Tcl_Interp* _*_, *Tcl_Obj* _*_, ..., _foo *_);

is used when the *foo* representation is of fixed size that is not too large.
The _int_ return allows for returning **TCL_ERROR** when no valid *foo*
can be extracted. The *Tcl_Interp* is provided to receive standardized
error messages and codes on failure.  The final output argument is a pointer
to space where the extracted *foo* value may be written. The value written
is now the possession of the caller, generated by the routine, possibly by
making a copy of something stored in the *Tcl_Obj*.  This pattern is followed
in the cases where **Foo** is **Boolean**, **Bignum**, **Double**,
**Encoding**, **Index**, **Int**, **Long**, or **WideInt**. (See also
private routines where **Foo** is **Channel**, **Number**, **CompletionCode**,
**WideBits**, or **Namespace**.)

The second pattern,







|







39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
> _int_ **Tcl_GetFooFromObj**(*Tcl_Interp* _*_, *Tcl_Obj* _*_, ..., _foo *_);

is used when the *foo* representation is of fixed size that is not too large.
The _int_ return allows for returning **TCL_ERROR** when no valid *foo*
can be extracted. The *Tcl_Interp* is provided to receive standardized
error messages and codes on failure.  The final output argument is a pointer
to space where the extracted *foo* value may be written. The value written
is now in the possession of the caller, generated by the routine, possibly by
making a copy of something stored in the *Tcl_Obj*.  This pattern is followed
in the cases where **Foo** is **Boolean**, **Bignum**, **Double**,
**Encoding**, **Index**, **Int**, **Long**, or **WideInt**. (See also
private routines where **Foo** is **Channel**, **Number**, **CompletionCode**,
**WideBits**, or **Namespace**.)

The second pattern,
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
structures of Tcl, which may need management with reference counting,
memory preservation, and/or maintaining a claim on the original *Tcl_Obj*.
This pattern is followed in the cases where **Foo** is **RegExp**
or **Command**. (See also private routine where **Foo** is **Lambda**.)

The final pattern,

> _foo_ **Tcl_GetFooFromObj**(*Tcl_Obj* _*_, _int *_);

is used when the returned *foo* is a pointer value pointing into
an array stored within Tcl's own structures.  It is implicit in the
structure of the interface that it is presumed this extraction cannot
fail. Thus there is no need to arrange for an interpreter to receive
error messages or codes. The caller is instructed that the return value
need not be checked for **NULL**. The final output argument is a pointer to
space where the length of the *foo* array returned may be written.


Documentation must be consulted to determine the conditions under which
the caller may read, or even write to that array. This pattern is
followed in the cases where **Foo** is **String**, **Unicode**,
or **ByteArray**.

Again it must be understood that all of these routines have value only
so far as they produce a *foo* value that the caller can use in the place
of operating directly on the *Tcl_Obj*.  Experience has proven that
the existing specification of the routine **Tcl_GetByteArrayFromObj**
fails that test.

# History and Rationale


Starting with release 8.1, Tcl string values were composed of
characters from an international character set. Each string was conceived
as a sequence of characters from UCS-2.  Each routine that accepts a string
as a *char* array, and the string representation of a *Tcl_Obj* both expect
to store a UCS-2 sequence in a Modified UTF-8 encoding.  (For release 8.7,
We are in working on extending the Tcl character set from UCS-2 to all of
Unicode, but that will not change the two facts that are important here:
(1) For reliable binary transfer, we can no longer simply write arbitrary bytes
to a string representation; (2) General Tcl strings contain characters
with codepoints outside the byte range.)

The rules for encoding string values in Tcl 8.1+ created the need for a new
mechanism to accept, transmit, store, and produce arbitrary binary values,
preferably while minimizing the need to convert to other representations.
The _bytearray_ **Tcl_ObjType** was created to address this need. The
routine **Tcl_NewByteArrayObj** stores an arbitrary byte sequence in
a *Tcl_Obj*.  The routine **Tcl_GetByteArrayFromObj** can then retrieve
that same byte sequence.  When the string representation of such a value is
needed, each byte (with value from 0-255) in the sequence is treated
as the corresponding UCS-2 codepoint (U+0000 - U+00FF), and that
UCS-2 sequence is encoded in Modified UTF-8 in the usual way.  This
strategy permits all byte sequences to be encoded in a subset of
Tcl string values. 

When **Tcl_GetByteArrayFromObj** is called on a value where no byte sequence
has been stored, a byte sequence is generated from the string representation.
When the string is in the subset of strings that can be produced by encoding
byte sequences, the decoding is clear. For other string values, those that
contain at least one codepoint greater than U+00FF, it was decided
that any larger codepoint in the string value would have its high
bits stripped away, and be decoded based on the contents of the low 8 bits
it contained.  Given this decision, all strings produce a byte sequence, and
**Tcl_GetByteArrayFromObj** would always return a non-NULL pointer to
a byte sequence. The routine did not need specify any mechanism
for raising errors.  This decision is the source of all the trouble.

When a caller of **Tcl_GetByteArrayFromObj** receives access to a byte
sequence, it does not know whether this is a sequence originally stored,
or one generated by transforming and possibly truncating characters from
a general Tcl string value.  This means the contents of the byte sequence
do not reliably reveal information about the value.  We could not say,
for example, what the 3rd character in the value is. At best we could
say what is left when all high bits are stripped off that character.
It is not a common need to treat all string values according to
the equivalence classes established by examining only the low-bytes of
every character.

If we supplement the call to **Tcl_GetByteArrayFromObj** with a call
to **Tcl_HasStringRep**, we might learn that the value does not have
a string representation stored within it. In that case, the value is what
we have come to call a _pure_ bytearray value. We can then be sure the byte
sequence is an original one. It did not come from a string since there is
no string.  We can then use the byte sequence as the definitive value.
This helps, but only so much.
If anything causes the string representation to be generated, we lose this
supplementary test, and we are back to being unable to use the byte sequence
at all.


This is tricky enough, callers of **Tcl_GetByteArrayFromObj** get it wrong,
even the callers within Tcl itself.  See Tcl
bugs [0e92c404f1](https://core.tcl-lang.org/tcl/info/0e92c404f1)
and [2637173](https://core.tcl-lang.org/tcl/info/2637173) and this
interactive demonstration:

<pre>
```
>	% info patchlevel







|







|
>
>






|






>
|
<
<
<
|
|
|
|
|
|








|
|
|
|
<

















|















|
>

|
|







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
structures of Tcl, which may need management with reference counting,
memory preservation, and/or maintaining a claim on the original *Tcl_Obj*.
This pattern is followed in the cases where **Foo** is **RegExp**
or **Command**. (See also private routine where **Foo** is **Lambda**.)

The final pattern,

> _foo_ **Tcl_GetFooFromObj**(*Tcl_Obj* _*_, ***SIZE*** _*_);

is used when the returned *foo* is a pointer value pointing into
an array stored within Tcl's own structures.  It is implicit in the
structure of the interface that it is presumed this extraction cannot
fail. Thus there is no need to arrange for an interpreter to receive
error messages or codes. The caller is instructed that the return value
need not be checked for **NULL**. The final output argument is a pointer to
space where the length of the *foo* array returned may be written.  The
length value written is of type ***SIZE*** which may be either *int*
or *Tcl_Size* (see [[481]](481.md)).
Documentation must be consulted to determine the conditions under which
the caller may read, or even write to that array. This pattern is
followed in the cases where **Foo** is **String**, **Unicode**,
or **ByteArray**.

Again it must be understood that all of these routines have value only
so far as they provide a *foo* value that the caller can use in the place
of operating directly on the *Tcl_Obj*.  Experience has proven that
the existing specification of the routine **Tcl_GetByteArrayFromObj**
fails that test.

# History and Rationale

In Tcl 8.0, every Tcl string value was equivalent to an arbitrary sequence
of bytes.  Starting with release 8.1, the storage and transmission of Tcl



string values were revised to use a Modified UTF-8 encoding so that a larger
number of international character sets could be supported.  This created
two important facts pertaining to arbitrary binary data:
(1) For reliable binary transfer, we could no longer simply write arbitrary
bytes to a string representation; (2) General Tcl strings may contain
characters with codepoints outside the byte range (U+0000 - U+00FF).

The rules for encoding string values in Tcl 8.1+ created the need for a new
mechanism to accept, transmit, store, and produce arbitrary binary values,
preferably while minimizing the need to convert to other representations.
The _bytearray_ **Tcl_ObjType** was created to address this need. The
routine **Tcl_NewByteArrayObj** stores an arbitrary byte sequence in
a *Tcl_Obj*.  The routine **Tcl_GetByteArrayFromObj** can then retrieve
that same byte sequence.  When the string representation of such a value is
needed, each byte (with value from 0-255) in the sequence is encoded 
as the corresponding codepoint (U+0000 - U+00FF), and that codepoint sequence
is encoded in Modified UTF-8 in the usual way.  This strategy permits all
byte sequences to be encoded in a subset of Tcl string values. 


When **Tcl_GetByteArrayFromObj** is called on a value where no byte sequence
has been stored, a byte sequence is generated from the string representation.
When the string is in the subset of strings that can be produced by encoding
byte sequences, the decoding is clear. For other string values, those that
contain at least one codepoint greater than U+00FF, it was decided
that any larger codepoint in the string value would have its high
bits stripped away, and be decoded based on the contents of the low 8 bits
it contained.  Given this decision, all strings produce a byte sequence, and
**Tcl_GetByteArrayFromObj** would always return a non-NULL pointer to
a byte sequence. The routine did not need specify any mechanism
for raising errors.  This decision is the source of all the trouble.

When a caller of **Tcl_GetByteArrayFromObj** receives access to a byte
sequence, it does not know whether this is a sequence originally stored,
or one generated by transforming and possibly truncating characters from
a general Tcl string value.  This means the contents of the byte sequence
do not reliably reveal everything about the value.  We could not say,
for example, what the 3rd character in the value is. At best we could
say what is left when all high bits are stripped off that character.
It is not a common need to treat all string values according to
the equivalence classes established by examining only the low-bytes of
every character.

If we supplement the call to **Tcl_GetByteArrayFromObj** with a call
to **Tcl_HasStringRep**, we might learn that the value does not have
a string representation stored within it. In that case, the value is what
we have come to call a _pure_ bytearray value. We can then be sure the byte
sequence is an original one. It did not come from a string since there is
no string.  We can then use the byte sequence as the definitive value.
This helps, but only so much.
If anything causes the string representation to be generated, we lose this
supplementary test, and we are back to being unable to use the byte sequence
at all, unless our usage is exactly to operate on the value according to
the equivalence classes mentioned before.

This is tricky enough that many callers of **Tcl_GetByteArrayFromObj** get
it wrong, even the callers within Tcl itself.  See Tcl
bugs [0e92c404f1](https://core.tcl-lang.org/tcl/info/0e92c404f1)
and [2637173](https://core.tcl-lang.org/tcl/info/2637173) and this
interactive demonstration:

<pre>
```
>	% info patchlevel
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
205

206



207
208
209






210



211

212




213
214



215

216



217
218
219
220
221
222
223
224
225
produced. However, this approach still loses all utility of byte array
internal representations as soon as a string representation is generated.
In Tcl 8.7, the internals have been reworked so that two distinct
**Tcl_ObjType**s are in use. One of these implements a proper byte array
**Tcl_ObjType** that rejects string values that contain any non-byte 
character. The other tolerates such strings, so that the behavior of
**Tcl_GetByteArrayFromObj** can be continued without any incompatibility.



The next evolutionary step is to incompatibly revise the documented
interface for **Tcl_GetByteArrayFromObj** so that it can return **NULL**
and so that each caller is burdened with handling that possibility.
The routine **Tcl_SetByteArrayLength** has the same concerns and should
change in the same way.

With the plan to allow extraction of bytes from a value to fail, it
becomes clear in hindsight that a routine following the second pattern
would be more appropriate, so that Tcl can offer the service of generating
a standard error message and error code.

# Specification

In Tcl 8.7, create a new public routine,

> _unsigned char *_ **Tcl_GetBytesFromObj**(*Tcl_Interp* _*_, *Tcl_Obj* _*_,  _int *_);

which attempts to extract a byte sequence representation of the value. If
the value contains any character outside the byte range, it does not have
a valid representation as a byte sequence. In that circumstance, the
value **NULL** is returned, and if the interpreter argument is not **NULL**,
standard error messages and codes are left in it. Otherwise, a pointer
to the byte sequence representation is returned (after creating it, if
necessary) and the number of bytes in the sequence is written to the
storage at the output pointer, if it is not **NULL**.










[binary scan]
[binary encode]







# Compatibility







# Scope





This TIP proposes a change to **Tcl_GetByteArrayFromObj** that is an




incompatibity in its return value.  There is also interest (see [TIP 481])
in making another incompatible change to the same routine in the type of



its final output argument. It is out of scope to merge these concerns.

They can be accompilshed as orthogonal matters in either sequence.




# Reference Implementation

See branches [dgp-properbytearray](https://core.tcl-lang.org/tcl/timeline?t=dgp-properbytearray) (9.0)
and [tip-568](https://core.tcl-lang.org/tcl/timeline?t=tip-568) (8.7).

# Copyright

This document has been placed in the public domain.







>
>
















|








|
|
>

>
>
>
>
>

>
|
|
|
>

>
>
>



>
>
>
>
>
>
|
>
>
>

>
|
>
>
>
>
|
|
>
>
>
|
>
|
>
>
>









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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
produced. However, this approach still loses all utility of byte array
internal representations as soon as a string representation is generated.
In Tcl 8.7, the internals have been reworked so that two distinct
**Tcl_ObjType**s are in use. One of these implements a proper byte array
**Tcl_ObjType** that rejects string values that contain any non-byte 
character. The other tolerates such strings, so that the behavior of
**Tcl_GetByteArrayFromObj** can be continued without any incompatibility.
This preserves as much safe utility of the type as can be achieved without an
interface incompatibility.

The next evolutionary step is to incompatibly revise the documented
interface for **Tcl_GetByteArrayFromObj** so that it can return **NULL**
and so that each caller is burdened with handling that possibility.
The routine **Tcl_SetByteArrayLength** has the same concerns and should
change in the same way.

With the plan to allow extraction of bytes from a value to fail, it
becomes clear in hindsight that a routine following the second pattern
would be more appropriate, so that Tcl can offer the service of generating
a standard error message and error code.

# Specification

In Tcl 8.7, create a new public routine,

> _unsigned char *_ **Tcl_GetBytesFromObj**(*Tcl_Interp* _*_, *Tcl_Obj* _*_,  ***SIZE*** _*_);

which attempts to extract a byte sequence representation of the value. If
the value contains any character outside the byte range, it does not have
a valid representation as a byte sequence. In that circumstance, the
value **NULL** is returned, and if the interpreter argument is not **NULL**,
standard error messages and codes are left in it. Otherwise, a pointer
to the byte sequence representation is returned (after creating it, if
necessary) and the number of bytes in the sequence is written to the
storage at the output pointer, if it is not **NULL**.  Using the techniques
from [[481]](481.md), the ***SIZE*** type holding the number of bytes may be
either *int* or *Tcl_Size* .

In Tcl 9.0, revise routines **Tcl_GetByteArrayFromObj** and
**Tcl_SetByteArrayLength** so that they return NULL whenever the value
is not a proper binary sequence.  Most callers will prefer to use
the routine **Tcl_GetBytesFromObj** instead to benefit from error message
and error code generation.

In Tcl 9.0, building on these changes in the internal supports for
arbitrary binary data, the commands **binary scan** and **binary encode**
are revised to reject arguments that are not valid binary data.  When
such a situation arises, it indicates a programming error.  These are better
detected and fixed than accommodated.

In Tcl 9.0, end registration of a **Tcl_ObjType** with the name **bytearray**.
Callers of **Tcl_GetObjType**("bytearray") must be prepared to receive
a **NULL** return value.

# Compatibility

Most callers of **Tcl_GetByteArrayFromObj** are probably buggy, at least
so far as they are not robust when operating on a value that is not
valid binary data.  If the programs are written so that invalid data
never reaches these calls, they will not experience any incompatibility.
Otherwise, the incompatibilities provide the tools needed to make the
code robust in that situation.

Most callers will want to switch to **Tcl_GetBytesFromObj** as soon as
they can start to require Tcl 8.7.  It is a better design for the job,
and it will not have futher incompatibilities when bridging into Tcl 9.

Any callers who cannot or will not adapt their code to
use **Tcl_GetBytesFromObj** will continue to have **Tcl_GetByteArrayFromObj**
that is substandard in exactly the same way it is now through all remaining
Tcl 8 releases.  Only the adoption of Tcl 9 will force them to change
their code, and that change will be nothing more than checking a return
value for **NULL**.

The incompatibilities in the values acceptable to **binary scan**
and **binary encode** in Tcl 9 will cause no trouble in well-programmed
code.  Only code that allows arbitrary strings to be passed as an argument
runs a risk of new errors, and such code is better discovered and improved.

# Addendum

After [TIP #660](660.md) was accepted, a lot of functions changed from
using size\_t to ptrdiff\_t parameters. In order to prevent confusion,
this change has been adapted in the TIP text above as well.

# Reference Implementation

See branches [dgp-properbytearray](https://core.tcl-lang.org/tcl/timeline?t=dgp-properbytearray) (9.0)
and [tip-568](https://core.tcl-lang.org/tcl/timeline?t=tip-568) (8.7).

# Copyright

This document has been placed in the public domain.

Changes to tip/57.md.

1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
# TIP 57: Move TclX's [lassign] into the Tcl Core
	Author:         Donal K. Fellows <[email protected]>
	Author:         Agnar Renolen <[email protected]>
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        30-Aug-2001
	Post-History:   
	Tcl-Version:    8.5

-----

# Abstract

This TIP proposes to move the _lassign_ command from the TclX
extension into the Tcl core to make multiple assignment a much easier
process for people.










>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# TIP 57: Move TclX's [lassign] into the Tcl Core
	Author:         Donal K. Fellows <[email protected]>
	Author:         Agnar Renolen <[email protected]>
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        30-Aug-2001
	Post-History:   
	Tcl-Version:    8.5
	Obsoletes:      170
-----

# Abstract

This TIP proposes to move the _lassign_ command from the TclX
extension into the Tcl core to make multiple assignment a much easier
process for people.

Changes to tip/570.md.

1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
# TIP 570: Gesture Support for Finger Scrolling and "Pinch to Zoom"
	Author:         Harald Oehlmann <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Done
	Created:        18-Mar-2020
	Post-History:
	Keywords:       Tk, bindings
	Tcl-Version:    8.7

-----

# Abstract

Support for the gestures "finger scroll" and "pinch to zoom" are proposed in a
platform neutral way.





|



|
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# TIP 570: Gesture Support for Finger Scrolling and "Pinch to Zoom"
	Author:         Harald Oehlmann <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        18-Mar-2020
	Post-History:
	Keywords:       Tk, bindings
	Tcl-Version:    9.0
	Tk-Branch:      pspjuth-touch
-----

# Abstract

Support for the gestures "finger scroll" and "pinch to zoom" are proposed in a
platform neutral way.

Changes to tip/572.md.

1
2
3
4
5
6
7
8
9
10
11
12
# TIP 572: Implement a mechanism to specify the procedure/lambda/method argument call types (Evaluation strategy)
	Author:         Rami Khaldi <[email protected]>
	State:          Draft
	Type:           Project
	Tcl-Version:    9.0
-----

# Abstract

The aim of this TIP is to implement a mechanism to specify the procedure call types (call by name vs. value).






|







1
2
3
4
5
6
7
8
9
10
11
12
# TIP 572: Implement a mechanism to specify the procedure/lambda/method argument call types (Evaluation strategy)
	Author:         Rami Khaldi <[email protected]>
	State:          Draft
	Type:           Project
	Tcl-Version:    9.1
-----

# Abstract

The aim of this TIP is to implement a mechanism to specify the procedure call types (call by name vs. value).


Changes to tip/573.md.

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
# TIP 573: Surrogates are invalid
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project
	Tcl-Version:    8.7
	Tcl-Branch:     tip-573
-----
# Abstract

In Tcl 8.5 and 8.6, it is possible to specify "\\uD800" as valid character, and do reasonable things with it.
Actually, U+D800 is not a valid Unicode code point, so any operation on such value is "undefined behavior".
Surrogates are only allowed when Unicode characters are stored or transmitted as UTF16, and then a single
Unicode character behaves as 2 characters in storage or on-line. However, when translating back to UTF-8,
those 2 characters have to be merged back to a single Unicode character. They are unseparatable.

Tcl has always allowed this, but it's wrong. The UtfToUtf encoder should translate all characters in
the range \\uD800 - \\uDFFF to the replacement character \\uFFFD. Also using the form \\uD800 in
scripts should always behave the same as if \\uFFFD was specified. This way, any possible 'hack'
attempt, trying to insert invalid Unicode in Tcl, can be mitigated rapidly.

One exception to this has to be made. When using the escace sequence \\uD800\\uDC00, so a valid
combination of an upper and a lower surrogate, in a script, there is no harm in translating
that to the intended Unicode code point. In Tcl 8.6 and 8.7 there is no other way than that for
specifying Emoji. Allowing this, provides a upgrade path for existing scripts handling Emoji.
Starting with Tcl 8.7, the "\\UXXXXXX" escape sequence should be used for this.

# Specification



|










|






|







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
# TIP 573: Surrogates are invalid
	Author:         Jan Nijtmans <[email protected]>
	State:          Withdrawn
	Type:           Project
	Tcl-Version:    8.7
	Tcl-Branch:     tip-573
-----
# Abstract

In Tcl 8.5 and 8.6, it is possible to specify "\\uD800" as valid character, and do reasonable things with it.
Actually, U+D800 is not a valid Unicode code point, so any operation on such value is "undefined behavior".
Surrogates are only allowed when Unicode characters are stored or transmitted as UTF16, and then a single
Unicode character behaves as 2 characters in storage or on-line. However, when translating back to UTF-8,
those 2 characters have to be merged back to a single Unicode character. They are inseparable.

Tcl has always allowed this, but it's wrong. The UtfToUtf encoder should translate all characters in
the range \\uD800 - \\uDFFF to the replacement character \\uFFFD. Also using the form \\uD800 in
scripts should always behave the same as if \\uFFFD was specified. This way, any possible 'hack'
attempt, trying to insert invalid Unicode in Tcl, can be mitigated rapidly.

One exception to this has to be made. When using the escape sequence \\uD800\\uDC00, so a valid
combination of an upper and a lower surrogate, in a script, there is no harm in translating
that to the intended Unicode code point. In Tcl 8.6 and 8.7 there is no other way than that for
specifying Emoji. Allowing this, provides a upgrade path for existing scripts handling Emoji.
Starting with Tcl 8.7, the "\\UXXXXXX" escape sequence should be used for this.

# Specification

47
48
49
50
51
52
53


54
55
56
57
# Implementation

Implementation is in branch tip-573

# Discussion

See ticket [5dabd088ee](https://core.tcl-lang.org/tcl/tktview/5dabd088ee).



# Copyright

This document has been placed in the public domain.







>
>




47
48
49
50
51
52
53
54
55
56
57
58
59
# Implementation

Implementation is in branch tip-573

# Discussion

See ticket [5dabd088ee](https://core.tcl-lang.org/tcl/tktview/5dabd088ee).

This TIP is now withdrawn, in favor of TIP #601.

# Copyright

This document has been placed in the public domain.

Changes to tip/575.md.

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
# TIP 575: Switchable Tcl\_UtfCharComplete()/Tcl\_UtfNext()/Tcl\_UtfPrev()
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project

	Tcl-Version:    8.7
	Tcl-Branch:     tip-575




-----
# Abstract

This TIP is a successor to [TIP #542](542.md), resolving a corner-case not realized at that moment.

[TIP #542](542.md) allows stub-enabled extensions to be compiled with `-DTCL_UTF_MAX=4`, still
working with Tcl compiled with `-DTCL_UTF_MAX=3`. All functions (e.g. `Tcl_UtfToUniChar`) which
use a `Tcl_UniChar`, change behavior with the value of `TCL_UTF_MAX`: If `TCL_UTF_MAX=3`,
then, supplying a 4-byte UTF-8 character to this function will return 1, and `*chPtr` will
point to a high surrogate. If `TCL_UTF_MAX=4`, then, this function will return 4, and `*chPtr`
will point to the full Unicode character. This works by supplying two different stub entries
and making a switch controlled by `TCL_UTF_MAX`.

The functions `Tcl_UtfNext()/Tcl_UtfPrev()` don't have a `Tcl_UniChar` parameter, still there's
an expected coupling with the function `Tcl_UtfToUniChar`: If `TCL_UTF_MAX=4` then we would
expect `Tcl_UtfNext()` to be able to jump forward 4 bytes, while with `TCL_UTF_MAX=3`,
`Tcl_UtfNext()` can only jump forward with maximum 3 bytes. The same for `Tcl_UtfPrev()`.

The function `Tcl_UtfCharComplete()`, which is coupled with the function `Tcl_UtfToUniChar`
(indicating if there are enough bytes available for `Tcl_UtfToUniChar()` to be called),
has the same problem. Making this function switchable has the advantage that this function
now can be used to protect calls to `Tcl_UtfNext()` too, for extensions compiled with
`TCL_UTF_MAX=3` or `TCL_UTF_MAX=4`.

# Specification

Implement new functions `Tcl_UtfCharComplete()`/`Tcl_UtfNext()`/`Tcl_UtfPrev()`, which can
jump 4 bytes forward resp. back, so it is possible to jump over UTF-8 characters > U+FFFF
in one step in stead of two.

The new `Tcl_UtfNext()`/`Tcl_UtfPrev()` functions will get their own new entries in the stub table.
So, extensions (however rare) using `Tcl_UtfNext()`/`Tcl_UtfPrev()` but compiled against Tcl 8.6
headers will keep their original behavior.

The new `Tcl_UtfCharComplete()` will behave almost identical to the old one. The only
difference is when it encounters a starting byte between 0xF0 and 0xF5: It will return
true only when at least 4 bytes are available.

If an extension is compiled with `-DTCL_UTF_MAX=4` or with `-DTCL_NO_DEPRECATED`, then
`Tcl_UtfCharComplete()` will start behaving like described in this TIP, if not then it
will behave exactly as in Tcl 8.6.

Documentation regarding `Tcl_UtfCharComplete()` is adapted, stating that this function
can now be used to protect `Tcl_UtfNext()` calls too.

# Implementation

Implementation is in branch tip-575

# Compatibility




As long as Tcl is compiled with -DTCL_UTF_MAX=3, this is fully upwards compatible.

# Copyright

This document has been placed in the public domain.


|

>


>
>
>
>





|
|
|



|










|







|
|
|


|















>
>
>
|




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
# TIP 575: Switchable Tcl\_UtfCharComplete()/Tcl\_UtfNext()/Tcl\_UtfPrev()
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Tcl-Version:    8.7
	Tcl-Branch:     tip-575
	Vote-Summary:	Accepted 3/0/0
	Votes-For:	JN, KW, SL
	Votes-Against:	none
	Votes-Present:	none
-----
# Abstract

This TIP is a successor to [TIP #542](542.md), resolving a corner-case not realized at that moment.

[TIP #542](542.md) allows stub-enabled extensions to be compiled with `-DTCL_UTF_MAX=4`, while
still working with a Tcl compiled with `-DTCL_UTF_MAX=3`. All functions (e.g. `Tcl_UtfToUniChar`)
which use a `Tcl_UniChar`, change behavior with the value of `TCL_UTF_MAX`: If `TCL_UTF_MAX=3`,
then, supplying a 4-byte UTF-8 character to this function will return 1, and `*chPtr` will
point to a high surrogate. If `TCL_UTF_MAX=4`, then, this function will return 4, and `*chPtr`
will point to the full Unicode character. This works by supplying two different stub entries
and making a switch controlled by the value of `TCL_UTF_MAX`.

The functions `Tcl_UtfNext()/Tcl_UtfPrev()` don't have a `Tcl_UniChar` parameter, still there's
an expected coupling with the function `Tcl_UtfToUniChar`: If `TCL_UTF_MAX=4` then we would
expect `Tcl_UtfNext()` to be able to jump forward 4 bytes, while with `TCL_UTF_MAX=3`,
`Tcl_UtfNext()` can only jump forward with maximum 3 bytes. The same for `Tcl_UtfPrev()`.

The function `Tcl_UtfCharComplete()`, which is coupled with the function `Tcl_UtfToUniChar`
(indicating if there are enough bytes available for `Tcl_UtfToUniChar()` to be called),
has the same problem. Making this function switchable has the advantage that this function
now can be used to protect calls to `Tcl_UtfNext()` too, for extensions compiled with
whatever value of `TCL_UTF_MAX`.

# Specification

Implement new functions `Tcl_UtfCharComplete()`/`Tcl_UtfNext()`/`Tcl_UtfPrev()`, which can
jump 4 bytes forward resp. back, so it is possible to jump over UTF-8 characters > U+FFFF
in one step in stead of two.

The new `Tcl_UtfNext()`/`Tcl_UtfPrev()` functions will get their own new entries in the
stub table. So, extensions (however rare) using `Tcl_UtfNext()`/`Tcl_UtfPrev()` but
compiled against Tcl 8.6 headers will keep their original behavior.

The new `Tcl_UtfCharComplete()` will behave almost identical to the old one. The only
difference is when it encounters a starting byte between 0xF0 and 0xF5: Then it will return
true only when at least 4 bytes are available.

If an extension is compiled with `-DTCL_UTF_MAX=4` or with `-DTCL_NO_DEPRECATED`, then
`Tcl_UtfCharComplete()` will start behaving like described in this TIP, if not then it
will behave exactly as in Tcl 8.6.

Documentation regarding `Tcl_UtfCharComplete()` is adapted, stating that this function
can now be used to protect `Tcl_UtfNext()` calls too.

# Implementation

Implementation is in branch tip-575

# Compatibility

As long as Tcl and/or extensions are both compiled with `-DTCL_UTF_MAX=3` (which is
the default in Tcl 8.x) or `-DTCL_UTF_MAX=4` (as in Tcl 9.x), nothing changes.
The difference can only be noted in extensions which are compiled using a different
`TCL_UTF_MAX` value than Tcl.

# Copyright

This document has been placed in the public domain.

Changes to tip/576.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 576: Poor-mans Table listbox enhancement
	Author:         Brian Griffin <[email protected]>
	State:          Draft
	Type:           Project
	Created:        25-May-2020
	Post-History:   
	Keywords:       Tk listbox
	Tcl-Version:    8.7
	Tk-Version:     8.7
-----

# Abstract

Make a small enhancement to the listbox widget to allow convient viewing of a list of lists, as a 2d-table.

# Rationale







|
<







1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
# TIP 576: Poor-mans Table listbox enhancement
	Author:         Brian Griffin <[email protected]>
	State:          Draft
	Type:           Project
	Created:        25-May-2020
	Post-History:   
	Keywords:       Tk listbox
	Tcl-Version:    9.1

-----

# Abstract

Make a small enhancement to the listbox widget to allow convient viewing of a list of lists, as a 2d-table.

# Rationale

Changes to tip/577.md.

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
# TIP 577: Enhanced index values for Tk
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project

	Created:        8-June-2020
	Post-History:   
	Keywords:       Tcl index
	Tcl-Version:    8.7
	Tk-Branch:      strict-index




-----

# Abstract

Various commands handle errors in "index" values differently. This TIP attempts
to treat the different uses of index values in Tk to a more uniform way, align
them better with index usage in Tcl.

The main feature of this TIP is to let Tk indices handle all forms of Tcl indices.
So "4+5" and "end-1" will now be accepted, just as any other form accepted by
`Tcl_GetIntFormIndex()` (See also TIP #544).

In addition, the empty string is accepted in Tk as valid index. It means the same
as `-1` so _not available_. In Tk this is more natural, since the default of many
options is already the empty string. The default value of the `-underline` option
so because the empty string, and setting `-underline` to the empty string means
no underlining. This default value change will be only done when Tk is compiled
with Tk 9.0 headers, in order to give applications more time to adapt to this
usage (see _Compatibility_ section below).

# Rationale

Some examples (Tk):
<pre>
$ wish8.6
% listbox .l
% menu .m
% .l index 0
0
% .l index none
bad listbox index "none": must be active, anchor, end, @x,y, or a number
% .m index none
none
% .m index 0
none
% .m index foo
bad menu entry index "foo"
</pre>

We see that menu's have a different way to indicate 'not found' compared to other widgets.

A request is done already a long time ago, to make index handling in Tk more flexible.
See:  [`widgets indices enhancement`](https://core.tcl-lang.org/tk/tktview?name=1ef1ae2177)
This TIP implements part of this request (only the `active-int` form is not implemented.


# Specification

  * Tk indices (e.g. the value of the `-underline` option) will accept all forms
    accepted by `Tcl_GetIntFromIndex()`, and also the empty string meaning _not available_.
    So `-underline end-1` means underline one character before the last one of the string.

  * Indices in menu's, which currently use `none` as default, will be changed to use
    the empty string as default. The use of `none` in menu's is now considered
    deprecated, but still supported as long as Tk is compiled with Tcl 8.x headers.
  * Start accepting the empty string as index for entries, listboxes, menus .....
    just as for button and menu-related `-underline` options. A new `TK_OPTION_INDEX`
    option is implemented, which is almost the same as `TK_OPTION_INT`, but in stead
    of only integers, accepts all those index forms as well. 
  * When Tk is compiled with Tcl 9 headers, the default `-underline` value becomes
    the empty string in stead of -1. When compiled with Tcl 8 headers, `-1` is still
    the default.
  * When Tk is compiled with Tcl 9 headers, all commands which currently report
    _not available_ as `-1`, will start returning the empty string in stead.

# Compatibility

When compiled with Tcl 8.x headers, this is almost 100% compatible. Except for
menu commands which currently use the inconsistent `none` keyword (see above example)
they will start returning the empty string.

Code can easily be made compatible in any environment. Just don't check against
the value `-1` any more, but use the `< 0` check: Since comparing the empty
string with `0` in Tcl uses string compare, it gives the same result as
comparing `-1` with `0`. All Tk utilities and demo's are already modified to
do this check consistently.

# Implementation

See the [`strict-index`](https://core.tcl-lang.org/tk/timeline?r=strict-index) branch.

# Copyright

This document has been placed in the public domain.


|

>




|
>
>
>
>















|

|











|

|



<
<


|



|





|
|
>








|








|

|
|
|





|




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
# TIP 577: Enhanced index values for Tk
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        8-June-2020
	Post-History:   
	Keywords:       Tcl index
	Tcl-Version:    8.7
	Tk-Branch:      enhanced-index
	Vote-Summary    Accepted 5/0/1
	Votes-For:      BG, JN, KW, MC, SL 
	Votes-Against:  none
	Votes-Present:  KBK
-----

# Abstract

Various commands handle errors in "index" values differently. This TIP attempts
to treat the different uses of index values in Tk to a more uniform way, align
them better with index usage in Tcl.

The main feature of this TIP is to let Tk indices handle all forms of Tcl indices.
So "4+5" and "end-1" will now be accepted, just as any other form accepted by
`Tcl_GetIntFormIndex()` (See also TIP #544).

In addition, the empty string is accepted in Tk as valid index. It means the same
as `-1` so _not available_. In Tk this is more natural, since the default of many
options is already the empty string. The default value of the `-underline` option
becomes the empty string. Setting `-underline` to the empty string means
no underlining. This default value change will be only done when Tk is compiled
with Tcl 9 headers, in order to give applications more time to adapt to this
usage (see _Compatibility_ section below).

# Rationale

Some examples (Tk):
<pre>
$ wish8.6
% listbox .l
% menu .m
% .l index 0
0
% .l index none _(listbox doesn't know about `none`)_
bad listbox index "none": must be active, anchor, end, @x,y, or a number
% .m index none _(menu does know about `none`)_
none
% .m index 0
none


</pre>

We see that menu's have a different way to indicate _not available_ compared to other widgets.

A request is done already a long time ago, to make index handling in Tk more flexible.
See:  [`widgets indices enhancement`](https://core.tcl-lang.org/tk/tktview?name=1ef1ae2177)
This TIP implements part of this request (only the `active-<integer>` form is not implemented.


# Specification

  * Tk indices (e.g. the value of the `-underline` option) will accept all forms
    accepted by `Tcl_GetIntFromIndex()`, and also the empty string. So
    `-underline end-1` means underline one character before the last one of the
    string. `-underline {}` means no underlining, the same as `-underline -1`.
  * Indices in menu's, which currently use `none` as default, will be changed to use
    the empty string as default. The use of `none` in menu's is now considered
    deprecated, but still supported as long as Tk is compiled with Tcl 8.x headers.
  * Start accepting the empty string as index for entries, listboxes, menus .....
    just as for button and menu-related `-underline` options. A new `TK_OPTION_INDEX`
    option is implemented, which is almost the same as `TK_OPTION_INT`, but in stead
    of only integers, accepts all those index forms as well. 
  * When Tk is compiled with Tcl 9 headers, the default `-underline` value becomes
    the empty string in stead of `-1`. When compiled with Tcl 8 headers, `-1` is still
    the default.
  * When Tk is compiled with Tcl 9 headers, all commands which currently report
    _not available_ as `-1`, will start returning the empty string in stead.

# Compatibility

When compiled with Tcl 8.x headers, this is almost 100% compatible. Except for
menu commands which currently use the inconsistent `none` keyword (see above example)
they will start using the empty string in stead (but `none` still works in Tcl 8.x).

Code can easily be made working in both Tcl 8.x and 9.x environments. Just don't
check against the value `-1` any more, but use the `< 0` check: Since comparing the
empty string with `0` in Tcl uses string compare, it gives the same result as
comparing `-1` with `0`. All Tk utilities and demo's are already modified to
do this check consistently.

# Implementation

See the [`enhanced-index`](https://core.tcl-lang.org/tk/timeline?r=enhanced-index) branch.

# Copyright

This document has been placed in the public domain.

Changes to tip/579.md.

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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232












233
234
235
236
237
238
239
240
241
242
# TIP 579: Improved auto_path for Safe Base interpreters
	Author:         Keith Nash <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        07-Jul-2020
	Version:        25-Jul-2020
	Post-History:
	Tcl-Version:    8.7
	Keywords:       safe interp auto_path access_path
	Tcl-Branch:     tip-579-8-7




------

# Abstract


This TIP proposes modifying the Safe Base to give users the option of defining the ::auto\_path in a Safe Base interpreter to conform to the specification given in *pkg_mkIndex\(n\)* and *library\(n\)*.  The default is to preserve the existing behavior of the Safe Base, in which the ::auto\_path includes a large number of additional directories.


# Rationale

A Safe Base interpreter is a safe slave interpreter that can apply the commands **load** and **source** to files in certain directories specified by its master interpreter.  The list of those directories is called the *access path* and is recorded in the master interpreter.  In the Safe Base slave, each directory of the *access path* is represented by a token of the form $p\(:34:\) which includes a literal dollar character and an integer.  A filename can be composed as, for example, \[**file join** {$p\(:34:\)} pkgIndex.tcl\].  The Safe Base interpreter uses modified **source** and **load** commands that convert a filename rooted at an *access path* token to a real filename.  The tclIndex autoloader, **package** command, and **tcl::tm** command in Safe Base interpreters are compatible with such tokenized filenames.

The *access path* comprises the directories of the requested ::auto\_path and all their children, and the directories of the module path \[**tcl::tm::list**\] and all their descendants.

In a Safe Base interpreter, the value of ::auto\_path is currently set to the tokenized *access path*, rather than to a tokenized form of the usual definition given by *pkg_mkIndex\(n\)* and *library\(n\)*.  This feature, not documented in *safe\(n\)*, allowed **package** to work correctly despite the absence of the **glob** command in a Safe Base interpreter.  The value of ::auto\_path is synchronized with the tokenized *access path* whenever the latter is changed by a **safe::\*** command in the master interpreter.

When **tcl::tm** facilities were added to Tcl, a restricted form of **glob** was added to Safe Base interpreters.  This new **glob** command allows **package** to operate correctly when ::auto\_path conforms to the specification in *pkg_mkIndex\(n\)* and *library\(n\)*.  However, the Safe Base still defines the ::auto\_path to be equal to the tokenized *access path*, and as a result it lists a large number of directories that are used by **tcl::tm**, and have nothing to do with the purpose of ::auto\_path - seeking pkgIndex.tcl or tclIndex files.  This feature is unhelpful when debugging, because the list of directories in the *access path* can be very long.


# Proposed Change

\(a\) A new exported command **safe::setSyncMode**

\(b\) A new option for Safe Base interpreters, -autoPath, defined under certain conditions explained below.

\(c\) Revised behavior for the commands that can alter the *access path*, i.e. **safe::interpCreate**, **safe::interpInit**, **safe::interpConfigure**, and **safe::interpAddToAccessPath**.

The new command is

**safe::setSyncMode ?newValue?**

When an argument is supplied, the command returns an error in two cases: \(a\) if the argument is not a boolean value; \(b\) if any Safe Base interpreters exist.

Otherwise, the command is an accessor for a new namespace variable safe::AutoPathSync.  Normal return supplies the value of this variable.  The value is initialized when the file tcl8.6/safe.tcl is sourced by the autoloader.

The value \[**safe::setSyncMode**\] controls the behavior of all Safe Base interpreters, and can be changed only when no Safe Base interpreters are defined.  Typically the value will be set as part of initialization.

When \[**safe::setSyncMode**\] is true, the behavior is the same as in current Tcl.  The Safe Base interpreter's ::auto\_path is defined as a tokenized form of the *access path*.  Operations that change the Safe Base interpreter's *access path* also change its value of ::auto\_path.

When \[**safe::setSyncMode**\] is false, ::auto\_path is defined to fulfil the requirements of *pkg_mkIndex\(n\)* and *library\(n\)* only.  It is not modified when the *access path* changes, except by operations that give the slave default paths derived from those of its master - in these cases the slave's ::auto\_path is set to a tokenized form of the master's ::auto\_path.

When \[**safe::setSyncMode**\] is false, each Safe Base interpreter is given a new option "-autoPath" which can be used with the commands **safe::interpCreate**, **safe::interpInit**, and **safe::interpConfigure** in the same way as other options.  The -autoPath option is undefined when \[**safe::setSyncMode**\] is true, permitting 100% compatibility with the existing Tcl Safe Base.

In order to implement this new definition of ::auto\_path in a Safe Base interpreter, some changes must be made to the behavior of existing Safe Base commands when \[**safe::setSyncMode**\] is false.  These changes are specified below.


# Specification and Examples

The commands that can alter the *access path* are **safe::interpCreate**, **safe::interpInit**, **safe::interpConfigure**, and **safe::interpAddToAccessPath**.  The effects of these commands on the *access path* and ::auto\_path are described below, including the changes that are proposed by this TIP.

In this section:

* The *Existing Case* is defined to mean Tcl either in its current form, or with this TIP implemented and with \[**safe::setSyncMode**\] true.
* The *Extra Case* is defined to mean Tcl with this TIP implemented and with \[**safe::setSyncMode**\] false.  The differences from the *Existing Case* are the changes proposed by this TIP.
* Code Examples are given for the *Extra Case*.

The effects of options -accessPath and -autoPath on the value of the slave's ::auto_path can be expressed in four rules, with a fifth rule for the command  **safe::interpAddToAccessPath**.

\(1\) Calling **safe::interpCreate**, **safe::interpInit**, or **safe::interpConfigure** with an option/value pair for -autoPath.

* *Existing Case*
  * The option -autoPath is undefined.  The command will raise an error.
* *Extra Case*
  * The presence of the "-autoPath value" arguments has no effect on the *access path*.
  * The command applies option -autoPath *after* it determines the value of *access path* from the other arguments.
  * The command will set the slave's ::auto\_path to a tokenized form of the specified value.

\(2\) Calling **safe::interpCreate** or **safe::interpInit** without the option -accessPath, or with -accessPath {}; or calling **safe::interpConfigure** with -accessPath {}.

* This remains the most convenient way to initialize a Safe Base interpreter.
* Each command sets the *access path* to the master interpreter's ::auto\_path and its children, and then appends the directories of \[**tcl::tm::list**\] and their descendants.
* Each command sets the slave's \[**tcl::tm::list**\] to a tokenized form of the master's \[**tcl::tm::list**\].
* *Existing Case*
  * Each command sets ::auto\_path to the tokenized *access path*.
* *Extra Case*
  * If the option -autoPath is specified, the slave's ::auto\_path is determined by rule \(1\).
  * If the option -autoPath is not specified, each command sets the slave's ::auto\_path to a tokenized form of the master's ::auto\_path.

Examples of calls to commands **safe::\*** that belong to this category are:

<pre>
        safe::interpCreate foo
        safe::interpCreate foo -accessPath {}
        safe::interpInit bar
        safe::interpInit bar -accessPath {}
        safe::interpConfigure foo -accessPath {}
</pre>

\(3\) Calling **safe::interpCreate**, **safe::interpInit**, or **safe::interpConfigure** with a non-empty value of -accessPath.

Each such command:

* Sets the *access path* to the requested value, then appends \[**tcl::tm::list**\] and its descendants.
* Sets the slave's \[**tcl::tm::list**\] to a tokenized form of the master's \[**tcl::tm::list**\].
* *Existing Case*
  * Sets the slave's ::auto\_path to the tokenized *access path*.
* *Extra Case*
  * If option -autoPath is also present, the slave's ::auto\_path is determined by rule \(1\).
  * If the option -autoPath is not specified, commands **safe::interpCreate** and **safe::interpInit** each set the slave's ::auto\_path to {}.
  * If the option -autoPath is not specified, command **safe::interpConfigure** leaves the slave's ::auto\_path unchanged.

e.g.

<pre>
        safe::interpCreate foo -accessPath {
            /usr/local/TclHome/lib/tcl8.6
            /usr/local/TclHome/lib/tcl8.6/http1.0
            /usr/local/TclHome/lib/tcl8.6/opt0.4
            /usr/local/TclHome/lib/tcl8.6/msgs
            /usr/local/TclHome/lib/tcl8.6/encoding
            /usr/local/TclHome/lib
        }

        # The slave's ::auto_path must be given a suitable value:

        safe::interpConfigure foo -autoPath {
            /usr/local/TclHome/lib/tcl8.6
            /usr/local/TclHome/lib
        }

        # The two commands can be combined:

        safe::interpCreate foo -accessPath {
            /usr/local/TclHome/lib/tcl8.6
            /usr/local/TclHome/lib/tcl8.6/http1.0
            /usr/local/TclHome/lib/tcl8.6/opt0.4
            /usr/local/TclHome/lib/tcl8.6/msgs
            /usr/local/TclHome/lib/tcl8.6/encoding
            /usr/local/TclHome/lib
        } -autoPath {
            /usr/local/TclHome/lib/tcl8.6
            /usr/local/TclHome/lib
        }
</pre>

\(4\) Other calls of command **safe::interpConfigure** with option/value pairs.

The only case not covered by rules \(1\) to \(3\) is call to **safe::interpConfigure** with neither option -accessPath nor -autoPath.  Such a call does not alter either the *access path* or the ::auto\_path.

\(5\) Calling **safe::interpAddToAccessPath**.

* The command appends a directory to the slave's existing *access path*.
* It does not change the slave's \[**tcl::tm::list**\].
* *Existing Case*
  * It sets ::auto\_path to the tokenized *access path*
* *Extra Case*
  * It does not change the slave's ::auto\_path.

e.g.

* The example code below can be appended to the example code
that defines the interpreter foo in rule \(3\) above.
* In the *Extra Case* only, the slave's auto_path must be
modified to allow the interpreter to use the Img package.

<pre>
        safe::interpAddToAccessPath foo /usr/local/TclHome/lib/extras/Img1.4.11

        lassign [safe::interpConfigure foo -autoPath] DUM slaveAutoPath
        lappend slaveAutoPath /usr/local/TclHome/lib/extras/Img1.4.11
        safe::interpConfigure foo -autoPath $slaveAutoPath
</pre>

* In the examples below, no change is needed to ::auto_path, either
because the existing value allows access to the new package
directories, or because the added directories (e.g. timezone data)
do not concern packages.

<pre>
        safe::interpAddToAccessPath foo /usr/local/TclHome/lib/sqlite3.30.1.2

        foreach dir {
            tzdata
            tzdata/Africa
            ...
            tzdata/US
        } {
            safe::interpAddToAccessPath foo /usr/local/TclHome/lib/tcl8.6/$path
        }
</pre>

**Summary of Specification**

* *Existing Case*
  * Safe Base commands set the slave's ::auto\_path to the tokenized *access path*.
  * Advantages: the caller need not be concerned with the slave's ::auto\_path.
  * Disadvantages: does not conform to *pkg_mkIndex\(n\)* and *library\(n\)*; the slave's ::auto\_path includes many directories that do not belong in the search path for pkgIndex.tcl or tclIndex files; the list of directories is very long and this is unhelpful when debugging.
* *Extra Case*
  * The commands in rule \(2\) set the slave's ::auto\_path to a tokenized form of the master interpreter's.
  * When other commands change the *access path*, the caller is responsible for making any necessary changes to the slave's ::auto\_path.  The new -autoPath option simplifies this task.

# Discussion

Because this TIP adds a new option -autoPath, it must go into detail about the interplay between -autoPath and -accessPath, especially when values are changed by **safe::interpConfigure**.  This leads to a fairly lengthy consideration of multiple cases (above).

When writing tests for the reference implementation, many bugs were discovered in the existing Safe Base code, most especially in handling changes of options by **safe::interpConfigure**.  It is hard to avoid the conclusion that (like the present author) most users create a Safe Base interpreter with the properties that they want, and seldom if ever need to call **safe::interpConfigure**.

In this usage case, the entirety of the TIP's specification is greatly simplified:

> **Typical Use**

> In many cases, the properties of a Safe Base interpreter can be specified when the interpreter is created, and then left unchanged for the lifetime of the interpreter.

> If you wish to use Safe Base interpreters with "Sync Mode" off, evaluate the command

> <pre>
>        safe::setSyncMode 0
> </pre>

> Use **safe::interpCreate** or **safe::interpInit** to create an interpreter with the properties that you require.  The simplest way is not to specify -accessPath or -autoPath, which means the safe interpreter will use the same paths as the master interpreter.  However, if -accessPath is specified, then -autoPath must also be specified, or else it will be set to {}.

> The value of -autoPath is that required to access tclIndex and pkgIndex.txt files according to the same rules as an unsafe interpreter (see pkg_mkIndex(n) and library(n)).

> With "Sync Mode" on (the default), the option -autoPath is undefined, and
the Safe Base sets the safe interpreter's ::auto\_path to a tokenized form of the
*access path*. In addition to the directories present if "Safe Mode" is off,
the ::auto\_path includes the numerous subdirectories and module paths
that belong to the *access path*.


# Reference Implementation

Branch TIP-579-8-7 in the public fossil repository for Tcl.













# Compatibility

The default value of \[**safe::setSyncMode**\] is 1.  The new interpreter option -autoPath is undefined in this case.  All existing code will behave in the same way as before.

If desired, the default value of \[**safe::setSyncMode**\] could be changed to 0 at a future major revision of Tcl.

# Copyright

This document has been placed in the public domain.


|

|

|




>
>
>
>




>
|
>



|



|


















|





|
















|








|




|
|



|
|
















|

|

|
|
|





|
|
|
|
<



|


|






|
|
|
|
<


|






|



|
|



|





|





|
|
|
















|






|
|
|

|
|



















|

|










|
>
>
>
>
>
>
>
>
>
>
>
>



|

|




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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
# TIP 579: Improved auto_path for Safe Base interpreters
	Author:         Keith Nash <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        07-Jul-2020
	Version:        31-Aug-2022
	Post-History:
	Tcl-Version:    8.7
	Keywords:       safe interp auto_path access_path
	Tcl-Branch:     tip-579-8-7
	Vote-Summary:   Accepted 3/0/0
	Votes-For:      JN, KBK, SL
	Votes-Against:  none
	Votes-Present:  none
------

# Abstract

This TIP proposes modifying the Safe Base to give users the *option* of defining the ::auto\_path in a Tcl 8.7 Safe Base interpreter to conform to the specification given in *pkg_mkIndex\(n\)* and *library\(n\)*.  The TIP's *default* is to preserve the existing behavior of the Safe Base, in which the ::auto\_path includes a large number of additional directories.  This choice of default will be changed in Tcl 9.0.

This TIP considers the multiple configuration options of a Safe Base interpreter, notably when these options are changed by **safe::interpConfigure**.  However, in typical use the configuration is defined at interpreter creation and remains unchanged for the lifetime of the interpreter.  In this case a much simpler analysis is possible (see section *Discussion*).

# Rationale

A Safe Base interpreter is a safe child interpreter that can apply the commands **load** and **source** to files in certain directories specified by its parent interpreter.  The list of those directories is called the *access path* and is recorded in the parent interpreter.  In the Safe Base child, each directory of the *access path* is represented by a token of the form $p\(:34:\) which includes a literal dollar character and an integer.  A filename can be composed as, for example, \[**file join** {$p\(:34:\)} pkgIndex.tcl\].  The Safe Base interpreter uses modified **source** and **load** commands that convert a filename rooted at an *access path* token to a real filename.  The tclIndex autoloader, **package** command, and **tcl::tm** command in Safe Base interpreters are compatible with such tokenized filenames.

The *access path* comprises the directories of the requested ::auto\_path and all their children, and the directories of the module path \[**tcl::tm::list**\] and all their descendants.

In a Safe Base interpreter, the value of ::auto\_path is currently set to the tokenized *access path*, rather than to a tokenized form of the usual definition given by *pkg_mkIndex\(n\)* and *library\(n\)*.  This feature, not documented in *safe\(n\)*, allowed **package** to work correctly despite the absence of the **glob** command in a Safe Base interpreter.  The value of ::auto\_path is synchronized with the tokenized *access path* whenever the latter is changed by a **safe::\*** command in the parent interpreter.

When **tcl::tm** facilities were added to Tcl, a restricted form of **glob** was added to Safe Base interpreters.  This new **glob** command allows **package** to operate correctly when ::auto\_path conforms to the specification in *pkg_mkIndex\(n\)* and *library\(n\)*.  However, the Safe Base still defines the ::auto\_path to be equal to the tokenized *access path*, and as a result it lists a large number of directories that are used by **tcl::tm**, and have nothing to do with the purpose of ::auto\_path - seeking pkgIndex.tcl or tclIndex files.  This feature is unhelpful when debugging, because the list of directories in the *access path* can be very long.


# Proposed Change

\(a\) A new exported command **safe::setSyncMode**

\(b\) A new option for Safe Base interpreters, -autoPath, defined under certain conditions explained below.

\(c\) Revised behavior for the commands that can alter the *access path*, i.e. **safe::interpCreate**, **safe::interpInit**, **safe::interpConfigure**, and **safe::interpAddToAccessPath**.

The new command is

**safe::setSyncMode ?newValue?**

When an argument is supplied, the command returns an error in two cases: \(a\) if the argument is not a boolean value; \(b\) if any Safe Base interpreters exist.

Otherwise, the command is an accessor for a new namespace variable safe::AutoPathSync.  Normal return supplies the value of this variable.  The value is initialized when the file tcl8.7/safe.tcl is sourced by the autoloader.

The value \[**safe::setSyncMode**\] controls the behavior of all Safe Base interpreters, and can be changed only when no Safe Base interpreters are defined.  Typically the value will be set as part of initialization.

When \[**safe::setSyncMode**\] is true, the behavior is the same as in current Tcl.  The Safe Base interpreter's ::auto\_path is defined as a tokenized form of the *access path*.  Operations that change the Safe Base interpreter's *access path* also change its value of ::auto\_path.

When \[**safe::setSyncMode**\] is false, ::auto\_path is defined to fulfil the requirements of *pkg_mkIndex\(n\)* and *library\(n\)* only.  It is not modified when the *access path* changes, except by operations that set the paths in the child to values that correspond to those of its parent - in such cases the child's ::auto\_path is set to a tokenized form of the parent's ::auto\_path.

When \[**safe::setSyncMode**\] is false, each Safe Base interpreter is given a new option "-autoPath" which can be used with the commands **safe::interpCreate**, **safe::interpInit**, and **safe::interpConfigure** in the same way as other options.  The -autoPath option is undefined when \[**safe::setSyncMode**\] is true, permitting 100% compatibility with the existing Tcl Safe Base.

In order to implement this new definition of ::auto\_path in a Safe Base interpreter, some changes must be made to the behavior of existing Safe Base commands when \[**safe::setSyncMode**\] is false.  These changes are specified below.


# Specification and Examples

The commands that can alter the *access path* are **safe::interpCreate**, **safe::interpInit**, **safe::interpConfigure**, and **safe::interpAddToAccessPath**.  The effects of these commands on the *access path* and ::auto\_path are described below, including the changes that are proposed by this TIP.

In this section:

* The *Existing Case* is defined to mean Tcl either in its current form, or with this TIP implemented and with \[**safe::setSyncMode**\] true.
* The *Extra Case* is defined to mean Tcl with this TIP implemented and with \[**safe::setSyncMode**\] false.  The differences from the *Existing Case* are the changes proposed by this TIP.
* Code Examples are given for the *Extra Case*.

The effects of options -accessPath and -autoPath on the value of the child's ::auto_path can be expressed in four rules, with a fifth rule for the command  **safe::interpAddToAccessPath**.

\(1\) Calling **safe::interpCreate**, **safe::interpInit**, or **safe::interpConfigure** with an option/value pair for -autoPath.

* *Existing Case*
  * The option -autoPath is undefined.  The command will raise an error.
* *Extra Case*
  * The presence of the "-autoPath value" arguments has no effect on the *access path*.
  * The command applies option -autoPath *after* it determines the value of *access path* from the other arguments.
  * The command will set the child's ::auto\_path to a tokenized form of the specified value.

\(2\) Calling **safe::interpCreate** or **safe::interpInit** without the option -accessPath, or with -accessPath {}; or calling **safe::interpConfigure** with -accessPath {}.

* This remains the most convenient way to initialize a Safe Base interpreter.
* Each command sets the *access path* to the parent interpreter's ::auto\_path and its children, and then appends the directories of \[**tcl::tm::list**\] and their descendants.
* Each command sets the child's \[**tcl::tm::list**\] to a tokenized form of the parent's \[**tcl::tm::list**\].
* *Existing Case*
  * Each command sets ::auto\_path to the tokenized *access path*.
* *Extra Case*
  * If the option -autoPath is specified, the child's ::auto\_path is determined by rule \(1\).
  * If the option -autoPath is not specified, each command sets the child's ::auto\_path to a tokenized form of the parent's ::auto\_path.

Examples of calls to commands **safe::\*** that belong to this category are:

<pre>
        safe::interpCreate foo
        safe::interpCreate foo -accessPath {}
        safe::interpInit bar
        safe::interpInit bar -accessPath {}
        safe::interpConfigure foo -accessPath {}
</pre>

\(3\) Calling **safe::interpCreate**, **safe::interpInit**, or **safe::interpConfigure** with a non-empty value of -accessPath.

Each such command:

* Sets the *access path* to the requested value, then appends \[**tcl::tm::list**\] and its descendants.
* Sets the child's \[**tcl::tm::list**\] to a tokenized form of the parent's \[**tcl::tm::list**\].
* *Existing Case*
  * Sets the child's ::auto\_path to the tokenized *access path*.
* *Extra Case*
  * If option -autoPath is also present, the child's ::auto\_path is determined by rule \(1\).
  * If the option -autoPath is not specified, commands **safe::interpCreate** and **safe::interpInit** each set the child's ::auto\_path to {}.
  * If the option -autoPath is not specified, command **safe::interpConfigure** leaves the child's ::auto\_path unchanged.

e.g.

<pre>
        safe::interpCreate foo -accessPath {
            /usr/local/TclHome/lib/tcl8.7
            /usr/local/TclHome/lib/tcl8.7/opt0.4
            /usr/local/TclHome/lib/tcl8.7/msgs
            /usr/local/TclHome/lib/tcl8.7/encoding

            /usr/local/TclHome/lib
        }

        # The child's ::auto_path must be given a suitable value:

        safe::interpConfigure foo -autoPath {
            /usr/local/TclHome/lib/tcl8.7
            /usr/local/TclHome/lib
        }

        # The two commands can be combined:

        safe::interpCreate foo -accessPath {
            /usr/local/TclHome/lib/tcl8.7
            /usr/local/TclHome/lib/tcl8.7/opt0.4
            /usr/local/TclHome/lib/tcl8.7/msgs
            /usr/local/TclHome/lib/tcl8.7/encoding

            /usr/local/TclHome/lib
        } -autoPath {
            /usr/local/TclHome/lib/tcl8.7
            /usr/local/TclHome/lib
        }
</pre>

\(4\) Other calls of command **safe::interpConfigure** with option/value pairs.

The only case not covered by rules \(1\) to \(3\) is a call to **safe::interpConfigure** with neither option -accessPath nor -autoPath.  Such a call does not alter either the *access path* or the ::auto\_path.

\(5\) Calling **safe::interpAddToAccessPath**.

* The command appends a directory to the child's existing *access path*.
* It does not change the child's \[**tcl::tm::list**\].
* *Existing Case*
  * It sets ::auto\_path to the tokenized *access path*
* *Extra Case*
  * It does not change the child's ::auto\_path.

e.g.

* The example code below can be appended to the example code
that defines the interpreter foo in rule \(3\) above.
* In the *Extra Case* only, the child's auto_path must be
modified to allow the interpreter to use the Img package.

<pre>
        safe::interpAddToAccessPath foo /usr/local/TclHome/lib/extras/Img1.4.11

        lassign [safe::interpConfigure foo -autoPath] DUM childAutoPath
        lappend childAutoPath /usr/local/TclHome/lib/extras/Img1.4.11
        safe::interpConfigure foo -autoPath $childAutoPath
</pre>

* In the examples below, no change is needed to ::auto_path, either
because the existing value allows access to the new package
directories, or because the added directories (e.g. timezone data)
do not concern packages.

<pre>
        safe::interpAddToAccessPath foo /usr/local/TclHome/lib/sqlite3.30.1.2

        foreach dir {
            tzdata
            tzdata/Africa
            ...
            tzdata/US
        } {
            safe::interpAddToAccessPath foo /usr/local/TclHome/lib/tcl8.7/$path
        }
</pre>

**Summary of Specification**

* *Existing Case*
  * Safe Base commands set the child's ::auto\_path to the tokenized *access path*.
  * Advantages: the caller need not be concerned with the child's ::auto\_path.
  * Disadvantages: does not conform to *pkg_mkIndex\(n\)* and *library\(n\)*; the child's ::auto\_path includes many directories that do not belong in the search path for pkgIndex.tcl or tclIndex files; the list of directories is very long and this is unhelpful when debugging.
* *Extra Case*
  * The commands in rule \(2\) set the child's ::auto\_path to a tokenized form of the parent interpreter's.
  * When other commands change the *access path*, the caller is responsible for making any necessary changes to the child's ::auto\_path.  The new -autoPath option simplifies this task.

# Discussion

Because this TIP adds a new option -autoPath, it must go into detail about the interplay between -autoPath and -accessPath, especially when values are changed by **safe::interpConfigure**.  This leads to a fairly lengthy consideration of multiple cases (above).

When writing tests for the reference implementation, many bugs were discovered in the existing Safe Base code, most especially in handling changes of options by **safe::interpConfigure**.  It is hard to avoid the conclusion that (like the present author) most users create a Safe Base interpreter with the properties that they want, and seldom if ever need to call **safe::interpConfigure**.

In this usage case, the entirety of the TIP's specification is greatly simplified:

> **Typical Use**

> In many cases, the properties of a Safe Base interpreter can be specified when the interpreter is created, and then left unchanged for the lifetime of the interpreter.

> If you wish to use Safe Base interpreters with "Sync Mode" off, evaluate the command

> <pre>
>        safe::setSyncMode 0
> </pre>

> Use **safe::interpCreate** or **safe::interpInit** to create an interpreter with the properties that you require.  The simplest way is not to specify -accessPath or -autoPath, which means the safe interpreter will use the same paths as the parent interpreter.  However, if -accessPath is specified, then -autoPath must also be specified, or else it will be set to {}.

> The value of -autoPath is that required to access tclIndex and pkgIndex.txt files according to the same rules as an unsafe interpreter (see *pkg_mkIndex\(n\)* and *library\(n\)*).

> With "Sync Mode" on (the default), the option -autoPath is undefined, and
the Safe Base sets the safe interpreter's ::auto\_path to a tokenized form of the
*access path*. In addition to the directories present if "Safe Mode" is off,
the ::auto\_path includes the numerous subdirectories and module paths
that belong to the *access path*.


# Reference Implementation

Branch tip-579-8-7 in the public fossil repository for Tcl.

**Modified files**

Compared to Tcl 8.7 (core-8-branch), branch tip-579-8-7 modifies the following files:

* doc/safe.n
* library/safe.tcl
* library/tclIndex
* tests/safe-stock.test
* tests/safe.test
* tests/safe-zipfs.test


# Compatibility

In Tcl 8.7, the default value of \[**safe::setSyncMode**\] is 1.  The new interpreter option -autoPath is undefined in this case.  All existing code will behave in the same way as before.

In Tcl 9.0, The default value of \[**safe::setSyncMode**\] will be changed to 0.  The value 1 will remain available to ease the porting of legacy code, but must be set by the script.

# Copyright

This document has been placed in the public domain.

Changes to tip/580.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 580: Export Tk_GetDoublePixelsFromObj and 5 more
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        14-July-2020
	Post-History:
	Tcl-Version:    8.7
	Tk-Version:     8.7
	Keywords:       export
	Tk-Branch:      tip-580
	Vote-Summary:   Accepted 9/0/0
	Votes-For:      BG, DKF, FV, JD, JN, KBK, KW, MC, SL
	Votes-Against:  none
	Votes-Present:  none
------








<







1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
# TIP 580: Export Tk_GetDoublePixelsFromObj and 5 more
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        14-July-2020
	Post-History:
	Tcl-Version:    8.7

	Keywords:       export
	Tk-Branch:      tip-580
	Vote-Summary:   Accepted 9/0/0
	Votes-For:      BG, DKF, FV, JD, JN, KBK, KW, MC, SL
	Votes-Against:  none
	Votes-Present:  none
------

Changes to tip/583.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 583: Add Option to Limit Depth of Execution Step Traces for Procs
	Author:         Eric Taylor <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        15-Aug-2020
	Post-History:
	Keywords:       Tcl
	Tcl-Version:    8.7
-----

# Abstract

This TIP proposes that the trace command include an option for step tracing (of procedures) that would
limit the traces to a given depth when using the enterstep or leavestep trace options.









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 583: Add Option to Limit Depth of Execution Step Traces for Procs
	Author:         Eric Taylor <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        15-Aug-2020
	Post-History:
	Keywords:       Tcl
	Tcl-Version:    9.1
-----

# Abstract

This TIP proposes that the trace command include an option for step tracing (of procedures) that would
limit the traces to a given depth when using the enterstep or leavestep trace options.

Changes to tip/584.md.

19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

This TIP proposes to improve introspection capabilities of ttk.

# Rationale

People regularly request (for instance
[in TkDocs](https://tkdocs.com/tutorial/styles.html#using),
in [TIP #555](https://core.tcl-lang.org/tips/doc/trunk/tip/555.md),
or recently again in
[comp.lang.tcl](https://groups.google.com/d/msg/comp.lang.tcl/5E9kGZ5wEHQ/74JAo7-bAwAJ))
that ttk introspection capabilities be improved.

As it seems, the really missing bit is the ability to retrieve <u>styles</u>.

# Specification







|







19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

This TIP proposes to improve introspection capabilities of ttk.

# Rationale

People regularly request (for instance
[in TkDocs](https://tkdocs.com/tutorial/styles.html#using),
in [TIP #555](https://core.tcl-lang.org/tips/doc/main/tip/555.md),
or recently again in
[comp.lang.tcl](https://groups.google.com/d/msg/comp.lang.tcl/5E9kGZ5wEHQ/74JAo7-bAwAJ))
that ttk introspection capabilities be improved.

As it seems, the really missing bit is the ability to retrieve <u>styles</u>.

# Specification
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
    Label TScale Horizontal.TScale TMenubutton TLabelframe.Label Vertical.TProgressbar TEntry TRadiobutton TButton Heading Toolbutton TNotebook.Tab ComboboxPopdownFrame Treeview Vertical.TScale TCombobox TNotebook TProgressbar Horizontal.TProgressbar . TCheckbutton Item TSpinbox Tab
    % ttk::style theme styles clam
    TMenubutton TEntry TLabelframe Vertical.Sash TRadiobutton Heading TButton TNotebook.Tab Toolbutton Treeview ComboboxPopdownFrame TCombobox TProgressbar . TCheckbutton Tab TSpinbox Horizontal.Sash Sash
</pre>


Then it becomes straightforward to get all <u>layouts</u>, as originally requested
in [TIP #555](https://core.tcl-lang.org/tips/doc/trunk/tip/555.md):

<pre>
    # get layout for each style
    foreach st [ttk::style theme styles] {
        if {[catch {ttk::style layout $st}]} {
            puts "$st: has no layout"
        } else {







|







55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
    Label TScale Horizontal.TScale TMenubutton TLabelframe.Label Vertical.TProgressbar TEntry TRadiobutton TButton Heading Toolbutton TNotebook.Tab ComboboxPopdownFrame Treeview Vertical.TScale TCombobox TNotebook TProgressbar Horizontal.TProgressbar . TCheckbutton Item TSpinbox Tab
    % ttk::style theme styles clam
    TMenubutton TEntry TLabelframe Vertical.Sash TRadiobutton Heading TButton TNotebook.Tab Toolbutton Treeview ComboboxPopdownFrame TCombobox TProgressbar . TCheckbutton Tab TSpinbox Horizontal.Sash Sash
</pre>


Then it becomes straightforward to get all <u>layouts</u>, as originally requested
in [TIP #555](https://core.tcl-lang.org/tips/doc/main/tip/555.md):

<pre>
    # get layout for each style
    foreach st [ttk::style theme styles] {
        if {[catch {ttk::style layout $st}]} {
            puts "$st: has no layout"
        } else {

Changes to tip/586.md.

1
2
3
4
5
6
7
8
9
10




11
12
13
14
15
16
17
# TIP 586: C String Parsing Support for binary scan
	Author:         Christian Werner <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           In progress
	Created:        18-Sep-2020
	Post-History:
	Keywords:       binary
	Tcl-Version:    8.7
	Tcl-Branch:     tip-586-binary-scan-c-string




-----

# Abstract

This TIP proposes to add another scan rule to the `binary scan` command in order to be able to deal with NUL terminated C strings.

# Rationale


|

|





>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# TIP 586: C String Parsing Support for binary scan
	Author:         Christian Werner <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        18-Sep-2020
	Post-History:
	Keywords:       binary
	Tcl-Version:    8.7
	Tcl-Branch:     tip-586-binary-scan-c-string
	Vote-Summary:   Accepted 6/0/0
	Votes-For:      DKF, FV, JN, KBK, KW, SL
	Votes-Against:  none
	Votes-Present:  none
-----

# Abstract

This TIP proposes to add another scan rule to the `binary scan` command in order to be able to deal with NUL terminated C strings.

# Rationale

Changes to tip/588.md.

1
2
3
4
5
6
7
8
9
10




11
12
13
14
15
16
17
# TIP 588: Unicode for (X11) keysyms
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           In progress
	Created:        23-Oct-2020
	Post-History:
	Keywords:       X11
	Tcl-Version:    8.7
	Tk-Branch:	keysym-unicode




-----

# Abstract

This TIP proposes to allow Unicode characters in X11 keysyms.

# Rationale


|

|





>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# TIP 588: Unicode for (X11) keysyms
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        23-Oct-2020
	Post-History:
	Keywords:       X11
	Tcl-Version:    8.7
	Tk-Branch:	keysym-unicode
	Vote-Summary:   Accepted 6/0/0
	Votes-For:      DKF, FV, JN, KBK, KW, SL
	Votes-Against:  none
	Votes-Present:  none
-----

# Abstract

This TIP proposes to allow Unicode characters in X11 keysyms.

# Rationale

Changes to tip/590.md.

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
# TIP 590: Recommend lowercase Package Names
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        4-Nov-2020
	Post-History:
	Keywords:       package
	Tcl-Version:    8.7
	Tcl-Branch:	tip-590




-----

# Abstract

This TIP proposes to rename some package name to lowercase, and
recommend lowercase packagenames.

# Rationale

Let's run the "package names" command. Possible outcome:

<pre>
    % package names
    Thread http tcl::tommath TclOO tcl::idna opt tcltest zipfs cookiejar msgcat zlib Ttrace Tcl platform sqlite3 Tk
</pre>

From this, we cannot really see where those packages came from.
Some are distributed from within Tcl (tcl::tommath, zlib, TclOO, zipfs), some
are distributed as tm modules (http, msgcat, platform), some
are in the battery-included Tcl distribution (Thread, Ttrace, sqlite3).

Further on, on Windows there are 2 packages which' entry points
symbols cannot be guessed. The reason is their filenames: "tcldde14.dll"
resp. "tclreg13.dll", while their package names are "dde" resp. registry"

# Specification

* In order to bring some consistency in package names, this
TIP proposes to rename some packages. The old package names
are kept as well.



|

|





>
>
>
>




|


















|







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
# TIP 590: Recommend lowercase Package Names
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        4-Nov-2020
	Post-History:
	Keywords:       package
	Tcl-Version:    8.7
	Tcl-Branch:	tip-590
	Vote-Summary:	Accepted 3/0/2
	Votes-For:	JN, KW, MC
	Votes-Against:	none
	Votes-Present:	FV, SL
-----

# Abstract

This TIP proposes to rename some package names to lowercase, and
recommend lowercase packagenames.

# Rationale

Let's run the "package names" command. Possible outcome:

<pre>
    % package names
    Thread http tcl::tommath TclOO tcl::idna opt tcltest zipfs cookiejar msgcat zlib Ttrace Tcl platform sqlite3 Tk
</pre>

From this, we cannot really see where those packages came from.
Some are distributed from within Tcl (tcl::tommath, zlib, TclOO, zipfs), some
are distributed as tm modules (http, msgcat, platform), some
are in the battery-included Tcl distribution (Thread, Ttrace, sqlite3).

Further on, on Windows there are 2 packages which' entry points
symbols cannot be guessed. The reason is their filenames: "tcldde14.dll"
resp. "tclreg13.dll", while their package names are "dde" resp. "registry"

# Specification

* In order to bring some consistency in package names, this
TIP proposes to rename some packages. The old package names
are kept as well.

Changes to tip/591.md.

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
# TIP 591: Rotate ttk::notebook window wtih mousewheel on tab
	Author:         Harald Oehlmann <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        13-Nov-2020
	Keywords:       Tk, bindings
	Tcl-Version:    8.7





-----

# Abstract

It is proposed that each mouse wheel tick executed on a notebook tab area will show the previous or next window.

# Specification

If the mouse pointer is over the tab area of a ttk::notepad:

   *   Moving the mousewheel down will activate the previous tab.
   *   Moving the mousewheel up will activate the next tab.





# Rationale

I have seen that somewhere and I find it very handy. Try it out:

<pre>
ttk::bindMouseWheel TNotebook { ttk::notebook::CycleTab %W }
pack [ttk::notebook .n]
for {set index 1} {$index < 10} {incr index} {
    ttk::label .n.$index -text "Page $index"
    .n add .n.$index -text "tab $index"
}
</pre>

This works for me on Tk8.6.10 on Windows.

For me, this is very handy and intuitive.

# Reference Implementation

Csaba provided the line:

<pre>
ttk::bindMouseWheel TNotebook { ttk::notebook::CycleTab %W }
</pre>

which activates this functionality.



# Copyright

This document has been placed in the public domain.
|

|

|



>
>
>
>
>












>
>
>
>














|












>
>




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
# TIP 591: Rotate ttk::notebook window with mousewheel on tab
	Author:         Harald Oehlmann <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        13-Nov-2020
	Keywords:       Tk, bindings
	Tcl-Version:    8.7
	Tk-Branch:      tip-591
	Vote-Summary:	Accepted 5/0/0
	Votes-For:	JN, FV, KW, MC, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

It is proposed that each mouse wheel tick executed on a notebook tab area will show the previous or next window.

# Specification

If the mouse pointer is over the tab area of a ttk::notepad:

   *   Moving the mousewheel down will activate the previous tab.
   *   Moving the mousewheel up will activate the next tab.

This should happen for vertical and horizontal mousewheel operation, like in the scrollbar.
The horizontal mousewheel is bound to Shift-Mousewheel.
Some special mices invoke this bining directly by a tiltable scrollwheel.

# Rationale

I have seen that somewhere and I find it very handy. Try it out:

<pre>
ttk::bindMouseWheel TNotebook { ttk::notebook::CycleTab %W }
pack [ttk::notebook .n]
for {set index 1} {$index < 10} {incr index} {
    ttk::label .n.$index -text "Page $index"
    .n add .n.$index -text "tab $index"
}
</pre>

This works for me on Tk 8.6.10 on Windows.

For me, this is very handy and intuitive.

# Reference Implementation

Csaba provided the line:

<pre>
ttk::bindMouseWheel TNotebook { ttk::notebook::CycleTab %W }
</pre>

which activates this functionality.

There is a Tk branch, `tip591`, including this functionality.

# Copyright

This document has been placed in the public domain.

Added tip/592.md.

























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 592: Stop support for Windows XP, Server 2003, Vista, Server 2008 
	Author:         Ashok P. Nadkarni <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        12-Dec-2020
	Post-History:   
	Tcl-Version:    8.7
	Tcl-Branch:     tip-592
	Vote-Summary:	Accepted 6/0/0
	Votes-For:	FV, JN, KW, KK, MC, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

TIP 487, which proposed dropping support for versions of Windows prior to
Windows XP, has already been accepted for Tcl 8.7. This TIP proposes
dropping the following additional Windows versions based on Microsoft
EOL'ing these years ago and negligible current market presence.

* Windows XP (V5.1)
* Windows Server 2003 (V5.1)
* Windows Vista (V6.0)
* Windows Server 2008 (V6.0) (not to be confused with Server 2008 R2 which
  shares the ABI with Windows 7 and will continue to be supported)

This TIP is intended to apply to both Tcl and Tk.

# Motivation

Three years have passed since TIP 487 was proposed and accepted. In that
time, market share of the Windows XP, Windows Server 2003 and Vista has
dropped to well below 1% each and likely to plunge further by the time 8.7
releases. Windows Server 2008 statistics are not easily available but has
also been EOL'ed and mostly supplanted by Server 2008 R2 which will continue
to be supported. Furthermore, those systems are legacy systems and very
unlikely to be upgraded to Tcl 8.7 even if they run Tcl at all.

Dropping support for older systems reduces the need for numerous API checks and
the testing burden. In addition, it will allow the use of
new APIs related to I/O, synchronization, threading etc. introduced in
Windows 7.

# Tool chain implications

Use of Windows 7 API also requires support from compiler tool chains.
In particular, with respect to Microsoft compilers, Tcl 8.7 will require
Visual Studio 2015 or later. The Mingw(-w64) gcc tool chain continues to be supported.

# Implementation

Use of newer API's will automatically prevent their loading into old Windows
versions. If desired, checks can also be added through the executable
manifest and/or explicit version checks in the code at runtime.

# Copyright

This document has been placed in the public domain.

Added tip/593.md.























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 593: Efficient List Item Existence-Test-and-Take
	Author:         Donal Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        31-Dec-2020
	Post-History:
	Keywords:       Tcl, lists
	Tcl-Version:    8.7
	Obsoleted-By:   631
-----

# Abstract

This TIP proposes a command that does part (handling lists) of the more
general programme proposed by [TIP #513](513.md).

# Rationale

[TIP #513](513.md) covers the general rationale for having fused operations
for testing for the presence of an item and removing that item as a single
operation. However, the concrete API proposed by that TIP is somewhat complex;
this TIP proposes a simplified version for the list case (other TIPs will have
to handle arrays and dictionaries).

# Specification

The `ltake` command should take three or more arguments:

 > **ltake** _listVarName_ _elemVarName_ _index_ ?_index_ ...?
 
The _listVarName_ argument should be the name of a variable containing a Tcl
list, the _elemVarName_ should be the name of a variable that may have an
element of the list transferred into it, and the _index_ argument (or
arguments) should indicate a particular location in the list to take the
element from. The result of the command is a boolean; true if the element
existed (and was transferred), false otherwise. The use of multiple _index_
arguments will be the same as in **lindex** and **lset**.

Note that if the index path leads into a non-list or off the end of a list,
the command does not error (those are cases that result in a false result),
but if either _listVarName_ or _elemVarName_ cannot be written to, the command
will error. (Conceptually, _listVarName_ will have the updated list written
back to it after the extracted element is written to _elemVarName_; using the
same variable name in both places is unlikely to be desired.)

Code that uses this command may expect that taking from the `end` index will
be implemented in (typically) constant time, effectively acting as a kind of
"lpop". Removing from other indices (especially including `0`) may be slower
due to the rearrangement of the list contents.

# Example

For example:

```
set lv {a b c d e}
while {[ltake lv ev 2]} {
    puts "TAKEN: $ev"
}
puts "LEFT: $lv"
```

will print:

```
TAKEN: c
TAKEN: d
TAKEN: e
LEFT: a b
```

# Copyright

This document is placed in public domain.

Added tip/594.md.









































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 594: Modernize "file stat" interface
	Author:         Emiliano Gavilán <[email protected]>
	Author:         aspect <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        13-Jan-2021
	Post-History:
	Keywords:       Tcl, file
	Tcl-Version:    8.7
	Tcl-Branch:     tip-594
	Vote-Summary    Accepted 4/0/2
	Votes-For:      FV, JN, KBK, SL
	Votes-Against:  none
	Votes-Present:  DGP, MC
-----

# Abstract

This TIP proposes extending the `file stat` and `file lstat` commands to return
a dictionary if no `varName` argument is provided.

# Rationale

The result of `file stat` is traditionally stored in an array named by its
second argument.  Now that dicts are available, a more ergonomic alternative is
to simply return a value that the caller can process with the `dict` command,
pass to other procs or return as a result.  The original usage is preserved by
making the `varName` argument optional.


# Specification

The `file stat` and `file lstat` commands are both changed in exactly the same
way.  Using `file stat` as an example, its signature is changed from:

    file stat name varName

to:

    file stat name ?varName?

With two arguments, it behaves exactly like before.  With only one argument:

* errors are reported exactly as they would be if `varName` was provided
* if no error occurs, the result is returned as a dict instead of by populating
  an array

Previously, calling `file stat` with only one argument would raise a 
{`TCL WRONGARGS`} error.

# Example

Old (and preserved) usage:

    % file stat / st
    % parray st
    st(atime)   = 1610459586
    st(blksize) = 4096
    st(blocks)  = 8
    st(ctime)   = 1605692955
    st(dev)     = 64769
    st(gid)     = 0
    st(ino)     = 2
    st(mode)    = 16749
    st(mtime)   = 1605692955
    st(nlink)   = 18
    st(size)    = 4096
    st(type)    = directory
    st(uid)     = 0

New usage:

    % file stat /
    type directory size 4096 mtime 1605692955 ino 2 dev 64769 atime 1610459586 uid 0 ctime 1605692955 nlink 18 gid 0 blksize 4096 mode 16749 blocks 8

# Implementation

The ticket [modernize "file stat" interface](https://core.tcl-lang.org/tcl/tktview?name=560c5e438c47f5fdd34846dbb333ab96cb905416) includes a patch by Emiliano Galivan.  This patch includes an update to the manual, a new test `cmdAH-28.14` and changes two existing tests to accomodate the new interface (`cmdAH-28.1` and `cmdAH-28.2`).


# Copyright

This document is placed in public domain.

Added tip/595.md.











































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 595: Unicode-aware/case-sensitive Loadable Library handling
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Tcl-Version:    9.0
	Tcl-Branch:     bug-ea39ab591e
	Vote-Summary:	Accepted 7/0/1
	Votes-For:	AK, DP, JN, KW, KK, MC, SL
	Votes-Against:	none
	Votes-Present:	FV
-----
# Abstract

The "load" command, and its supporting C API is quite misleading. For example
the 3th argument of "load" is case-insensitive: It is converted to Titlecase,
(ASCII-only), then `_Init` is attached to it, then the C-function in the
shared library with this name is called. No package handling is done,
still the 3th argument of "load" is called "packageName".

See also bug report [ea39ab591e](https://core.tcl-lang.org/tcl/info/ea39ab591e):
<b>Tcl_StaticPackage allows case sensitvity; [load] prevents it</b> which
describes in better wordings what's wrong.

This TIP proposes to get rid of the case-insensitivity of the "load"
command, except in the guessing of the `prefix` from the filename.
In order to distinguish libraries from packages (libraries are
available globally while package are per interpreter), a number
of renamings will be done.

# Specification

In Tcl 8.7, rename `Tcl_StaticPackage` to `Tcl_StaticLibrary`,
`Tcl_PackageInitProc` to `Tcl_LibraryInitProc` and `Tcl_PackageUnloadProc`
to `Tcl_LibraryUnloadProc`. Also add the following defines in `tcl.h`:
<pre>
    #define Tcl\_PackageInitProc Tcl\_LibraryInitProc
    #define Tcl\_PackageUnloadProc Tcl\_LibraryUnloadProc
    #define Tcl\_StaticPackage Tcl\_StaticLibrary
</pre>
This way, the new names of the functions already can be used
in Tcl 8.7, but the functionality stays the same. Hopefully
those new names make it clear that those functions take
part in the `load` mechanism, not the `package` mechanism.

In Tcl 9.0, if the "load" command's 3th parameter is missing,
this parameter is guessed from the filename. Starting with
Tcl 9.0, a Unicode Titlecase will be used, not a ASCII one.
The full algorithm becomes:

  * If the filename starts with `lib`, strip it.
  * If the filename then starts with `tcl9`, strip it.
  * Take the characters following that, up to (but not including) the
    first character which is a (Unicode) digit or not a (Unicode) word.
  * Convert those characters to (Unicode) Titlecase.
  * The result will be the guessed `prefix` parameter.

This is almost the same as the Tcl 8.x algorithm, the enhancement is that
the characters used in the filename are no longer limited to ASCII. For
example, a shared library `libπ.so` will result in a prefix `Π`, so the
initialization function `Π_Init()` will be called when loading this file.

When using Tcl 9.0, the following existing library names will be changed:

  * `tcldde14.dll` -> `tcl9dde14.dll`
  * `tclregistry13.dll` -> `tcl9registry13.dll`
  * `tk87.dll` -> `tcl9tk87.dll` (on Windows)
  * `libtk8.7.so` -> `libtcl9tk8.7.so` (on UNIX)

This makes it possible to install Tk 8.7 in the same
directory when compiled for Tcl 8.7 resp 9.0. Since
the filename is different, the pkgIndex.tcl file can
load the correct Tk library no matter Tcl 8.7 or 9.0
is doing the call. (Of course, Tk 8.7 needs to be
compiled twice then, once with Tcl 8.7 headers, once
with Tcl 9.0 headers)

# Implementation

Implementation is in Tcl (and Tk) branch bug-ea39ab591e.

# Compatibility

This is not compatible with Tcl 8.x, but there is a simple way to
make code compatible with both Tcl 8.x and 9.0: Just replace
all "load" invocations:

  * `load <fileName> <prefix> ?<interp>?`

by

  * `load <fileName> [string totitle <prefix>] ?<interp>?`

.

Of course, if the 3th argument of `load` already is in Titlecase
(it usually is) nothing needs to be done.

# Copyright

This document has been placed in the public domain.

Added tip/596.md.





















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 596: Stubs support for Embedding Tcl in other applications
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Tcl-Version:    9.0
	Tcl-Branch:     rfe-854941
	Vote-Summary:	Accepted 5/0/0
	Votes-For:	BG, JN, KBK, KW, MC
	Votes-Against:	none
	Votes-Present:	none
-----
# Abstract

The Stubs mechanism was originally written to be able to extend Tcl with
binary extensions, without the extensions depending on a specific Tcl
version. But what if Tcl is being embedded inside another application?
The Stub mechanism was never designed for that.

David Gravereaux wrote a [RFE](https://core.tcl-lang.org/tcl/info/854941)
long ago (december 2003), touching on the problems arising. And Shannon Noe
wrote [TIP #531](531.md) which also was inspired on the same problem.

This TIP enhances Tcl 9.0 with no new API, but internal modifications,
such that embedding Tcl in other applications using the Stub mechanism
is finally possible without the described problems. It follows David
Gravereaux's outline, providing new wrapper functions in the stub library
(`libtclstub9.0.a` / `tclstub90.lib`) which are able to
locate, load and initialized the Tcl 9.0 shared library (`libtcl9.0.so`
/ `tcl90.dll`), just assuming it is somewhere on the PATH or in &lt;prefix>/lib.
No new functions are added to the API, only existing functions which
previously only worked for extensions are now made
suitable to be used for Embedding applications as well.

Tcl 8.7 is enhanced with a new API: the function `Tcl_SetPreInitScript()`,
which is nothing more than the renamed internal function `TclSetPreInitScript()`.
It will not be exposed through the stub table.
 
# Specification

The following 4 functions are added to the Tcl Stub library. Their
actual name in the stub library is different, in order to prevent
symbol conflicts, but they function under the following names:

* `const char *Tcl_InitSubsystems(...)`
* `const char *Tcl_SetPanicProc(...)`
* `const char *Tcl_FindExecutable(...)`
* `const char *TclZipfs_AppHook(...)`

Any application which wants to embed Tcl only needs to call one (or more) of
those 4 functions first. If the application is compiled with `-DUSE_TCL_STUBS`,
a wrapper function is used in stead which loads the Tcl 9.0 core, initializes
it, initializes a stub table in the embedder application, and then
runs the corresponding function in the Tcl core. After that, the
embedding application can call any other functions from the Tcl API
through the stub table, everything further is fully transparent.

An example Embedding "Hello World" application:
<pre>
\#define USE\_TCL\_STUBS
\#include &lt;tcl.h>
\#include &lt;stdio.h>
int main(int argc, char **argv) {
    const char \*version = Tcl\_InitSubsystems(); /\* Load/Initialize the Tcl core \*/
    if (version == NULL) {printf("Cannot find the Tcl core\\n"); return 1;}
    Tcl\_Interp *interp = Tcl\_CreateInterp();
    Tcl\_Eval(interp, "puts stdout {Hello World}");
    Tcl\_DeleteInterp(interp);
    return 0;
}
</pre>

Compile this example application, and link it to the Tcl stub library, that's
all.

Which of the 4 functions the embedder application calls first, depends on
what details are needed for the initialization. `Tcl_InitSubsystems()`
just initializes the minimum possible. `Tcl_SetPanicProc()`
can be used if the embedder application provides its own panicproc. `Tcl_FindExecutable()`
is needed when the interpreter needs access to `info nameofexecutable`.
`TclZipfs_AppHook()` is needed if the embedder application has a zip file
attached which needs to be mounted to be made available to the Tcl
interpreter. Multiple such calls can be done, if desired: the first
call will load the Tcl core, succeeding calls don't do that again.

The signatures of the 4 initialization functions change: All
functions return a `const char *` now, which will return NULL if
locating the Tcl core fails. The functions return the full Tcl version
number if the initialization succeeds. This can be used to check if
the Tcl version is actually the expected one.

There are 5 more functions exposed through the stub library this way,
but which are _not_ capable of initializing the stub table. They
can be called from the embedder application after the Tcl core
has already been loaded and initialized. These are:

* `Tcl_MainEx()`/`Tcl_MainExW()` (in order to make `Tcl_Main()` function as-is)
* `Tcl_StaticLibrary()`
* `Tcl_SetExitProc()`
* `Tcl_GetMemoryInfo()`
* `Tcl_SetPreInitScript()`
	
They need special treatment because those functions are not exposed through
the stub table. The only way to handle those is to search for the
correct symbol in the Tcl shared library, and call it directly.

Since Tcl 9.0 is the only version in development after 8.7, there is no
mechanism yet to prefer Tcl 9.1 over 9.0, or make another selection
on exactly which Tcl version is desired. That exercise is left for
the future, when the development of Tcl 9.1 starts.

# Implementation

Implementation is in Tcl branch rfe-854941.

# Compatibility

This is 100% upwards compatible with Tcl 8.6.

# Copyright

This document has been placed in the public domain.

Added tip/597.md.



































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 597: "string is unicode" and better utf-8/utf-16/cesu-8 encodings
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Tcl-Version:    8.7
	Tcl-Branch:     tip-597
	Vote-Summary:	Accepted 3/0/0
	Votes-For:	DGP, JN, MC
	Votes-Against:	none
	Votes-Present:	none
-----
# Abstract

Currently, there is a discussion going on, about making Tcl more
conform to the Unicode specification. Internally, Tcl allows
to use Unicode codepoints which are not allowed to be exported
to other applications, which makes Tcl non-conformant.
[TIP #573](https://core.tcl-lang.org/tips/doc/trunk/tip/573.md)
was an attempt to solve this by forbidding the use of surrogates.

This TIP provides another approach. We can allow all characters
internally, but modify the "utf-8"/"utf-16" encoders such that any surrogate
or noncharacter (as defined by the Unicode standard) is replaced
by the replacement character U+FFFD.

Further on, there is a new "cesu-8" encoding.

Finally "string bytelength" will be deprecated in Tcl 8.7 and
fully removed in Tcl 9.0. The new encodings can be used to
create a good replacement for this command.

# Specification

Introduce a new command

* `string is unicode`

This command will return 1 if the string does not contain
any character from the following set:

* 2048 surrogates (U+D800 - U+DFFF)
* 66 noncharacters (U+??FFFE - U+??FFFF and U+FDD0 - U+FDEF)

Contrary to other `string is` commands, which adapt to the
evolving Unicode standard, `string is unicode` will not
change any more in future standards. This command cannot be used to
check if a Unicode character is defined for a code point in the
current Unicode standard. If the codepoint is available for a
possible future assignment, `string is unicode` will return 1.

The `string is unicode` command can be used to check if the
"utf-8"/"utf-16" encodings would deliver valid output, e.g.
<pre>
if {[string is unicode $text]} {
    set f [open somefile.txt]
    fconfigure $f -encoding binary
    puts $f [encoding convertto utf-16 $text]
} else {
    puts stderr "Cannot write to file: non-conformant utf-16"
}
</pre>
The `encoding converto` command currently has no other way
to indicate encoding errors.

The problem with surrogates is that in the UTF-16 encoding there
is no way to distinguish a surrogate-pair from a character > U+FFFF.
Therefore the surrogate code-points (U+D800 - U+DFFF) are not
allowed in UTF-8. When other applications receive such non-conformant
UTF-8, behavior is undefined.

For a similar reason, noncharacters are problematic in UTF-16. Since
U+FEFF is the BOM (Byte order Mark), allowing U+FFFE as possible value
means we can no longer distinguish little-endian UTF-16 files from
big-endian. And the U+FFFF pattern (short -1) is used very often in
binary files, so allowing U+FFFF in UTF-16 makes it more difficult to
distinguish binary files from UTF-16 text (the NULL-byte cannot be used
for that, because it is allowed - and frequent - in UTF-16).
That's why the last two characters in each plane (U+??FFFE - U+??FFFF)
are defined as unicode "noncharacters".

Introduce a new API:

* `int Tcl_UniCharIsUnicode(int character)`

This function returns 1 if `character` is between 0x0000 and
0x10FFFE, and it is not a surrogate and not a noncharacter.

Introduce new "utf-8"/"utf-16" encodings. When converting from
internal utf-8 to external utf-8/utf-16, any character for which
`string is unicode` returns 0 will be produce the replacement
character U+FFFD (bytes \\xEF \\xBF \\xBD). When converting from
external utf-8/utf16 to internal utf-8, nothing changes: The new
utf-8/utf-16 decoders are forgiving for surrogates and noncharacters,
they can continue to be processed by Tcl as-is.

Introduce a new "cesu-8" encoding. It's the same as "utf-8", only
characters > U+FFFF will be output as a 6-byte sequence in stead of
a 4-byte sequence, and the surrogate/noncharacter codepoints
are considered conformant. See: [CESU-8](https://en.wikipedia.org/wiki/CESU-8)

The new encoders all implement the flag TCL_ENCODING_STOPONERROR
(which is not accessible at script level). When this flag is set,
the encoder/decoder will stop processing when it encounters a
surrogate or noncharacter or some other problem (e.g. overlong
byte sequences or missing continuation bytes)

Finally, deprecate the "string bytelength" command. It can be
replaced by "string length [encoding convertto utf-8]. In
Tcl 9, the "string bytelength" command will be removed.

# Further enhancements

At this moment, Tcl doesn't have access to the TCL_ENCODING_STOPONERROR
flag at script level. Work is ongoing (in the "encodings-with-flags"
branch) to change that. This can be used to let the "utf-8" encoder
automatically stop processing when it encounters a surrogate or
noncharacter, in stead of producing \\xEF \\xBF \\xBD (as proposed in this TIP).
Since this change brings more complications, it is left out of
scope for this TIP. But it would (IMHO) be a very useful addition.

# Rejected alternatives

The "wtf-8"/"wtf-16" and "tcl-8" encodings, proposed earlier, are
considered inappropriate. Exposing them would expose too much internal
Tcl implementation at script level, which then cannot be changed any more
in future Tcl versions. They potentially harm more than they benefit.

# Implementation

Implementation is in Tcl branch tip-597

# Compatibility

Since Tcl 8.6's "utf-8"/"utf-16" encoders can produce non-conformant utf-8/utf-16,
and the new "utf-8"/"utf-16" encoders cannot any more, this introduces a
**potential incompatibility** for applications which - illegally -
export non-conformant utf-8/utf-16. Applications which - willingly - want to
violate the Unicode standard can now use the "cesu-8" or "ucs-2"
encoders in stead. The "utf-8"/"utf-16" decoders are unchanged, so
Tcl can continue to handle non-conformant utf-8/utf-16 from other applications.

# Copyright

This document has been placed in the public domain.

Added tip/598.md.



















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 598: export TclWinConvertError
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Tcl-Version:    8.7
	Tcl-Branch:     rfe-800716
	Vote-Summary:	Accepted 3/0/5
	Votes-For:	JN, KW, KK
	Votes-Against:	none
	Votes-Present:	AK, DP, FV, MC, SL
-----
# Abstract

This TIP proposes to export the current win32-specific
functions `TclWinConvertError()` and `TclWinConvertWSAError()`
under the new name `Tcl_WinConvertError()`.

# Specification

Introduce a new win32-specific API:

* `void Tcl_WinConvertError(unsigned errCode)`

This function can handle both normal win32 errors
and WSA errors, so it's a full replacement
for both `TclWinConvertError()` and `TclWinConvertWSAError()`

See also [rfe #800716](https://core.tcl-lang.org/tcl/info/800716)

# Implementation

Implementation is in Tcl branch rfe-800716

# Compatibility

This is 100% upwards compatible with Tcl 8.6.

# Copyright

This document has been placed in the public domain.

Added tip/599.md.

























































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 599: Extended build information
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Tcl-Version:    8.7
	Tcl-Branch:     build-info
	Vote-Summary    Accepted 5/0/0
	Votes-For:      BG, JN, KW, MC, SL
	Votes-Against:  none
	Votes-Present:  none
-----
# Abstract

This TIP proposes new commands "tcl::build-info"
(and "tk::build-info", and the same for any extension wanting to do this)

Example:
<pre>
$ tclsh8.7
% tcl::build-info
8.7b1+4a8309fafe073cae4fb210cfcd37e6accd8e31e7558aefab3d7f2ad6a27540c2.clang-1200
% tcl::build-info commit
4a8309fafe073cae4fb210cfcd37e6accd8e31e7558aefab3d7f2ad6a27540c2
% tcl::build-info compiler
clang-1200
% tcl::build-info version
8.7a6
% tcl::build-info patchlevel
8.7a6

$ tclsh9.0
% tcl::build-info
9.0b1+f896257cbcef7829503585ca26430bb097c8c33258a3785f7611bbc21c3ba080.gcc-1002

\> tclsh87
% tcl::build-info
8.7b1+4a8309fafe073cae4fb210cfcd37e6accd8e31e7558aefab3d7f2ad6a27540c2.magicsplat.msvc-1916

</pre>

The build-info information consists of the version string, adding a '+' sign and some
crucial build information, to be used in Fossil bug reports. This way we can determine quickly
whether a 'static' build was used, whether a specific patched version (e.g. 'fedora',
which has a slightly different directory layout) was used, just by asking the
result of "tcl::build-info".

Another goal for this TIP is to provide additional information to applications using
TIP #596: "Stubs support for Embedding Tcl in other applications". Such applications
can now query Tcl build options even before creating an interpreter.

# Specification

In Tcl 8.x, package versions consist of integers separated by dots or (as final one) 'a' or 'b'.
e.g.:

* "1.2.6"
* "2.0a2"

This TIP proposes the possibility to get additional build metadata, which MAY be denoted by
appending a plus sign and a series of dot separated identifiers immediately following the
version. Identifiers MUST comprise only ASCII alphanumerics and hyphens [0-9A-Za-z-].
Identifiers MUST NOT be empty. Build metadata MUST be ignored when determining version precedence.
Thus two versions that differ only in the build metadata, have the same precedence. Examples:

* "1.2.6+tag1.tag2.tag3"
* "2.0a2+tag1.tag2.tag3"

Note that this is exactly the same way as how ["Semanic Versioning"](https://semver.org/#spec-item-10) versions
can add optional build metadata, that's not a coincidence. There's no need for Tcl to invent
its own wheel.

The Tcl build process is adapted to retrieve the commit-id from Fossil or GIT such that
it even survives a "make dist". So, if the Tcl source code was checked out from Fossil
or GIT and built, then `tcl::build-info` will contain the correct commit-id. If -
then - a "make dist" is used to create a tar.gz file, building Tcl from this
distribution will still show the same commit in `tcl::build-info`. At this moment,
only Fossil and GIT are supported, support for more VCS'es could be added in the future.

In Tcl, we want to build an unique version string which tells us crucial information about
how Tcl (or Tk or ....) was built. Advantage: anyone submitting a bug report, we can ask
to type "tcl::build-info" and it will help being able to reproduce the bug.

* The first identifier is always the Fossil commit-id. If the package doesn't come from fossil
  but from GIT, it's "git-&lt;commit-id&gt;". This way we can always locate the exact commit which
  was used as base from the build, even when building from a tarball which originated from Fossil or GIT.
* All other identifiers are sorted alphabetical.
* There are 4 (optional) predefined tags for the compiler used:
   "clang-xxxx"
   "gcc-xxxx"
   "icc-xxxx"
   "msvc-xxxx"
  where "xxxx" is the version of the compiler (two digits for major and two digits for minor version).
  More compilers will be added in the future, as desired.
* Then there is the following list of (optional) identifiers. Presence of such identifier indicates
  that this is a non-standard build: the identifier string indicates what manner this
  build is non-standard. Other packages than Tcl can use a subset of these possible identifiers,
  but there is no obligation that all packages should implement all of them.

  | Identifier  | Meaning |
  |:-------:|:----------------:|
  | `compiledebug` | Configured with "--enable-symbols=all", cflag `TCL_COMPILE_DEBUG` |
  | `compilestats`  | Configured with "--enable-symbols=all", cflag `TCL_COMPILE_STATS` |
  | `cplusplus`  | Compiled with a C++ compiler |
  | `debug`  | Configured with "--enable-symbols"|
  | `ilp32`  | Compiled as 32-bit (integers, longs and pointers are all 32-bit) |
  | `memdebug`  | Configured with "--enable-symbols=mem", cflag `TCL_MEM_DEBUG` |
  | `nmake`  | Built with "nmake" in stead of "make"|
  | `no-deprecate`  | Deprecated features are removed, cflag `TCL_NO_DEPRECATED` |
  | `no-thread`  | Compiled without support for threads |
  | `no-optimize`  | Compiler optimization has been switched off |
  | `objective-c`  | Compiled with an objective-c compiler |
  | `objective-cplusplus`  | Compiled with an objective-c++ compiler |
  | `purify`  | Compiled with purify information |
  | `profile`  | Compiled with profile information |
  | `static`  | Compiled as static library |

  More of those can be added in the future.

* Anyone patching Tcl can add its own identifier, so it's clear that
  Tcl is modified. E.g.:

  | Identifier  | Meaning |
  |:-------:|:----------------:|
  | `activestate` | "Activestate" patches are applied |
  | `apple`   | "apple" patches are applied |
  | `androwish`| "androwish" patches are applied |
  | `bawt`    | "BAWT" patches are applied |
  | `bsd`     | "BSD" patches are applied |
  | `cygwin`  | "Cygwin" patches are applied |
  | `debian`  | "Debian" patches are applied |
  | `fedora`  | "Fedora" patches are applied |
  | `freebsd` | "FreeBSD" patches are applied |
  | `microsoft` | "Microsoft" patches are applied |
  | `magicsplat` | "Magicsplat" patches are applied |
  | `openbsd` | "OpenBSD" patches are applied |
  | `redhat`  | "Redhat" patches are applied |
  | `ubuntu`  | "Ubuntu" patches are applied |

  (just examples, you can invent your own). Binary distributions can patch Tcl
  adding their own identifier, even if it's only for 'branding'. There
  could be multiple ones (e.g. "ubuntu" could decide to use the "debian"
  patches as well)

* Calling `tcl::build-info <identifier>` will return `1` if the identifier is
  present in the build-info, `0` if not. But there are 4 pseudo-identifiers:

  | Identifier  | Meaning |
  |:-------:|:----------------:|
  | `commit`   | Returns the commit-id from Fossil (or GIT) |
  | `compiler` | Returns the identifier identifying the compiler used |
  | `patchlevel`| Returns the patchlevel |
  | `version`    | Returns the version |

* The functions `Tcl_FindExecutable`, `Tcl_InitSubsystems`, `Tcl_SetPanicProc` and
  `TclZipfs_AppHook` are modified to return the build-info string as described in this
  TIP. Those functions are meant to be used during Tcl initialization, which allows
  to double-check for presence or absence of certain identifiers as needed by the
  application (e.g. signaling "no-thread" when thread-support is missing).

* Deprecate the array elements tcl_platform[threaded] and tcl_platform[debug].
  In Tcl 9.0 those will be gone.

* Deprecate the following "tcl::pkgconfig" keys: `debug`, `threaded`, `profiled`,
  `64bit`, `optimized`, `mem_debug`, `compile_stats`. In Tcl 9.0 those will be gone.

# Discussion

It has been suggested to put additional keys in tcl::pkgconfig. But tcl::pkgconfig
does not only contain build information, it also contains installation configuration
information (like "bindir,runtime") which is not useful in a build-info string. Also
it would prevent the build-info string to be usable in `Tcl_InitSubsystems()` and
friends (TIP #596), before any Tcl interpreter is created.

An earlier implementation combined this approach with the "package" mechanism,
but this was rejected.

# Implementation

Implementation is in Tcl branch "build-info"

# Compatibility

This is 100% upwards compatible with Tcl 8.6.

# Copyright

This document has been placed in the public domain.

Added tip/600.md.











































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# TIP 600: Migration guide for Tcl 8.6/8.7/9.0
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Informative
	Vote:		No voting
-----
# Abstract

This document explains how strings are represented in Tcl 8.6 resp. 8.7 (and 9.0), and how
that affects the Tcl language. When migrating Tcl scripts from 8.6 to 8.7 (or 9.0), some
commands slightly change behavior.

This migration guide is based on TIP's [#389](https://core.tcl-lang.org/tips/doc/trunk/tip/389.md),
[#497](https://core.tcl-lang.org/tips/doc/trunk/tip/497.md),
[#542](https://core.tcl-lang.org/tips/doc/trunk/tip/542.md),
[#619](https://core.tcl-lang.org/tips/doc/trunk/tip/619.md) ...

This TIP is not separately voted on. It will be finalized after Tcl 9.0 is officially released.

# Dual value representation in Tcl.

Tcl strings can internally be represented in two (or three) ways, as a sequence of bytes or as
a "Unicode string" (a sequence of Tcl\_UniChar's). This internal representation
differs in the various Tcl versions:

* Tcl 8.5,      bytes: [UTF-8](https://en.wikipedia.org/wiki/UTF-8) (up to U+FFFF), string: [UCS-2](https://en.wikipedia.org/wiki/Universal_Coded_Character_Set)
* Tcl 8.6,      bytes: [CESU-8](https://en.wikipedia.org/wiki/CESU-8),          string: [UTF-16](https://en.wikipedia.org/wiki/UTF-16)
* Tcl 8.7,      bytes: [WTF-8](https://simonsapin.github.io/wtf-8/),           utf32string: [UTF-32](https://en.wikipedia.org/wiki/UTF-32),           string: [UTF-16](https://en.wikipedia.org/wiki/UTF-16)
* Tcl 9.0,      bytes: [WTF-8](https://simonsapin.github.io/wtf-8/),           string: [UTF-32](https://en.wikipedia.org/wiki/UTF-32)

The difference in behavior, comparing the different Tcl versions, can be explained by this
difference in internal representation of strings.

Remark: Actually, Tcl uses a variation of [UTF-8](https://en.wikipedia.org/wiki/UTF-8)/[CESU-8](https://en.wikipedia.org/wiki/CESU-8)/[WTF-8](https://simonsapin.github.io/wtf-8/)
in which the NULL character is represented as two bytes `0xC0 0x80`.
This variation is known as [Modified UTF-8](https://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8). Tcl uses the same
modification for [CESU-8](https://en.wikipedia.org/wiki/CESU-8) and [WTF-8](https://simonsapin.github.io/wtf-8/) as well.
Since this modification holds for all Tcl versions, it's not further handled in this document.

Remark 2:  Since utf-8 is the system encoding on most modern UNIX (and MacOS) systems, the examples below can only
be used on UNIX and MacOS, not when using tclsh interactive on Windows (for example).

# encoding "utf-8"

In Tcl 8.6, Emoji are represented internally as two codepoints. So
<pre>
$ tclsh8.6
% encoding convertfrom utf-8 \\xF0\\x9F\\xA4\\x9D
🤝
% string length [encoding convertfrom utf-8 \\xF0\\x9F\\xA4\\x9D]
2
</pre>

Since Tcl 8.7/9.0 switches to UTF-32 for counting the string length:
<pre>
$ tclsh8.7
% encoding convertfrom utf-8 \xF0\x9F\xA4\x9D
🤝
% string length [encoding convertfrom utf-8 \\xF0\\x9F\\xA4\\x9D]
1
</pre>

Tcl 8.5 (and also Tcl 8.6 earlier than 8.6.10) was not able to handle this
at all:
<pre>
$ tclsh8.5
% encoding convertfrom utf-8 \\xF0\\x9F\\xA4\\x9D
🤝 <i>(control characters \\x9F and \\x9D are not printable)</i>
% string length [encoding convertfrom utf-8 \\xF0\\x9F\\xA4\\x9D]
4
</pre>
Any 4-byte utf-8 sequence was simply converted to those separate 4 bytes.
This made the use of Emoji practially impossible when using Tcl 8.6.9 or earlier.

# escaping

In Tcl 8.6, using a system encoding different from UTF-8, you cannot use
Emoji directly in scripts. The only portable way to use them is
the \\u???? construct:
<pre>
$ tclsh8.6
% puts \\uD83E\\uDD1D
🤝
% string length \\uD83E\\uDD1D
2
</pre>

In Tcl 8.7 this is still supported:
<pre>
$ tclsh8.7
% puts \\uD83E\\uDD1D
🤝
% string length \\uD83E\\uDD1D
1
</pre>
Note that this escape sequence appears to produce 2 symbols, a higher and
a lower surrogate. But surrogate pairs are non-conforming in WTF-8, so they are
joined into a single 4-byte sequence right from the start in Tcl8.7.

In Tcl 9.0 it's not possible to do this any more:
<pre>
$ tclsh9.0
% puts \\uD83E\\uDD1D
error writing "stdout": illegal byte sequence
</pre>

Better is to use the 🤝 character directly:
<pre>
$ tclsh8.7
% puts 🤝
🤝
% string length 🤝
1
</pre>


# string compare

Since in Tcl 8.6, Emoji are represented internally as two codepoints:
<pre>
$ tclsh8.6
% string compare 🤝 豈
-1
</pre>
But in Tcl 8.7 and 9.0:
<pre>
$ tclsh8.7
% string compare 🤝 豈
1
</pre>

The reason for this is that 🤝 (U+1F91D) is internally represented as two code-points (U+D83E U+DD1D) while 豈 is
represented as a single code point (U+F900). The "string compare" simply compares all code points from left
to right, and concludes that 🤝 is smaller than 豈, which - in unicode sense - (U+1F91D > U+F900) is not
correct. This is corrected in Tcl 8.7 and 9.0.

Conclusion: When Tcl8.6 strings contain both Emoji and characters between U+E000 and U+FFFF (mostly Private Use,
but also CJK Compatibility Ideographs, Alphabetic presentation forms, Arabic presentation forms, Variation selectors,
Vertical forms, Combining half-marks, CJK Compatibility forms, Small form variants, Halfwidth and Fullwith forms, Specials)
string comparison might not give what you expect.

# string index / string length

In Tcl 8.6:
<pre>
$ tclsh8.6
% string length 🤝
2
</pre>
But in Tcl 8.7/9.0:
<pre>
$ tclsh8.7
% string length 🤝
1
</pre>

Since the "string length" and the "string index" command are related, we cannot
change one without taking the other into account. Therefore, "string index"
behaves differently in the different Tcl version. For example:

In Tcl 8.6
<pre>
$ tclsh8.6
% string index 🤝🤡 0
&#55358; <i>(U+D83E)</i>
% string index 🤝🤡 1
&#56605; <i>(U+DD1D)</i>
</pre>
In Tcl 8.7
<pre>
$ tclsh8.7
% string index 🤝🤡 0
🤝
% string index 🤝🤡 1
🤡
</pre>

This allows looping through the string using "string length" in
combination with "string index".

In Tcl 8.7/9.0 all is OK: Since "string length 🤝" is 1, no special handling is
needed when indexing strings.

# split

Since Emoji are not supposed to be split into surrogates:
<pre>
$ tclsh8.6 <i>(at least 8.6.11)</i>
% split 🤝🤡 {}
🤝 🤡
</pre>

Earlier Tcl versions (even up to 8.6.9):
<pre>
$ tclsh8.5
% split 🤝🤡 {}
ð Ÿ ¤  ð Ÿ ¤ ¡
</pre>

In Tcl 8.6.10 it was partially fixed:
<pre>
$ tclsh8.6
% split 🤝🤡 {}
&#55358; &#56605; &#55358; &#56609; <i>(U+D83E U+DD1D U+D83E U+DD21)</i>
</pre>

This means that - starting with Tcl 8.6.11 - "split" can be used to
iterate over a string, respecting correct border for Emoji. But it
could have unexpected effects. For example the "tcl-telegram" app
has the following function to convert a Tcl string to json form:
<pre>
&#35; Convert TCL string to proper JSON string
proc jString {str} {
	set result ""
	&#35; json::write does escaping for 8-bit characters and adds quotes, but doesn't handle unicode
	set str [json::write string [subst -nocommands -novariables $str]]
	&#35; Convert everything non 8-bit to \\uXXXX sequences
	foreach char [split $str {}] {
		scan $char %c code
		if {$code > 127} {
			append result [format "\\\\u%04.4x" $code]
		} else {
			append result $char
		}
	}
	return $result
}
</pre>

Originally this function couldn't handle Emoji (since Tcl up to 8.6.9 couldn't).
In Tcl 8.6.10 it started working for Emoji (since json expects Emoji to
be converted to surrogate-pairs first). Starting with Tcl 8.6.11 it should (finally) be written as follows:

<pre>
&#35; Convert TCL string to proper JSON string
proc jString {str} {
	set result ""
	&#35; json::write does escaping for 8-bit characters and adds quotes, but doesn't handle unicode
	set str [json::write string [subst -nocommands -novariables $str]]
	&#35; Convert everything non 8-bit to \uXXXX sequences
	foreach char [split $str {}] {
		scan $char %c code
		if {$code > 65535} {
			&#35; split $code into surrogates first
			append result [format "\\u%04.4x\\u%04.4x" \
				[expr {(($code-0x10000)>>10)+0xD800}] [expr {(($code-0x10000)&0x3FF)+0xDC00}]]
		} elif {$code > 127} {
			append result [format "\\u%04.4x" $code]
		} else {
			append result $char
		}
	}
	return $result
}
</pre>

This version works for Tcl 8.6.10 too, and it will continue to work for Tcl 8.7 and 9.0.

# Copyright

This document has been placed in the public domain.

Added tip/601.md.



































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# TIP 601: Make "encoding convertto/convertfrom" throw exceptions
	Author:         Harald Oehlmann <[email protected]>
	Author:         Jan Nijtmans <[email protected]>
	State:          Withdrawn
	Type:           Project
	Vote:           Done
	Tcl-Version:    9.0
	Tcl-Branch:     encodings-with-flags
	Vote-Summary    Accepted 6/0/0
	Votes-For:      FV, JD, JN, KW, MC, SL
	Votes-Against:  none
	Votes-Present:  none
-----
# Abstract

This TIP proposes to change the behavior of `encoding convertto/convertfrom`
in Tcl 9.0, to start throwing an exception on any conversion error.
An additional option `-nocomplain` is proposed to restore the Tcl 8.x behavior.

This TIP is withdrawm, in favor of TIP's [#656](656.md) and [#657](657.md)

# Rationale

The command `encoding convertfrom/convertto` currently does not raise any error on not convertible input.
Instead the following actions are observed:

   *   A replacement character `?` is used.
   *   An incomplete multi-byte sequence is added verbatim.

## Example 1: not encodable character

The Polish character "L with bar" is not contained in ISO-latin 1:

    % set s \u0141
    Ł
    % encoding convertto iso8859-1 $s
    ?

In the ISO-Latin 1 conversion, it is replaced by a question mark by the `encoding convertto` command.

## Example 2: Incomplete sequence returns remaining value verbatim

The following utf-8 sequence has an incomplete final sequence.
The second byte of the two byte sequence of the last character is missing.
The incomplete sequence is interpreted as ISO8859-1 and added to the string.

     % set s [encoding convertfrom utf-8 [string range [encoding convertto utf-8 ÄÖ] 0 end-1]]
     ÄÃ
     % scan $s %c%c
     196 195

The first character value 196 is the correct "Ä" character.
The second character is the verbatim byte of the incomplete utf-8 sequence:

     % scan [encoding convertto utf-8 Ö] %c%c
     195 150

## Use case 1: decode continuous multi-byte data


My personal use-case is a stream of UTF-8 data which is received by a USB character driver and the binary data is cut in 64 byte chunks.
The stream is continuous and I want to decode the received data.
If a UTF-8 byte is received partly, a false byte is created and the next chunk decoding does not work, as it starts with a part of a UTF-8 multibyte sequence.

It would be great to know, where the error is to stop the sequence.

Here is a code snipped with the current implementation:

    % catch {encoding convertfrom utf-8 [string range [encoding convertto utf-8 ÄÖ] 0 end-1]} e d
    1
    % set d
        -code 1\
        -level 0
        -errorstack {INNER {invokeStk1 ::tcl::encoding::convertfrom utf-8 Ã\x84Ã}}
        -errorcode {TCL ENCODING ILLEGALSEQUENCE 2}
        -errorinfo {unexpected byte sequence starting at index 2: '\xC3'
            while executing
            "encoding convertfrom utf-8 [string range [encoding convertto utf-8 ÄÖ] 0 end-1]"} -errorline 1

Note: "\\0x84" was replaced for the control character "IND" for visibility in the stack trace

Note: "C3" is the hexadecimal representation for decimal 195.
Thus, "\\xC3" is the first byte of the utf-8 representation of "Ö".

With this info, the `-errorcode` may be catched by a `try` clause and the error byte location (2) may be catched (see discussion section for an example).
The data before may by passed again to `encoding convertfrom` which is the correct received data.

Note: it would be efficient, if the already converted string may be returned also.
Then, the data must not be passed again to `encoding convertfrom`.
The current implementation does not fullfill this optimisation.

## Use case 2:

This use case is given in the following TCL ticket:
[Ticket 535705](https://core.tcl-lang.org/tcl/info/535705ffffffffff) :

Wrong characters are included in a data base by character replacement when a character not in the current system encoding.
This causes issues in a multi-platform applications, as the error is not detected.

# Specification

## New Option
The `encoding` ensemble will be extended by a new option `-nocomplain`:

    encoding convertfrom ?-nocomplain? ?encoding? data
    encoding convertto ?-nocomplain? ?encoding? data

In Tcl 8.x, `-nocomplain` has no effect since those encoding subcommands
currently never throw an exception:  Any invalid byte/character is replaced
(by **?** or **U+FFFD**). In Tcl 9.0, those subcommands start throwing and exception
on any conversion data error, `-nocomplain` restores the Tcl 8.x behavior.

### Definition of "error position"
The position of the error in the source string is indicated in the error reporting.
In case of multi-byte source data, this position is always one byte after the last correct multi-byte sequence.

###Error Message

The error message is: "unexpected byte sequence starting at index *error position*: '*byte value*'", for `encoding convertfrom`
or "unexpected character at index *error position*: '*character value*'", for `encoding convertto`
where *error position* is a number containing the source string error position as defined above.

*byte value*/*character value* is the hexadecimal representation of the byte in the source string where *error position* points to.

### Error Code

The error code is composed of the following 4 list elements:

1.  Fix word: `TCL`
2.  Fix word: `ENCODING`
3.  Fix word: `ILLEGALSEQUENCE`
4.  Value *error position*: The index in the source string (usually a byte array, in case of `encoding convertfrom`) of the error position.

## New C API

Introduce 2 new functions:

* `Tcl_Size Tcl_ExternalToUtfDStringEx(Tcl_Encoding encoding, const char *src, int srcLen, int flags, Tcl_DString *dsPtr)`
* `Tcl_Size Tcl_UtfToExternalDStringEx(Tcl_Encoding encoding, const char *src, int srcLen, int flags, Tcl_DString *dsPtr)`

These functions behave the same as `Tcl_ExternalToUtfDString/Tcl_UtfToExternalDString`, only they have
an additional `flags` parameter accepting the following additional values (can be used in combination):

* TCL_ENCODING_STOPONERROR: don't replace invalid characters/bytes but return the first error position. Default in Tcl 9.0.
* TCL_ENCODING_NOCOMPLAIN: replace invalid characters/bytes by a default fallback character. Always return `TCL_INDEX_NONE`. Default in Tcl 8.7.
* TCL_ENCODING_MODIFIED: convert NULL bytes to \\xC0\\x80 in stead of 0x00. Only meaningful for "utf-8" and "cesu-8",
ignored for other encodings. This flag may be used together with the other flags.

The TCL_ENCODING_MODIFIED flag can be used in extensions for generating "modified" encodings, such as java
(which uses "modified" cesu-8 internally). This flag is not exposed at script level, unlike `-nocomplain`.

The (already existing) TCL_ENCODING_STOPONERROR flag is only provided for legacy reasons. This flag will be meaningless
starting with Tcl 9.0, therefore will be deprecated in Tcl 9.0 and eventually removed in a future Tcl version (but not yet in 9.0).
In Tcl 9.0, TCL_ENCODING_STOPONERROR will be defined as value 0.

The return value of these two functions is the error-position in case of an error reporting, or `TCL_INDEX_NONE` if everything is OK.

# Discussion

## Ticket 535705

This TIP started in the [TCL ticket 535705](https://core.tcl-lang.org/tcl/info/535705ffffffffff).
Please refer to this ticket for information about the initial discussion.

## Error reporting design

The list of categories for the error code return is given in the [tclvars manual page](http://www.tcl-lang.org/man/tcl8.7/TclCmd/tclvars.htm#M12).
The **TCL** category matches best.

This design allows to catch this error and get the error position by the following `try` pattern:

    try {
        set res [encoding convertto iso8859-1 $input]
    } trap {TCL ENCODING ILLEGALSEQUENCE} {errorMessage errorDict} {
        set errorIndex [lindex [dict get $errorDict -errorcode] 3]
        ...
    }

# Rejected alternatives

## Report the error character

The original implementation reported the failing character/byte in the error message.
This may be a control character corrupting a terminal view.
IMHO error messages should be in the printable ASCII character set.
Therefore this was removed, the character/byte is now only reported in hexadecimal notation.

## -nocomplain as boolean option

An alternative would be to use `-nocomplain 1` in stead of `-nocomplain` and `-nocomplain 0` in stead of `-nocomplain`.
This only makes the command longer, without much benefit.

## -stoponerror

This option is the reverse of `-nocomplain`, but much less descriptive. In combination with `-nocomplain`,
it causes more confusion than that it helps.

## EILSEQ POSIX error code

Recent changes to TCL use the POSIX error **EILSEQ**: "invalid byte sequence", which looks like the most appropriate error message.
Nevertheless, the POSIX message does not allow to return the error position.


# Alternate solutions

See [[607]](607.md), which is not actually an alternative, but was added later on top of this TIP.

# Implementation

Implementation is in Tcl branch `encodings-with-flags`

The original implementation used `size_t` in the function signature, but after [[628]](628.md) this changed to `Tcl_Size`.

# Compatibility

The implementation is fully backward compatible for 8.7.
There is a compatibility break for TCL 9.0.

# Credits

Thanks to Jan Nijtmans for idea and implementation.

# Copyright

This document has been placed in the public domain.

Added tip/602.md.









































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
# TIP 602: Remove tilde expansion in file paths.
	Author:         Harald Oehlmann <[email protected]>
	Author:         Ashok P. Nadkarni <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Tcl-Version:    9.0
	Tcl-Branch:     tip-602
	Vote-Summary:   Accepted 6/0/0
	Votes-For:      AK, JN, KBK, KW, MC, SL
	Votes-Against:  none
	Votes-Present:  none
-----
<!-- TOC BEGIN (auto generated with tiptoc) -->
* <a href='#Abstract'>Abstract</a>
* <a href='#Rationale'>Rationale</a>
* <a href='#Specification'>Specification</a>
    * <a href='#Changeinfilepathtranslation'>Change in file path translation</a>
    * <a href='#Newcommandfiletildeexpand'>New command `file tildeexpand`</a>
    * <a href='#Newcommandfilehome'>New command `file home`</a>
* <a href='#Discussion'>Discussion</a>
* <a href='#Raisedobjections'>Raised objections</a>
* <a href='#Implementation'>Implementation</a>
* <a href='#Changelog'>Change log</a>
* <a href='#Copyright'>Copyright</a>

<!-- TOC END -->


# <a id='Abstract'></a>Abstract

Tcl 8 supports Unix shell-style tilde substitution. This TIP
removes this functionality in Tcl 9.

# <a id='Rationale'></a>Rationale

The Tcl 8 treatment of `~` and `~user` leading components in file paths
passed as arguments to file related commands is convenient for interactive
use. However, the resulting behavior is insecure and error-prone.

Consider the naive attempt to clean out the `/tmp` directory.

```
cd /tmp
foreach f [glob *] {file delete -force $f}
```

A file `~` or `~user` maliciously placed in `/tmp` will have rather
unfortunate consequences.

In addition to being a source of security issues as above, tilde substitution is
also inconvenient when writing robust file handling applications and packages.
Attempting to process Mercurial repositories in Tcl for example, will generate
unexpected errors.

To avoid the above pitfall, all commands that operate on files, such as `open`,
`file` have to check for `~` and prefix with a `./` to disable tilde processing.
On the other hand, display to the user or matching against a user supplied
pattern requires the `./` be not present. Thus glob-like operations have
to account for both cases.

Outside of the shells, this tilde expansion is not seen in any other
commonly used languages, even on Unix. Thus programmers coming from other
languages are not likely to be aware of the above pitfalls and the need
for cumbersome workarounds.

Note this ambiguity in processing impacts use of utility packages as well, such
as the `fileutil` module in `tcllib`, making them unusable.

Although possibly rare in the Unix world, tilde-prefixed files are not uncommon
on Windows systems. Examples include

- Files within Mercurial SCM repository storage (perhaps even present on Unix)
- Files created by Excel prefixed as `~$`
- Directory under the Visual Studio installation of the form `~FC`, `~IC` etc.
- Files in the %TEMP% directory, not clear what application creates these.
- Font caches under AppData

# <a id='Specification'></a>Specification

## <a id='Changeinfilepathtranslation'></a>Change in file path translation

File paths will no longer be subject to tilde expansion in any commands.
They will treat `~` as any other character. This includes commands that
operate on files, like `open`, `exec`, `glob` as well as those operating
on file paths, like `file normalize`, `file tail`, `file basename` etc.

The `file pathtype` command will return `relative` for tilde-prefixed paths.

The `file split` command will not prefix a tilde-prefixed path component with
`./`. Conversely, `file join` will not strip a `./` prefix from an argument
starting with `./~`.

There are a few exceptions where `~` expansion will take place for 

- Initialization of `auto_path` from the `TCLLIBPATH` environment variable
will do tilde expansion on each path. Any expansion that fails because
the user is unknown will not be included in `auto_path`.

- Likewise, initialization of the Tcl module search paths from the
`TCL9_0_TM_PATH` (and similar) environment variables will undergo tilde
expansion. Again, any expansions that fail because of unknown user names
will be excluded. Note that the commands `tcl::tm::add` and `tcl::tm::roots`
will not themselves do any tilde expansion.

- The initialization of the `tcl_pkgPath` variable will undergo tilde expansion
at start up time. This is necessitated by the MacOS configure's use to set
`TCL_PACKAGE_PATH` at build time.

## <a id='Newcommandfiletildeexpand'></a>New command `file tildeexpand`

A new `file tildeexpand` command is added to alleviate compatibility issues and
help resolution of tilde-based paths present in configuration files etc..
The command takes the form

```
file tildeexpand PATH
```

If `PATH` begins with the sequence `~` or `~USER` it is resolved relative to
the home directory of the current user or named `USER` respectively. If
`USER` is not a known user, an error is raised. If `PATH` does not begin with
a tilde, it is returned unmodified.

In the case of `~`, the command returns the value of the `HOME` environment
variable. An error is raised if this does not exist.

In the case of `~USER`, the command retrieves home directory of
the user by platform-dependent means (`TclpGetUserHome` to be precise).

Both the above behaviors clone the 8.x resolution of tildes.

The command makes no guarantees about form of the returned path such
as the separators. Other Tcl commands like `file normalize` etc. should be
invoked on the result if that is important.

## <a id='Newcommandfilehome'></a>New command `file home`

The functionality of retrieving the home directory is exposed through
the new `file home` command. This takes the form

```
file home ?USER?
```

If the `USER` argument is not specified, it returns the value of the
`HOME` environment variable. An error is raised if this does not exist.
On Windows, any backslashes in the path are converted to forward slashes.

If the `USER` argument is specified, it retrieves home directory of
the user by platform-dependent means (`TclpGetUserHome` to be precise).

Both the above behaviors clone the 8.x resolution of tildes.

Retrieval of home directories can also be achieved with the 
`file tildeexpand` command so this command is not strictly necessary.
However, it is more intuitive to use on platforms where the use of tilde
for representing the home directory is not common.

# <a id='Discussion'></a>Discussion

The comp.lang.tcl thread titled "User does not exists when file name start
with ~" on 2021-05-06 had some relevant discussion. 

*From Don Porter*

```
This is a much deeper issue than either that draft TIP or the posts here have
uncovered. The VFS layer has a problem not only with paths beginning with `~`,
but with all paths that have a prefix that can be claimed by a mounted
Tcl_Filesystem. The same ./ prefixing has to be applied to workaround
implications of this unfortunate design. A related matter is that prefixes and
patterns that determine [file system] assignments are not accomplished by a
registration, but by a round-robin game of hot potato. The design flaws are
large and deep. A good solution is a pretty major rewrite. This isn't a quick
fix.

Sometimes I think a good partial solution would be a rewrite that replaced all
the conditional branches that implement the `~` translation pervasively in the VFS
implementation, with a different strategy that made `~` translation available only
through a separately mounted Tcl\_Filesystem that claimed the path names
matching `~*`. In that revised strategy, more scripts and apps would have the
option of unmounting that Tcl_Filesystem to disable the feature.

Some history and additional information in ticket

<https://core.tcl-lang.org/tcl/tktview/2511011>

and probably other tickets I cannot find quickly now. 
```

Although Don points to a broader problem, I think the specific issue with `~`
can be selectively targeted relatively simply without a major rewrite. The
TIP addresses this.

There is also a wiki page dedicated to this issue:

<https://wiki.tcl-lang.org/page/Tilde+Substitution>


Steve Landers on the Tcler's chat suggested

```
On that basis I've been thinking about ways to warn people if their code relies
on ~ expansion. Something similar to what Apple do when they are in the process
of deprecating a feature. The idea isn't well developed but something like 9.0
warns if ~ found in a path with a way to turn off the warning, 9.1 doesn't warn
with a way to turn on the warning. And perhaps only warn if necessary - i.e.
expand the path and if it is different from the unexpanded then warn. But not
sure if that's practical.
```

Sergey Brester on the core mailing list had suggested a per-command switch.
Nothing in the TIP precludes such a feature from being proposed in a 
separate TIP.

# <a id='Raisedobjections'></a>Raised objections

It has been voiced on the chat and mailing lists that this change will break
many scripts. There is no disputing that. However, the dangers and inconvenience
of the workarounds described earlier for current behavior outweigh these. In
principle, differences between handling of characters in pathnames between the
system (and C ABI) and the language should be minimized. The convenience of
translating `~` to the home directory should left to the specific application.
(As an aside, the use of `|` in `open` is another difference but the impact is
minimized because most modern file systems do not permit `|` in paths.)

Another common objection is that this behavior is too engrained into Unix
programmers. However, be it noted that this behavior is only exhibited by the
Unix shell, and not even the individual utilities in Unix. Nor is it seen in the
system ABI, C runtime or other commonly used scripting languages like Python,
Ruby. Unix programmers do not seem to have a problem working with these so it is
unclear why it would only be a problem for Tcl.

As pointed out on c.l.t., breakage is generally easy to spot and fix. To quote,

```
And, the ~ breakage appears in the first run of an old script in a 
future v9 interpreter (file not found error) while the hidden latent 
data dependent bug is just waiting to bite someday.
```

It is also the case that a grep through the sources will find most of the
locations that need to be fixed.

An opposing view has been expressed on the core mailing list that most
occurences are not in sources but configuration files, environment variables,
user input and the like. The expansion of `TCLLIBPATH` and `TM` environment
variables has been added to partially mitigate this. Configuration and user
input will have to be dealt with using the `file tildeexpand` command.

# <a id='Implementation'></a>Implementation

The tip-602 branch contains an implementation for 9.0.

The tip-602-87 branch will contain an implementation of the new command
(without removing implicit tilde expansion) for 8.7.

# <a id='Changelog'></a>Change log

(In reverse chronological order)

- The initialization of `auto_path` and tm paths from environment variables
`TCLLIBPATH` etc. at start up will do tilde expansion.

- The `file home` command has been replaced with the more general
`file tildeexpand` command.

# <a id='Copyright'></a>Copyright

This document has been placed in the public domain.





Added tip/603.md.

















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 603: Get 'stat' Information of Open Files
	Author:         Donal K. Fellows <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        19-Jun-2021
	Post-History:
	Keywords:       Tcl, file
	Tcl-Version:    8.7
	Tcl-Branch:     tip-603
	Vote-Summary:	Accepted 5/1/1
	Votes-For:	AK, DKF, JN, KBK, SL
	Votes-Against:	KW
	Votes-Present:	FV
-----

# Abstract

This TIP proposes adding the ability to get information such as is produced by
`file stat` for an open file. This has security advantages.

# Rationale

With symbolic links and the ability to make substantial changes to a directory
after a file in it is opened, it is necessary to sometimes be able to
determine exact file information about a file that has already been opened.
This has distinct security advantages (once you have a file opened, nobody can
truly take it away from you as you have a lock on the inode or equivalent).
POSIX systems handle this with the `fstat()` system call, available on all
platforms Tcl supports except Windows.

However, on Windows the implementation of `file stat` (`NativeStat()` in
`tclWinFile.c`) works by opening the file and then using
`GetFileInformationByHandle()`. As we already have an open handle in the
situation we are looking to support, using it with that call should be
straight-forward.

# Specification

For at least file handles opened on conventional files, there will be an
additional _read-only_ option that can be retrieved with
`chan configure`: **-stat**. This will return a dictionary (same format as
[TIP #594](594.md) proposes returning) that contains the file information
determined by the `fstat()` or `GetFileInformationByHandle()` system call
(depending on platform) at the time that the call is performed. The option
will not be available for the standard file channel type if the file does not
have a native handle.

It will be undefined whether channels opened on other things will have that
option, but if they do and are defined by Tcl, they _must_ use the same format
of value. (Third-party channels are not so constrained.)

It will be the responsibility of the caller to flush channels prior to calling
if they believe that doing so will make a significant difference to the
results.

This entails no public C API changes.

# Other Options

I considered creating **chan stat** _channel_, but thought that that has the
disadvantage of requiring every channel type to consider adding the
functionality when it only really makes sense for files (and file-like things)
opened on the native filesystem. (For example, it makes no sense at all for
files stored in a mounted zip file.)

This option would require extending the channel API at the C level, and
consequently would be quite a bit more work.

# Copyright

This document is placed in public domain.

Added tip/604.md.



































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 604: Printing Support for Text and Canvas Widgets
	Author:         Kevin Walzer <[email protected]>
	State:          Final
	Type:           Project
	Created:        03-July-2021
	Keywords:       Tk, desktop integration
	Tcl-Version:    8.7
	Vote:			Done
	Vote-Summary:   Accepted 9/0/0
	Votes-For:      MC, JD, KK, FV, DKF, JN, SL, BG, KW 
	Votes-Against:  none
	Votes-Present:  none
	Keywords:		Tk, desktop integration
-----

# Abstract

Most GUI tookits provide an interface to send graphic and text output to a device such as a laser printer. Various extensions and command-line calls have allowed Tk to have rudimentary printing support, but there has never been a consistent API within Tk to offer printing. This TIP proposes to establish a consistent API in Tk to support printing with platform-native dialogs when possible, and with a Tk dialog to drive command-line configuration on other platforms.

# Design

 * Windows: GDI [https://wiki.tcl-lang.org/page/GDI](https://wiki.tcl-lang.org/page/GDI)

 * X11: New development

 * Mac: Cocoaprint [https://wiki.tcl-lang.org/page/cocoaprint](https://wiki.tcl-lang.org/page/cocoaprint)

Existing code from the GDI and cocoaprint extension packages has been refactored and ported into Tk's core; the authors have granted permission to incorporate their code under Tk's BSD-style license. The X11 development will be a Tk dialog that will drive the "lpr" or "lp" commands.

The tk print commands will present a script-level public API implementing the proposed interface, outlined below.


 > **tk print** _window_ 

This command prints the contents of a canvas or text widget.


# Example

A full demonstration of these commands in action has been added to the Tk widget demo under the "Common Dialogs" section, "Printing from canvas and text widgets." Since the API is very simple, one can get a better understanding of the functionality by actually testing it in the demo.


# Implementation 

A draft implementation is currently under development in the tk_print branch.

# Copyright

This document has been placed in the public domain.

Added tip/605.md.





































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 605: Function to get class name from object
	Author:         René Zaumseil <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        15-Jul-2021
	Post-History:   
	Keywords:       Tcl
	Tcl-Version:    8.7
	Tcl-Branch:     tip-605
	Vote-Summary    Accepted 7/0/0
	Votes-For:      AK, FV, JN, KBK, KW, MC, SL
	Votes-Against:  none
	Votes-Present:  none
-----

# Abstract

The ability to get the current class of an object is missing from the
C API, due to
an API oversight. This TIP is about adding that capability.

# Rationale

This TIP intends to add the following public functions to Tcl:

Tcl\_Class **Tcl\_GetClassOfObject**(Tcl\_Object *object*)

Tcl\_Obj  **Tcl\_GetObjectClassName**(Tcl\_Interp *\*interp*, Tcl\_Object *object*)

There is also currently a public function **Tcl\_GetObjectName** to get the object name of an given Tcl\_Obj. A similar function to get the class name does currently not exist. But these information is already existing in the internals of an oo object.

This was always information that should have been obtainable via the
API.

# C Implementation

<pre>
Tcl_Obj *
Tcl_GetObjectClassName(
    Tcl_Interp * interp,
    Tcl_Object object)
{
    Tcl_Object classPtr;
    classPtr = (Tcl_Object)(((Object *)object)->selfCls->thisPtr);
    if (classPtr == NULL) return NULL;

    return Tcl_GetObjectName(interp, classPtr);
}
</pre>

Donal Fellows added the following function:

<pre>
Tcl_Class
Tcl_GetClassOfObject(
    Tcl_Object object)
{
    return (Tcl_Class) ((Object *) object)->selfCls;
}
</pre>

Both functions are created and exported in Branch [tip-605](https://core.tcl-lang.org/tcl/timeline?r=tip-605).

# Discussion

The following alternative was posted by Donal Fellows on tcl-core:

<blockquote>
I’d prefer getting the class to getting the name of the class (the name can be navigated to from there cheaply) as that makes the expensive failure-possible operations be something you can more commonly avoid, but otherwise this seems fine. We could have the name lookup you propose as well. This appears to be an area where I simply didn’t think about putting in any API.

<p>

The operation that I’m looking for is (probably; this is written from memory and I’ve not checked if it compiles):

<pre>
    Tcl_Class Tcl_GetClassOfObject(Tcl_Object object) {
        return (Tcl_Class)(((Object *)object)->selfCls);
    }
</pre>

Technically, the traversing of the <em>thisPtr</em> link is possible via <code>Tcl_GetClassAsObject()</code> and getting the name is the standard op. It’s the <em>selfCls</em> link that’s currently not exposed in the C API at all.
</blockquote>

This discussion was resolved by adding the above function to the TIP
on the grounds that having both functions is fine and they serve
slightly different use-cases.

## Documentation

The following documentation will be added in the **Tcl_GetObjectName** man page:

The function **Tcl_GetObjectClassName** will return  the class name of an existing object. If the given object is not an class NULL is returned. 

# Copyright

This document has been placed in the public domain.

Added tip/606.md.

















































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 606: Export more private Tk functions
	Author:         René Zaumseil <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        15-Jul-2021
	Post-History:   
	Keywords:       Tk
	Tcl-Version:    8.7
	Tk-branch:      tip-606
	Vote-Summary:   Accepted 6/0/0
	Votes-For:      BG, FV, JN, MC, SL, KW
	Votes-Against:  none
	Votes-Present:  none

-----

# Abstract

This TIP proposes to provide public Tk functions for the following private functions:

**void Tk_ClipDrawableToRect(Display * display, Drawable d, int x, int y, int width, int height);**

**void Tk_DrawHighlightBorder(Tk_Window tkwin, GC fgGC, GC bgGC, int highlightWidth, Drawable drawable);**

**Tcl_Obj *Tk_GetSystemDefault(Tk_Window tkwin, const char * dbName, const char * className);**

**int Tk_UseWindow(Tcl_Interp * interp, Tk_Window tkwin, const char * string);**

**void Tk_MakeContainer(Tk_Window tkwin);**

**Window Tk_MakeWindow(Tk_Window tkwin, Window parent);**

**Tk_Window Tk_GetOtherWindow(Tk_Window tkwin);**

**void Tk_SetMainMenubar(Tcl_Interp * interp, Tk_Window tkwin, const char * menuName);**

**void Tk_SetWindowMenubar(Tcl_Interp * interp, Tk_Window tkwin, const char * oldMenuName, const char * menuName);**

The public function will have the same parameters as the private functions.
Only the names will start with "Tk\_" instead of "Tkp".

To get the colors from a border I would propose the following function:

**void Tk_Get3BorderColors(Tk_3DBorder border, XColor * bgColorPtr, XColor * darkColorPtr, XColor * lightColorPtr);**

# Rationale

On creation of new Tk widget types in extensions it is necessary to call private Tk functions.
So extensions depend on a specific Tk version.
If the needed functions exist as public functions these dependencies are gone.

# C-Implementation

The implementation is in the [tip-606 branch](https://core.tcl-lang.org/tk/timeline?r=tip-606).
Courtesy to Jan Nijtmans for providing it.

Here is the source code of the new function to return the color values of the border. Alternatively we could provide one function for each of the 3 color values. 

<pre>
void Tk_Get3BorderColors(
                Tk_3DBorder border,
                XColor *bgColorPtr,
                XColor *darkColorPtr,
                XColor *lightColorPtr)
{
    if (bgColorPtr) {
	*bgColorPtr = *((TkBorder *)border)->bgColorPtr;
    }
    if (darkColorPtr) {
	*darkColorPtr = *((TkBorder *) border)->darkColorPtr;
    }
    if (lightColorPtr) {
	*lightColorPtr = *((TkBorder *) border)->lightColorPtr;
    }
}
</pre>

# Documentation

The following documentation is from inside the source files. these documentation will be added in the Tk C API documentation.

## Added to 3DBorder.3

**void Tk_ClipDrawableToRect(Display * display, Drawable d, int x, int y, int width, int height);**

> Clip all drawing into the drawable d to the given rectangle. If width or height are negative, reset to no clipping.

> Side effects: Subsequent drawing into d is offset and clipped as specified.

**void Tk_DrawHighlightBorder(Tk_Window tkwin, GC fgGC, GC bgGC, int highlightWidth, Drawable drawable);**

> This function draws a rectangular ring around the outside of a widget to indicate that it has received the input focus.

> On Windows, we just draw the simple inset ring. On other sytems, e.g.  the Mac, the focus ring is a little more complicated, so we need this abstraction.

> Side effects: A rectangle "width" pixels wide is drawn in "drawable", corresponding to the outer area of "tkwin".

**void Tk_Get3BorderColors(Tk_3DBorder border, XColor * bgColorPtr, XColor * darkColorPtr, XColor * lightColorPtr);**

> The function returns the 3 used color values of an border object.

## Added to AddOption.3

**Tcl_Obj *Tk_GetSystemDefault(Tk_Window tkwin, const char * dbName, const char * className);**

> Given a dbName and className for a configuration option, return a string representation of the option.

> Results: Returns a Tk_Uid that is the string identifier that identifies this option. Returns NULL if there are no system defaults that match this pair.

## Added to MainWin.3

**void Tk_SetMainMenubar(Tcl_Interp * interp, Tk_Window tkwin, const char * menuName);**

> Puts the menu associated with a window into the menubar. Should only be called when the window is in front.

> Side effects: The menubar is changed.

**void Tk_SetWindowMenubar(Tcl_Interp * interp, Tk_Window tkwin, const char * menuName);**

> Associates a menu with a window.

> Side effects: The old menu clones for the menubar are thrown away, and a handler is set up to allocate the new ones.

## New documentation page WinUtil.3

**int Tk_UseWindow(Tcl_Interp * interp, Tk_Window tkwin, const char * string);**

> This procedure causes a Tk window to use a given X window as its parent window, rather than the root window for the screen. It is invoked by an embedded application to specify the window in which it is embedded.

> Results: The return value is normally TCL_OK. If an error occurs (such as string not being a valid window spec), then the return value is TCL_ERROR and an error message is left in the interp's result if interp is non-NULL.

> Side effects: Changes the colormap and other visual information to match that of the parent window given by "string".

**void Tk_MakeContainer(Tk_Window tkwin);**

> This procedure is called to indicate that a particular window will be a container for an embedded application. This changes certain aspects of the window's behavior, such as whether it will receive events anymore.

**Window Tk_MakeWindow(Tk_Window tkwin, Window parent);**

> This function creates an X window (Mac subwindow) and returns the window id of the created window.

**Tk_Window Tk_GetOtherWindow(Tk_Window tkwin);**

> If both the container and embedded window are in the same process, this procedure will return either one, given the other.

> Results: If winPtr is a container, the return value is the token for the embedded window, and vice versa. If the "other" window isn't in this process, NULL is returned.

# Copyright

This document has been placed in the public domain.

Added tip/607.md.









































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 607: -failindex option for encoding convertto/convertfrom
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        30-Jul-2021
	Post-History:
	Keywords:       Tcl
	Tcl-Version:    8.7
	Tcl-Branch:     tip607-encoding-failindex
	Vote-Summary:   Accepted 5/0/0
	Votes-For:      AK, FV, JN, KW, SL
	Votes-Against:  none
	Votes-Present:  none
-----

# Abstract

This TIP proposes to add a **-failindex** option to encoding convertto/convertfrom.
The implementation brings TIP [[601]](601.md) to the script level.
In case of untransformable data, the error location and the so far transformed string may be retrieved.

# Rationale

Please refer to TIP [[601]](601.md) for usage examples and use-cases.
This tip was extracted from there, but the rationale and many descriptions also hold for this TIP.

Remark, that the wish in use-case 1 to return the so far encoded data is fullfilled by this TIP.

## Option name

The option name **-failindex** is inspired by the option of the **string is** command with the same name and similar functionality.

## Distinguish between error types "incomplete multi-byte sequence" and "not encodable character"

See TIP [[601]](601.md) Example 1 and 2 for the explanation of the two error types.

The two error types are bound to the used command:

*   "incomplete multi-byte sequence" may only appear in **encoding convertfrom**
*   "not encodable character" may only appear in **encoding convertto**

In consequence, no feed-back of the error type is required.
The error position is sufficient.

## TCL 8.7 and TCL 9.0

In TCL 8.7, this interface is the only way to get informed about encoding errors.

In TCL 9.0, the default behaviour is to fail on any encoding errors.
So, this interface may also be helpful to prepare TCL 8.7 scripts for TCL 9.0 and to check where TCL 9.0 would fail.

# Specification

## New option

The command is extended by a **-failindex** option:

    encoding convertfrom ?-failindex posvar? ?encoding? data
    encoding convertto ?-failindex posvar? ?encoding? data

The distinct behaviour is as follows:

*   No conversion error
  * Option **-failindex** not given: Converted data returned as command result.
  * Option **-failindex** given: Additionaly, the value **-1** is written to the given variable in the caller scope.
*  Conversion error present
  * Option **-failindex** not given: In TCL 8.7 or in TCL 9.0 with -nocomplain option, the data is converted with replacement characters as currently done. Otherwise, an error message is thrown by the command (Error Code: **EILSEQ**) (see TIP [[601]](601.md)).
  * Option **-failindex** given: The converted data until the failed index is returned as command result. The position of the conversion error in the source string is written to the specified variable in the caller scope.

The definition of the value written by the -failindex option is given in TIP [[601]](601.md) as "Error position".

This option may not be used together with the TCL encoding option **-nocomplain** of TIP [[601]](601.md). Any attempt to use **-nocomplain** and **-failindex** 
simultaneously is an error case.

# Credits

The proposal was initiated by a post by Andreas Leitgeb 2021-05-12 on the core list.

# Discussion after vote

## Error types

Harald Oehlmann 2023-01-13:
The upper statement, that the error types depend on the conversion direction is wrong.
The command **encoding convertfrom** may have both error types.
See the following examples:

### Example for 'Not convertable character'

     encoding convertfrom -failindex Pos utf-8 A\xC4\x01Z

The byte '\xC4' announces a multi byte sequence.
The following byte must be above \x7F, what is not the case.

The command will return 'A' with value 1 in variable 'Pos'.

### Example for 'Incomplete multi-byte sequence'

     encoding convertfrom -failindex Pos utf-8 A\xC4

The byte '\xC4' announces a multi byte sequence.
Then, nothing follows.

The command will return 'A' with value 1 in variable 'Pos'.

It would really be helpful, if one could make the distinction of the two errors from the return value.
The underlying C routines know the difference.
It is just not exposed to the script level.

Note, that this issue is not present in the channel interface.
Channels always buffer incomplete sequences and never return partial data.

# Copyright

This document has been placed in the public domain.

Added tip/608.md.

























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 608: Add virtual event when font configuration changes
	Author:         Brian Griffin <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        07-Aug-2021
	Post-History:   
	Keywords:       Tk,font,WorldChanged,event
	Tcl-Version:    8.6
	Tk-Ticket:      3049518
	Vote-Summary    Accepted 5/0/0
	Votes-For:      BG, FV, KW, SL, JN
	Votes-Against:  none
	Votes-Present:  none
-----

# Abstract

This tip proposes adding a virtual event that provides script level
access to the WorldChanged callback as defined in the
[Tk_SetClassProcs](https://www.tcl.tk/man/tcl8.6/TkLib/SetClassProcs.html) C API.
This callback, and the proposed virtual
event, are used to notify widgets when a font is changed and that the
layout of the widget needs to be recalculated.  Currently, there is no
script level notification of this event, the only access is via the
WorldChanged C level callback.  See [Tk-Ticket 3049518](https://core.tcl-lang.org/tk/tktview/3049518fffffffffffffffffffffffffffffffff)

# Rationale

Tk and Ttk widgets currently handle font changes via the WorldChanged
callback that each internal widget initiates as part of the widget
construction.  There is no notification, via callback or event,
available at the script level.  This is important for any mega-widget,
or application that implements any sort of layout algorithm at the
script level.  This is also true for items on a Canvas that
include text.  If there is any sizing relationship between these items
and other Canvas items, the layout can become incorrect when the font changes
its size or shape.

# Specification

A new virtual event is defined, **`<<TkWorldChanged>>`**.  This event will
be sent to every widget after the C level callback has been made.  The
user_data field for this event will have value "**FontChanged**" in order
to distinquish this "WorldChange" from any other form of
"WorldChanged" that may be implemented in the future, for example, screen
dimension change or screen resolution change.

# Reference Implementation

See the tk fossil branch
[bug-3049518](https://core.tcl-lang.org/tk/timeline?r=bug-3049518&m&c=1e04d669539944b0)
This implementation has been tested with modifications to the BWidgets
NoteBook widget and the Tablelist widget, solving layout issues these
mega-widgets currently have whenever a font is (re)configured.

# Copyright

This document is placed in the public domain.

Added tip/609.md.



















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 609: Enhance Tcl_ThreadQueueEvent()
	Author:         Christian Werner <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        06-August-2021
	Post-History:   
	Keywords:       Tcl
	Tcl-Version:	8.7
	Tcl-Branch:     tip-609
	Vote-Summary:   Accepted 4/0/1
	Votes-For:      AK, JN, KW, SL
	Votes-Against:  none
	Votes-Present:  FV
-----

# Abstract

This TIP proposes to add a new qualifier to the Tcl_ThreadQueueEvent()
function in order to allow implicit thread wakeup on empty queue condition.

# Rationale

Most code using Tcl_ThreadQueueEvent() is immediately followed by a call
to Tcl_ThreadAlert(). This involves more than one pass through a critical
section locking the same process wide resource. By considering the queue
state (the empty condition) on causing the underlying Tcl_AlertNotifier()
which is the work horse of Tcl_ThreadAlert(), the Tcl_ThreadAlert() can
be completely left out, and the critical section must be locked/unlocked
only once instead of twice, reducing potential spurious wakeups.

# Specification

The new qualifier TCL_QUEUE_ALERT_IF_EMPTY is added for Tcl_ThreadQueueEvent()
eliminating the need to call Tcl_ThreadAlert() afterwards. This qualifier
checks for the state of the event queue of the target thread and perform
an implicit equivalent of Tcl_ThreadAlert() if the queue is empty
at the begin of Tcl_ThreadQueueEvent(). It can be used in combination
('|') with the already existing qualifiers.

# Compatibility

By using conditional compilation and preprocessor symbols it should be
in most cases possible to allow for backward compatibility, e.g.

<code>
 #if (TCL_MAJOR_VERSION > 8) || (TCL_MINOR_VERSION > 6)
  Tcl_ThreadQueueEvent(threadId, &event->header, TCL_QUEUE_TAIL|TCL_QUEUE_ALERT_IF_EMPTY);
 #else
  Tcl_ThreadQueueEvent(threadId, &event->header, TCL_QUEUE_TAIL);
  Tcl_ThreadAlert(threadId);
 #endif
</code>

# Copyright

This document has been placed in the public domain.

Added tip/610.md.













































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 610: Icon Badges
	Author:         Kevin Walzer <[email protected]>
	State:          Final
	Type:           Project
	Created:        21-August-2021
	Keywords:       Tk, desktop integration
	Tcl-Version:    8.7
	Vote: 	        Done
	Vote-Summary:   Accepted 5/0/0
	Votes-For:      MC, SL, JN, FV, KW 
	Votes-Against:  none
	Votes-Present:  none
	Keywords:		Tk, desktop integration
-----

# Abstract

A widely implemented UI element in desktop and mobile applications is an "icon badge," a small image laid over an application icon in a dock, panel or taskbar to indicate a change of state or provide notification of an update. The badge is typically removed when the application is brought into focus. A common example of this is a numeric image on an email program that indicates the number of new or unread messages. This TIP proposes to add a "wm iconbadge" command to Tk to provide this functionality. 

# Design

 * Windows: ITaskbarList3 API [https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-itaskbarlist3-setoverlayicon](https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-itaskbarlist3-setoverlayicon)

 * X11: Custom implementation because Unix-like platforms do not have a standard, widely-used API

 * Mac: NSDockTile [https://developer.apple.com/documentation/appkit/nsdocktile?language=objc](https://developer.apple.com/documentation/appkit/nsdocktile?language=objc)

The X11 implementation will be based on the "wm iconphoto" command and incorporate additional custom badge images that will be shipped with Tk.

The Windows implementation will use the custom badge images developed for this TIP and render them via the native "ITaskbarList3::SetOverlayIcon" API. 

The Mac version will be completely native and implement a Tk wrapper over the NSDockTile API.

The wm iconbadge command will present a script-level public API implementing the proposed interface, outlined below.


 > **wm iconbadge** _window_ _badge_

This command sets an icon badge over a toplevel window icon as it appears in the Dock (macOS), taskbar (Windows) or application panel (X11). The "badge" argument is either a number to indicate a number of new messages or other data points, or an exclamation point to indicate a general call to attention. If the "badge" argument is set to an empty string, the badge icon is removed. 

# Example

To set a badge icon with the number five over the application icon:

	wm iconbadge . 5

To call for attention: 

	wm iconbadge . !

To remove the badge: 

	wm iconbadge . ""

On X11, variable ::tk::icons::base_icon($toplevelwindow) must be set to the base icon (that is: the icon without badge) before calling **wm iconbadge**. **wm iconphoto $window ::tk::icons::base_icon($toplevelwindow)** will get called under the hood.

A demonstration of this command in action has been added to the Tk widget demo under the "Miscellaneous" section, "Window icons and badges." Since the API is very simple, one can get a better understanding of the functionality by actually testing it in the demo.

Screenshot of the wm iconbadge on all three platforms:

[https://imgur.com/gallery/mTqhgMl](https://imgur.com/gallery/mTqhgMl)


# Implementation 

See [tk_badges](https://core.tcl-lang.org/tk/timeline?r=tk_badges) branch.

# Copyright

This document has been placed in the public domain.

Added tip/611.md.























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 611: Add subcommands to the "photo image" command to rotate and reflect an image
	Author:         Arjen Markus <[email protected]>, Richard Suchenwirth <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        2-Sep-2021
	Post-History:
	Tcl-Version:    9.1
	Implementation-URL: https://wiki.tcl-lang.org/page/rphoto
-----

# Abstract

The purpose of this TIP is to enable scripts to rotate a photo image
over +90 or -90 degrees or reflect it in the horizontal or vertical axis.
The image is rotated or reflected in-place.

# Rationale

Various commands, such as subsampling, are already available to
manipulate image data. A simple manipulation that is missing from the
current set of manipulations is rotation over 90 degrees in clockwise
or counter-clockwise direction. Code to so has been available on the
Wiki since 2010.

Reflection is possible by using negative increments for subsampling an
image. This is part of the copy subcommand and creates a new image.

While it would be possible to implement rotation as an option of the
copy subcommand, this presents a delicate problem: how would this
interact with the other options? Should these options be handled in the
order in which they are specified or should there be some hierarchy?

To avoid ambiguities and effects that are difficult to explain, this
TIP proposes to introduce separate subcommands for the two
isometric transformations.

# Proposal

This TIP implements two new subcommands for photo images, _rotate_ and
_reflect_, that have the effect of rotating the image by 90 degrees in a
clockwise or counter-clockwise direction or reflect it in the central
horizontal or vertical axis.

The subcommands are limited to photo images, as that is the most likely
format for which such a facility is useful.

The syntax is:

    $img rotate -90/90

where -90 means a clockwise rotation and 90 a counter-clockwise rotation.
(Note: the angle should for the moment be a multiple of 90 degrees.)

For reflection the syntax is:

    $img reflect h(orizontal)/v(ertical)

where "h" (or any abbreviation of "horizontal") means reflection in the
central horizontal axis and "v" (or any abbrebation of "vertical") means
refletion in the central vertical axis.

A reference implementation for rotating an image in place exists as
a standalone extension -- https://wiki.tcl-lang.org/page/rphoto.

Moreover, Christian Werner has proposed an implementation for this TIP for both rotation and reflection, see <https://core.tcl-lang.org/tk/tktview/2058b607301bca07ed3bea2114579a01a42a6756>

The patch accepts angles other than multiples of 90 degrees and then
determines the closest multiple. An alternative could be to issue an
error message.

# Copyright

This document has been placed in the public domain.

Added tip/612.md.

















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 612: Setting WM_CLASS for main/root window
	Author:         Benjamin Schnitzler <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        9-Dec-2021
	Post-History:
	Tcl-Version:    9.1
	Keywords:       Tk
-----

# Abstract

This TIP proposes a command to allowing setting of a toplevel's class
(especially the main window) after the creation of the window.

# Rationale

Currently there seems to be no way to set the application class of the
`WM_CLASS` property after the creation of the window. (It is possible to set
the application name using `tk appname <appname>`.) It should be possible to
update the application class, e.g. with a command like
`tk classname <classname>`.

# Proposal

This TIP proposes making the `-class` property of toplevels (and frames,
because of shared code) be settable (with the `configure` method) after the
widget is created. Note that doing this will not change the value of any
options that have already been looked up (though it will affect _future_ calls
to `option get`), nor will it change the `bindtags` of the widget.

Note that setting the class of toplevels is currently possible at widget
creation time. For the main application window, this means passing the
`-class` option in the arguments processed by `wish` or during
`package require Tk`.

# Copyright

This document has been placed in the public domain.

Added tip/613.md.



















































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 613: New INDEX\_NULL\_OK flag for Tcl_GetIndexFromObj*()
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        09-Dec-2021
	Post-History:   
	Keywords:       Tcl Tcl_GetIndexFromObj() Tcl_GetIndexFromObjStruct()
	Tcl-Version:    8.7
	Tcl-Branch:     tip-613
	Vote-Summary:   Accepted 7/0/0
	Votes-For:      BG, FV, JD, JN, KW, MC, SL
	Votes-Against:  none
	Votes-Present:  none

-----

# Abstract

This TIP proposes a new `INDEX_NULL_OK` flag for `Tcl_GetIndexFromObj*()` as `TCL_INDEX_NULL_OK`,
and allow other variable types (like `enum`, `short`, `long`, `long long`, both signed and unsigned)
for the `indexPtr` variable.

It also proposes to implement the `TK_OPTION_NULL_OK` flag in Tk for the
options `TK_OPTION_BOOLEAN`, `TK_OPTION_JUSTIFY` and `TK_OPTION_ANCHOR`, in
the same way as already present for `TK_OPTION_RELIEF`, and for `TK_OPTION_INT`
in the same way as already present for `TK_OPTION_DOUBLE`.

# Rationale

In <b>Tk</b>, serveral options allow the empty string, but since `Tcl_GetIndexFromObjStruct()` cannot handle
the empty string as input well, this results in special code in Tk to handle that. This is
not always done correctly, e.g.:
<pre>
$ wish8.6
% text .t
.t
% .t tag configure dummy -relief {}
% .t tag configure dummy -relief xxx
bad relief "xxx": must be flat, groove, raised, ridge, solid, or sunken
% .t tag configure dummy -wrap {}
% .t tag configure dummy -wrap foo
bad wrap "foo": must be char, none, word, or 
% 
</pre>
So, the error-message doesn't even mention that "" is a valid value, or it forgets
to quote the empty value.

The cause of the problem is [here](https://core.tcl-lang.org/tk/file?udc=1&ln=27&ci=73d9515d7f13f6fa&name=generic%2FtkTextTag.c):
the empty string is made part of a string array used by `Tcl_GetIndexFromObj*()`.

The meaning of `TCL_INDEX_NULL_OK` is that `Tcl_GetIndexFromObj*()` no longer
gives an error when indexPtr is supplied a NULL or "" argument, but it will return TCL_OK
and provide the index "-1". This functionality can then be used by Tk:
<pre>
$ wish8.7
% text .t
.t
% .t tag configure dummy -wrap {}
% .t tag configure dummy -wrap foo
bad wrap "foo": must be char, none, word, or ""
% 
</pre>

The `indexPtr` parameter of `Tcl_GetIndexFromObj*()` always had to point to
an integer variable, but this TIP changes the parameter to type `void *`
which can point to almost anything. This is done by using a wrapper macro,
which makes the `sizeof()` of the variable available to the function.
So any scalar value, being an enum or some kind of integer (1-, 2-, 4- or 8-byte)
will work. `indexPtr` can also be `(int *)NULL`, then nothing will be written to it.

For Tk, the enum's `Tk_Anchor` and `Tk_Justify` will get new members
`TK_ANCHOR_NULL` resp. `TK_JUSTIFY_NULL` with value -1, equivalent with
the already existing `TK_RELIEF_NULL` (which is not an enum for historical reasons).
Without the `TK_OPTION_NULL_OK` flag in the `TK_OPTION_JUSTIFY` and `TK_OPTION_ANCHOR`
config information, everything functions as before, but when using the
`TK_OPTION_NULL_OK` flag, the new enum values become valid values for those configuration options.

For `TK_OPTION_BOOLEAN`, the new possible value, when using the `TK_OPTION_NULL_OK`
flag, is -1. This would allow the `-elide`, `-overstrike` and `-underline`
options for text tags, currently implemented using `TK_OPTION_STRING`,
to be re-implemented without the need for extra error-checking in the code,
since `TK_OPTION_BOOLEAN` already takes care of that. This rewrite is not
done in the [`tip-613`](https://core.tcl-lang.org/tk/timeline?r=tip-613), 
branch in order to demonstrate that this TIP does not break current code.

For `TK_OPTION_DOUBLE`, using the `TK_OPTION_NULL_OK` flag will mean that
the NULL value will be translated to the internal value `NaN` (Was: 0.0).
The reason for this change is that this makes it possible to distinguish
the empty string from 0.0, without storing the original Tcl_Obj in
the widget structure.

For `TK_OPTION_INT`, using the `TK_OPTION_NULL_OK` flag means that
the NULL value will be translated to internal value `INT_MIN`. Also,
`TK_OPTION_PIXEL` is changed the same way as  `TK_OPTION_INT`.

The change in `TK_OPTION_DOUBLE`/`TK_OPTION_INT` would allow the
`-width`/`-relWidth`/`-height`/`-relHeight` options to be re-written
such that the flags (CHILD_WIDTH et al.) are not needed any more. This
rewrite is not done in the [`tip-613`](https://core.tcl-lang.org/tk/timeline?r=tip-613), 
branch in order to demonstrate that this TIP does not break current code.

# Caveat

Some extensions might have set the `TK_OPTION_NULL_OK` flag already, even
though it never worked. This might result in "" as possible option value, which was
previously impossible, and what might lead to new unexpected behavior. Examples
are [this bug](https://core.tcl-lang.org/tk/tktview?name=be8f5b9fc2) in Tk menu's and
[this bug](https://core.tcl-lang.org/tk/tktview?name=6178610b1b) in Themed Tk.
Solution: the extension should no longer use the `TK_OPTION_NULL_OK` flag,
or expect Tcl 8.7 as a minimum and take care that the value -1 is handled properly.
One extension known to be broken this way is [3dcanvas](https://3dcanvas.tcl.tk/home).

The change in the `TK_OPTION_NULL_OK` for `TK_OPTION_DOUBLE` (using NaN as
internal representation in stead of 0.0) and for `TK_OPTION_INT`/`TK_OPTION_PIXEL`
(using INT_MIN as internal representation in stead of 0) is a potential incompatibility
if the Tcl_Obj is not stored in the widget structure. In Tk, there is no code
affected (it is used only in `-width`/`-height`/`-relWidth`/`-relHeight`
for the `place` command).

# Implementation

Available in the [`tip-613`](https://core.tcl-lang.org/tcl/timeline?r=tip-613) branch.

There's a [`tip-613`](https://core.tcl-lang.org/tk/timeline?r=tip-613) branch in Tk as
well, implementing the `TK_OPTION_NULL_OK` flag for `TK_OPTION_BOOLEAN`,
`TK_OPTION_JUSTIFY` and `TK_OPTION_ANCHOR`, using Tcl's `TCL_INDEX_NULL_OK` flag.

Finally there's a [`tip-613-demo`](https://core.tcl-lang.org/tk/timeline?r=tip-613-dem)
branch in Tk as well. This branch changes the "place" command and the implementation
for the `-elide`, `-overstrike` and `-underline` text tags, to use the new functionality.

This branch targets 8.7.

# Copyright

This document has been placed in the public domain.

Added tip/614.md.





















































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# TIP 614: Windows: OS: WTSSESSION change notification
	Author:         Harald Oehlmann <[email protected]>
	State:          Rejected
	Type:           Project
	Vote:           Done
	Created:        14-Jan-2022
	Tcl-Version:    8.7
	Tk-Ticket:      8a49f43b
	Tk-Branch:      tip614-win-wtssession-change
	Vote-Summary:   Rejected 1/2/2
	Votes-For:      JN
	Votes-Against:  FV, KW
	Votes-Present:  MC, SL

-----

# Abstract

Add a TK notification when a Tk program in a Windows OS session is disconnected or connected to the user.

# Rationale

On Windows operating system, sessions (e.g. a whole desktop environment with all running programs) may be disconnected from the user and put into a hold state.
There might be shared resources, which should only be active, if the program is connected to the user.

In my personal case, there is a barcode scanner connected by a serial interface.
If a session is disconnected by the "Change User" button in the start menu, the serial interface should be closed.
So, the new user in a new session may use the barcode scanner and it is not blocked by the disconnected session.

# Proposal

The following new protocols are added to the **wm protocol** command:

*   **WTS_CONSOLE_CONNECT** and **WTS_CONSOLE_DISCONNECT** are sent on console connect/disconnect like a user change.
*   **WTS_REMOTE_CONNECT** and **WTS_REMOTE_DISCONNECT** are sent on remote connect/disconnect.
*   **WTS_SESSION_LOGON** and **WTS_SESSION_LOGOFF** are sent on session logon/logoff.
*   **WTS_SESSION_LOCK** and **WTS_SESSION_UNLOCK** are sent when the session is locked by the user or on any upper action (as session lock is a side effect).

# Reference Implementation

See the tk fossil branch [tip614-win-wtssession-change](https://core.tcl-lang.org/tk/timeline?r=tip614-win-wtssession-change&).

Francois Vogel has commented the implementation and discussed the following points:

## Double definition of macro "CurrentTime"

	/*
	 * Macro CurrentTime is defined in X.h.
	 * CurrentTime is used as a variable name in the following include.
	 * Thus, undefine it and define it back afterwards
	 */

	#undef CurrentTime
	#include<wtsapi32.h>
	#define CurrentTime          0L	/* special Time */
	#include "tkWinIco.h"

This looks a bit ugly. Isn't there a possibility to reorder the includes to avoid this? Doesn't this name conflict have some significance?

Harald answer:

It is definitively ugly.
It would be great to get a define with the name "CurrentTime" out of the public TCL headers. IMHO, there should never be a define without a "TCL_" prefix.
Any recommendations welcome.

## Symetry of calls to "WTSRegisterSessionNotification"/"WTSUnRegisterSessionNotification"

Another question. There is the following comment:

	     * Note: the Windows API requires to call
	     * WTSUnRegisterSessionNotification for each prior call to
	     * WTSRegisterSessionNotification.  This would require to store
	     * the registration fact somewhere and to call unregister on
	     * windows destroy if registered. This is currently not implemented
	     * and has probably no negative impacts.

Is this "no negative impacts" statement just your guess? Or do we introduce here some sort of Damocles sword that will hit us when expected the least? Note that the code in fact really calls WTSUnRegisterSessionNotification just below that comment, which makes me wonder whether this comment is correct?

Moreover, the documentation says:

When a window no longer requires these notifications, it must call WTSUnRegisterSessionNotification before being destroyed. For every call to this function, there must be a corresponding call to WTSUnRegisterSessionNotification.

Is this call before destroy implemented somewhere?

Harald answered:

The backround to call "WTSUnRegisterSessionNotification" before registering it is, that we would get two notifications, if this is registered twice. So, it is unregistered just for the case it was registered before.

so:
wm protocol . WTS_SESSION_LOGON myproc
-> first registration for Window ".", unregistration fails but does not harm.
wm protocol . WTS_SESSION_LOGOUT myproc
-> 2nd registration for window ".", so unregistration is necessary.

"No negative impacts" means, that messages are never delivered, if the window is destroyed.

I agree, that it would be cleaner to:
- save the fact if registered with the window data structure
- call WTSUnRegisterSessionNotification on window destruction, if the registration took place.

I have to say, that such a solution is far from my programming skills.
In consequence, I added the two warnings and implemented it with my limitted skills. 

I may improve the implementation and follow two paths:

*   Register any toplevel for session reporting and unregister on toplevel destroy
*   Add a flag to the toplevel data structure, which is set on registration. If set, unregister on toplevel destroy.

I planned to write a "help request" on the core list to check those paths.
As vote is currently in progress, I have to wait for the vote result.

# Test

To test the functionlity, user activity is required.
There are no automated tests.

Here are some manual tests:

## Lock screen detection

Enter in a wish compiled from branch "tip614-win-wtssession-change":

    wm protocol . WTS_SESSION_LOCK "puts locked"
    wm protocol . WTS_SESSION_UNLOCK "puts unlocked"

Then lock your screen, for example by Windows+L key combination.
When you unlock back, you will see the text "locked" and "unlocked".

## Change user

Enter in a wish compiled from branch "tip614-win-wtssession-change":

    wm protocol . WTS_CONSOLE_CONNECT "puts connect"
    wm protocol . WTS_CONSOLE_DISCONNECT "puts disconnect"

Then open the start menu and select "change user".
Then log back in with the same user.
You will see the text "disconnect" and "connect" in the console window.
If the upper lock screen example is still active, you will also see "locked" and "unlocked".

# Discussion

## protocol names

The used protocol names are identical to the corresponding windows message define as listed in "[WM_WTSSESSION_CHANGE](https://docs.microsoft.com/en-us/windows/win32/termserv/wm-wtssession-change)".

## implementation within wm protocol

There is a similar protocol on windows: **wm protocol WM_SAFE_YOURSELF** which reacts on the windows message **WM_QUERYENDSESSION**.
This windows message is also session related and of similar nature.
In consequence, this TIP is the extension of this behaviour

## Why not in TCL, why with "wm protocol" ?

Strictly speaking, session control functionality belongs to TCL, not Tk.
And it belongs to an application, not a particular toplevel window.

In contrast to those drawbacks, it is an extension of the existing **wm protocol WM_SAFE_YOURSELF** command, which exists already.
It is logical, to place the new functionality close to this command.

## Why not multi-platform ?

This is a Windows platform only TIP.
Contributions and opinions for other platforms are welcome.
Specially the message about a screen lock should exist on all platforms.

### Implementation sketch on Linux

Christian Gollwitzer contributed on the core list information about Linux window managers:

On Linux, these things are solved by "dbus", which is an interprocess communication system for desktop OSes. Here is a description of the screensaver interface:
[GNOME Screensaver](https://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html).

Despite this being a GNOME description, it works also on KDE and maybe others, because freedesktop.org atempts to standardize these APIs.

Fortunately, there is a dbus extension for Linux available by Schelte:
[TCL DBUS](https://wiki.tcl-lang.org/page/dbus%2Dtcl).
Actually, it would make sense to include dbus in Tcl9 / Tk 9 as a
standard extension.

dbus is an IPC protocol like DDE and Apple Events.
With dbus you can both call a remote function and receive notifications on events that happen within the system.

dbus itself is agnostic of the purpose, but common Linux desktops (KDE, Gnome, partly XFCE...) use dbus to control the various desktop processes, and they currently try to harmonise on a common dbus protocols (freedesktop.org).

Here is some code in Python which uses dbus to do almost exactly what Harald suggests:
[Wait for dbus session lock unlock message](https://stackoverflow.com/questions/58418885/wait-for-dbus-session-lock-unlock-messages).

If Schelte's package were included in core Tk, then sending an event on session lock/unlock would be a few lines of dbus code for Linux with no need for C level code, i.e. translate the Python from the link above. 

## Why not in Tk 8.6 ?

This enhancement may be seen as a bugfix to the **wm protocol WM_SAFE_YOURSELF** and thus may go to Tk 8.6.
I would personally favor this, as Tk 8.6.13 may arise this year while Tk 8.7 is still in alpha phase and a release date is not in view.

## Why was this TIP rejected?

There are two issues with the TIP:

### Implementation

The upper symetry of the notification calls was not fullfilled, what is not in conformance.
An implementation sketch by Christian Werner introduced platform-specific code into generic code, what was seen as a no-go.

The implementation sketch is as follows:

   -    Add a new flag to TkWIndow flag field: #define TK_WIN_SESSION_NOTIFICATION_ENABLED       0x200000
   -   Use this flag to do the rgistration in win/tkWinWm.c
   -   If flag set, undo the rgistration in Tk_DestroyWindow. There is no way to do this in the Windows-only part of Tk, so we will have an ifdeffed part in the generic file.

## Should be in TCL

This functionality should be moved to a notification framework within TCL and not Tk.

# Copyright

This document has been placed in the public domain.

Added tip/615.md.































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 615: string is index
	Author:         Jan Nijtmans <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Tcl-Version:    9.1
	Tcl-Branch:     tip-615
-----
# Abstract

This TIP proposes a new command "string is index". It returns 1 if the provided
value is a valid index (such as `15` or `end-2`), 0 otherwise. See also
[TIP #502](https://core.tcl-lang.org/tips/doc/trunk/tip/502.md).

Also, it prepares the way to handle the empty string as allowed index value.

# Specification

TODO

# Implementation

Implementation is in [Tcl branch "tip-615"](https://core.tcl-lang.org/tcl/timeline?r=tip-615)

# Compatibility

This is 100% upwards compatible with Tcl 8.6.

# Copyright

This document has been placed in the public domain.

Added tip/616.md.





















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 616: Tcl lists > 2^31 elements
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Tcl-Version:    9.0
	Tcl-Branch:     tip-616
	Vote-Summary:   Accepted 3/0/2
	Votes-For:      JN, KBK, KW
	Votes-Against:  none
	Votes-Present:  FV, SL
-----
# Abstract

This TIP proposes to extend the Tcl API for lists and dicts such that they
can handle more than 2^31 elements. Also many functions involved with
parsing are extended the same way.

# Specification

The stub table is extended with 7 new functions:
<pre>
int Tcl_ListObjGetElements(Tcl_Interp *interp, Tcl_Obj *listPtr,
	Tcl_Size *objcPtr, Tcl_Obj ***objvPtr)
int Tcl_ListObjLength(Tcl_Interp *interp, Tcl_Obj *listPtr,
	Tcl_Size *lengthPtr)
int Tcl_DictObjSize(Tcl_Interp *interp, Tcl_Obj *dictPtr, Tcl_Size *sizePtr)
int Tcl_SplitList(Tcl_Interp *interp, const char *listStr, Tcl_Size *argcPtr,
	const char ***argvPtr)
void Tcl_SplitPath(const char *path, Tcl_Size *argcPtr, const char ***argvPtr)
Tcl_Obj *Tcl_FSSplitPath(Tcl_Obj *pathPtr, Tcl_Size *lenPtr)
int Tcl_ParseArgsObjv(Tcl_Interp *interp, const Tcl_ArgvInfo *argTable,
	Tcl_Size *objcPtr, Tcl_Obj *const *objv, Tcl_Obj ***remObjv)
</pre>

Also, wrapper macro's are put around those 7 functions, such that - depending
in the size of the "Tcl_Size *" argument (either sizeof(int) or sizeof(ptrdiff_t))
the correct stub entry is called, either the original one or the new one.
This way, extensions can decide to continue to use an "int" or change the code
to use "Tcl_Size" as variable type, supporting an enhanced range for list/dict's.
This is how source compatibility is kept.

Currently, the functions `Tcl_ListObjGetElements`, `Tcl_ListObjLength`,
`Tcl_DictObjSize` and `Tcl_SplitList` return `TCL_ERROR` when the
the list/dict has invalid syntax. Starting Tcl 9.0, those function can also
return `TCL_ERROR` when `objcPtr`/`lengthPtr`/`sizePtr` points to a variable
of type `int` and the list/dict has more than 2^31 elements.

In Tcl 8.7, the same functions are added to the stub table, but there
the functions are just wrappers calling the original functions. The
goal is to allow the new API to be used in 8.7 too, but without
actually being able to use more than 2^31 elements in lists/dicts.

The full list of API changes is [here](https://core.tcl-lang.org/tcl/fdiff?v1=9ac47021a2d033d4&v2=c29cc23d2113019e)

# Implementation

Implementation is in [Tcl branch "tip-616"](https://core.tcl-lang.org/tcl/timeline?r=tip-616).

There is also a minimal Tcl 8.7 implementation in [Tcl branch "tip-616-for-8.7"](https://core.tcl-lang.org/tcl/timeline?r=tip-616-for-8.7)

# Caveat

There is one change in `Tcl_Token` that could cause compiler warnings: the extension of the
`commentSize` and `numTokens` fields, which are now unsigned since they can never be negative.
Comparing those values with signed numbers will result in a compiler warning, even though
there is no problem at all: the code keeps functioning fine. Solution: always compare those
fields with unsigned numbers. A type-cast could be also used to silence this warning.

Even though the API changed to allow larger values, internally not everywhere this
additional range can be used. For example, commands still don't accept more than
2^31 elements, so lists larger than that cannot be used as commands. Work will
continue to allow that in the future, but it's not done in this TIP yet.

# Addendum

After [TIP #660](660.md) was accepted, a lot of functions changed from
using size\_t to ptrdiff\_t parameters. In order to prevent confusion,
this change has been adapted in the TIP text above as well.

# Compatibility

The proposed changes for Tcl 9 are source compatible, but _NOT_ binary
compatible: All extensions compiled with Tcl 9 headers will have to
be recompiled, but no source-code changes are necessary. 
The additions for Tcl 8.7 are 100% upwards compatible with Tcl 8.6.

# Copyright

This document has been placed in the public domain.

Added tip/617.md.





































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 617: Tcl_WCharLen/Tcl_Char16Len
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Tcl-Version:    8.7
	Tcl-Branch:     tip-617
	Vote-Summary:   Accepted 3/0/2
	Votes-For:      JN, MC, KW
	Votes-Against:  none
	Votes-Present:  FV, SL
-----
# Abstract

This TIP proposes to extend the Tcl API with 2 new functions: `Tcl_WCharLen`/`Tcl_Char16Len`

# Specification

This functions do about the same as `Tcl_UniCharLen`, which was earlier marked as deprecated
[TIP #542](542.md). However, it is used in [tDOM](http://www.tdom.org/), and - in fact -
simple enough to be provided. Since [TIP #542](542.md) provides `Char16`/`WChar`
versions of many UTF-8-related functions, this one should be handled the same for consistency.

# Implementation

Implementation is in [Tcl branch "tip-617"](https://core.tcl-lang.org/tcl/timeline?r=tip-617)

# Compatibility

This is 100% upwards compatible with Tcl 8.6.

# Copyright

This document has been placed in the public domain.

Added tip/618.md.





























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 618: New Tcl\_GetBool* functions with TCL\_NULL\_OK flag
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Post-History:   
	Keywords:       Tcl Tcl_GetBoolFromObj() Tcl_GetBool()
	Tcl-Version:    8.7
	Tcl-Branch:     tip-618
	Vote-Summary   Accepted 5/0/0
	Votes-For:     FV, JN, KW, MC, SL
	Votes-Against: none
	Votes-Present: none
-----

# Abstract

This TIP proposes new functions `Tcl_GetBoolFromObj`/`Tcl_GetBool` which are the same as
`Tcl_GetBooleanFromObj`/`Tcl_GetBoolean` but have an additional `flags` parameter, and use `char`
as variable type. Also accepted is the `TCL_NULL_OK` flag, which is - actually - a renamed
`TCL_INDEX_NULL_OK`: We wouldn't want a separate `TCL_BOOL_NULL_OK`.

If `Tcl_GetBooleanFromObj`/`Tcl_GetBoolean` is provided the `TCL_NULL_OK` flag, it can
output not only 0 or 1 but also '\\xFF'. Without the `TCL_NULL_OK` flag, the only
possible outcomes are 0 and 1. In Tcl, there is not much usage for the `TCL_NULL_OK`,
flag but in Tk it is more common to have values which can be empty as well as 0 or 1.
E.g. the  `-elide`, `-overstrike` and `underline` options of text tags.

# Rationale

The functions `Tcl_GetBooleanFromObj`/`Tcl_GetBoolean` store a boolean value
into a `int`, which - in many cases - is overkill since 0 and 1 are the
only possible value.

With the new functions, we can do:
<pre>
    #include &lt;tcl.h&gt;
    char bool1;
    Tcl_Obj *obj = Tcl_NewStringObj("true", -1);
    Tcl_GetBoolFromObj(NULL, obj, 0, &bool1);
</pre>

Also, the functions `Tcl_GetBoolFromObj`/`Tcl_GetBool` have an additional
`flags` parameter. At this moment only the values 0 and `TCL_NULL_OK`
are allowed. Thanks to the `TCL_NULL_OK` flag, we can replace
[this](https://core.tcl-lang.org/tk/file?udc=1&ln=627-636&ci=fb97d090b5ae34a8&name=generic%2FtkConfig.c)
code in Tk with a single call to `Tcl_GetBoolFromObj()`: The  `-elide`,
`-overstrike` and `-underline` options for text tags are already mentioned,
that's the intended usage of this flag.

Other flag values can be added in the future.

# History

This TIP has been in vote before, with the result of only gaining one
YES vote and 3 PRESENT votes. There were 2 main remarks, indicating this
TIP did too many things at once, the implications of that couldn't be grasped
by the voters. Therefore, the TIP has been rewritten (and the implementation
simplified). The remarks were:

1) "... I don't think I grok the entire implications of the discussion we
had on this list about (void *) abuses".

In C, "void *" can be used when the function accepts multiple different types.
E.g. `malloc()` or `memcpy()` are perfect examples, but also the use of
`ClientData` in Tcl is not an abuse of "void *". The caller is responsible
making sure that a pointer of the correct type is used. In the case of
`Tcl_GetBoolFromObj`/`Tcl_GetBool`, the function accepts any 1-, 2-, 4-
or 8-byte enum, bool or integer type. As long as the functions know
the sizeof() of the variable, no invalid memory will be addressed.

The suggestion is also done to split this into different functions depending
on the sizeof() the variable. That would be possible, but then 8 new
functions should be added, and - still - a "void *" should be used as
last argument: possible 1-byte types could be bool, char, signed char or
unsigned char. 2-byte types could be VARIANT_BOOL, wchar_t, short or
unsigned short. We don't want functions for every possible type here,
when the sizeof() the variable is the only thing we really care about.
 
2) "Even after sleeping over it I find myself unable to agree to the macro
shenanigans for the transmission of the size of the referenced
variable, even while admiring the hackishness of it."

The implementation rewrite doesn't use macro's any more.

# Implementation

Available in the [`tip-618`](https://core.tcl-lang.org/tcl/timeline?r=tip-618) branch.

This branch targets 8.7.

# Copyright

This document has been placed in the public domain.

Added tip/619.md.















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 619: New TCL\_COMBINE flag for Tcl\_UniCharToUtf()
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Post-History:   
	Keywords:       Tcl Tcl_UniCharToUtf()
	Tcl-Version:    9.0
	Tcl-Branch:     tip-619
	Vote-Summary:   Accepted 4/0/1
	Votes-For:      AK, JN, KW, SL
	Votes-Against:  none
	Votes-Present:  FV
-----

# Abstract

This TIP proposes a new flag `TCL_COMBINE` to be used for the
function `Tcl_UniCharToUtf()`. With this flag, the function
`Tcl_UniCharToUtf()` will try to combine surrogates (code
range \UD800 - \UDFFF), otherwise surrogates are handled
as if they were valid codepoints.

This TIP is designed as a solution for [this](https://core.tcl-lang.org/tcl/tktview?name=0d61d3a2bb)
ticket: "Tcl interprets two adjacent surrogate code points as a character encoded using UTF-16".
Currently, the internal use of UTF-16 is visible in some strange behavior at script level:
Whenever a high surrogate character is glued together with a low surrogate character
(which - individually - would be illegal), they form a valid Unicode character.
This TIP is written to get rid of that strange behavior in Tcl 9.0. All places in the
code where this special behavior is handled, it won't be handled this special
way any more: surrogate characters are illegal, but they can be handled - internally -
by Tcl 9.0. They won't be combined and - magically - become valid any more.

# Rationale

In Tcl 9.0 currently:
<pre>
    $ tclsh9.0
    % string length \\uD83D\\uDE02
    1
</pre>
But
<pre>
    $ tclsh9.0
    % string length \\uD83D\\uD83D
    2
</pre>
Whenever surrogate pairs are encountered in a Tcl script, the
surrogates are automatically combined into a single Unicode
character. This cannot not be changed in Tcl 8.7 for three reasons:

* Compatibility with Tcl 8.6. In Tcl 8.6, the \\U?????? representation
  doesn't work yet, so there is no other way to encode Emoji then
  by a surrogate pair \\u????\\u????.
* The "string" objType has an internal UTF-16 representation, which
  cannot distinguish between a surrogate pair and a Unicode character > U+FFFF.
  In Tcl 9.0, the "string" objType uses UTF-32.
* Since single surrogate characters cannot be represented in UTF-8, this
  opens the possibility of violations against the UTF-8 standard. But
  [TIP #601](601.md) is accepted now, which can detect those violations.

Those 3 restrictions are gone in Tcl 9.0.

This TIP proposes that the function `Tcl_UniCharToUtf()` no longer
combines surrogates by default, as it did in Tcl 8.x. Usages of the
`TCL_COMBINE` flag makes `Tcl_UniCharToUtf()` behave as in Tcl 8.x again.
Since surrogates are illegal in UTF-8, the effect of this TIP will be:
<pre>
$ tclsh9.0
% string length \\uD83D\\uDE02
2
% puts \\uD83D\\uDE02
error writing "stdout": illegal byte sequence
% encoding convertto utf-8 \\uD83D\\uDE02
unexpected character at index 0: 'U+00D83D'
</pre>

If you really want to output invalid UTF-8, you can
use the `cesu-8` encoding:
<pre>
    % encoding convertto cesu-8 \\uD83D\\uDE02
    😊    % fconfigure stdout -encoding cesu-8
    % puts \\uD83D\\uDE02
    😂
</pre>

The `-nocomplain` option won't give the desired effect in this case:
<pre>
    % encoding convertto -nocomplain utf-8 \\uD83D\\uDE02
    ��
</pre>
Note that � is the UTF-8-encoded form of the replacement character `�`

Extensions using `Tcl_UniCharToUtf()` in Tcl 8.7 always
encounter the behaviour that calling `Tcl_UniCharToUtf()`
with a lower surrogate followed by another `Tcl_UniCharToUtf()`
call with a higher surrogate will output a 4-byte UTF-8
sequence: The first call outputs a single byte, the second
call outputs the remaining 3 bytes. So, combining the two
surrogates is handled internally, and it cannot be switched off.
In Tcl 9.0, with this TIP, the combining of surrogates is
no longer handled automatically, only when the `TCL_COMBINE`
flag is used.

In Tcl 8.7, the `TCL_COMBINE` flag will be defined too, but it
simply has the value `0`. This is meant as a help for
code written for Tcl 9.0, so it compiles/runs unchanged
in Tcl 8.7.

# Implementation

Available in the [`tip-619`](https://core.tcl-lang.org/tcl/timeline?r=tip-619) branch.

This branch targets 9.0.

# Copyright

This document has been placed in the public domain.

Added tip/620.md.







































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 620: Treeview cell padding.
        Author:        Peter Spjuth <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Vote-Summary:  Accepted 8/0/0
        Votes-For:     MC, BG, KBK, AKU, SL, JN, FV, KW
        Votes-Against: none
        Votes-Present: none
        Created:       9-Mar-2022
        Tcl-Version:   8.7
        Keywords:      Tk, treeview
        Tk-Branch:     pspjuth-treeview
-----

# Abstract

This TIP adds a -padding flag to treeview tags.

# Rationale

Experimenting with image cells, added in [[552]](552.md), it became apparent
that there is no way to choose zero padding for a cell.
Placing an image in the corner of a cell, like Excel does when a cell has
a comment, feels like a reasonable use case to support.

Outside of the very flexible and configurable TTK_LAYOUT machinery,
a fixed 4-pixel horizontal padding is added to every cell which neither
themes, styles nor users can affect.

# Specification

Tags are extended with the -padding flag. With item tags, it affects all cells in the item, including the tree column. With cell tags, it affect that cell.

The extra padding {4 0} will only be added if no style or tag setting is done.
Thus acting as a default value for the "-padding" Cell styling option.

# Incompatibilities

If the Cell styling option "-padding" is used in any theme or application, the lost padding will give a visual change.
They would need to adjust their padding to include those 4 pixels if they want them. They are now in full control of the padding.

Note that the cell in the tree column has the class "Item". Value cells have the class "Cell", and are the ones affected here. 

# Implementation

Started on branch [`pspjuth-treeview`](https://core.tcl-lang.org/tk/timeline?r=pspjuth-treeview)

# Copyright

This document has been placed in the public domain.

Added tip/621.md.































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 621: Glyph clustering for Tk
        Author:        Jan Nijtmans <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Created:       16-Mar-2022
        Tcl-Version:   8.7
        Keywords:      Tk, ICU
        Tk-Branch:     glyph_indexing_2
        Vote-Summary   Accepted 3/0/1
        Votes-For:     FV, JN, KW
        Votes-Against: none
        Votes-Present: KBK
-----

# Abstract

At this moment, Tk doesn't know anything about Unicode glyphs. This TIP implements an
interface with [ICU](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/)
(or the Glyph API in MacOSX), such that Tk knowns what a glyph is and can handle it.

# Specification

The following new functions are implemented in Tk. They all have two fixed
parameters and an optional one.

<pre>
    ::tk::startOfCluster string start ?locale?
    ::tk::endOfCluster string start ?locale?
    ::tk::startOfNextWord string start ?locale?
    ::tk::startOfPreviousWord string start ?locale?
    ::tk::endOfWord string start ?locale?
    ::tk::wordBreakAfter string start ?locale?
    ::tk::wordBreakBefore string start ?locale?
</pre>

Here the `string` refers to the string being handled, `start` is the current
position in this string, and the functions will return a new position in the
string. If there is no such position (e.g. the end of the string is reached),
the empty string is returned.

`locale` can be something like `en` or `en_GB`. For most locales it doesn't
have any effect (Tk even doesn't use this in the current bindings). The
ICU implementation handles the `locale` parameter, the MacOSX
implementation currently doesn't.

Those functions are used in the Tk bindings of entries, spinboxes and text,
and have the result that `Delete` deletes the full Glyph in stead of only
a single Unicode character. And - for example - the `<<NextChar>>` and
`<<PrevChar>>` virtual events (Cursor right/left) will jump to the
next/previous Glyph in stead of the next/previous Unicode code point.

Also, especially for MacOS, there are new key modifiers "Fn" and "Num".
"Fn" is equivalent to "Mod4" and can be used to make the "Fn+e" key
combination usable to access Emoji. "Num" is equivalent to "Mod3"
and can be used to access the extended numerical keys.

If ICU is not available, a minimal implementations of those functions
are implemented. Those minimal functions only know about Unicode
surrogates, nothing else.

On MacOSX, only `::tk::startOfCluster` and `::tk::endOfCluster` are
implemented using the MacOSX API. The other ones fallback to `tcl_startOfNextWord`
/`tcl_startOfPreviousWord` /`tcl_endOfWord`/`tcl_wordBreakAfter`/`tcl_wordBreakBefore`.

ICU knowns all about the first 5 functions in the list, only `::tk::wordBreakAfter`/`::tk::wordBreakBefore`
have a minimal implementation, just calling `tcl_wordBreakAfter`/`tcl_wordBreakBefore`.

Since X11, the MacOSX API and ICU all use UTF-16, while Tcl 9.0 uses UTF-32 internally,
it turns out that Tk best is compiled with `-DTCL_UTF_MAX=3`, even with Tcl 9.0 which
uses `-DTCL_UTF_MAX=4`.

# Implementation

On branch [`glyph_indexing_2`](https://core.tcl-lang.org/tk/timeline?r=glyph_indexing_2)

# Copyright

This document has been placed in the public domain.

Added tip/622.md.





























































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 622: Full Unicode for Tcl 8.7
        Author:        Jan Nijtmans <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Created:       23-Mar-2022
        Tcl-Version:   8.7
        Keywords:      Tcl
        Tcl-Branch:    full-utf-for-87
	Vote-Summary:   Accepted 5/0/1
	Votes-For:      AK, JN, KBK, KW, SL
	Votes-Against:  none
	Votes-Present:  JD
-----

# Abstract

Although Tcl 8.7 understands quite a lot of Unicode, one thing it
still cannot:
<pre>
$ tclsh8.7
% string length 🤝
2
</pre>

The reason for this is that - internally - sizeof(Tcl_UniChar) == 2, and
this is visible in the full Tcl C API. `"string length"` counts UTF-16
code-points, not the number of Unicode characters. Changing that (defining
TCL_UTF_MAX = 4) means that the C-API would change behaviour. E.g.
<pre>
    Tcl_Obj *obj = Tcl_NewObj("🤝x");
    int size = Tcl_UniCharLength(obj);
    Tcl_UniChar *uniCharString = Tcl_GetUnicode(obj);
    Tcl_UniChar *partOfTheString = Tcl_GetRange(obj, 2, 2);
</pre>
Since, in Tcl 8.6, the above example gives `size = 3`, `uniCharString`
being a 16-bit array and `partOfTheString` will contain the value "x", we
cannot change that in Tcl 8.7: Extensions depending on that, compiled
against Tcl 8.6 headers, would lead to different behavior when loaded
in Tcl 8.7. The C-API must stay binary compatible.

This TIP proposes to change TCL_UTF_MAX=4 internally, and create a
UTF-16 compatibility layer of stub entries such that extensions
won't be affected. This compatibility layer will only be implemented
for Tcl 8.7, it won't be forward-merged to Tcl 9.0!

# Specification

In `tcl.h`, determine TCL_UTF_MAX as follows:
<pre>
    #ifndef TCL_UTF_MAX
    #   ifdef BUILD_tcl
    #	define TCL_UTF_MAX		4
    #   else
    #	define TCL_UTF_MAX		3
    #   endif
    #endif
</pre>

This means, that Tcl is built using UTF-32 internally. A new set of
stub entries is created for 5 functions:
<pre>
    int TclNumUtfChars(const char *, int)
    int TclGetCharLength(Tcl_Obj *)
    const char *TclUtfAtIndex(const char *, int)
    Tcl_Obj *TclGetRange(Tcl_Obj *, int, int)
    int TclGetUniChar(Tcl_Obj *, int)
</pre>
Those 5 functions are used everywhere in Tcl, and those functions count in UTF-32.
So `TclNumUtfChars("🤝", -1)` will return `1`, not `2` as Tcl 8.6 does. But
extensions using `Tcl_NumUtfChars`/`Tcl_GetCharLength`/`Tcl_UtfAtIndex` will
continue to use the original functions, which count UTF-16 characters.

Extensions which want to use the new UTF-32 functions, can define `TCL_UTF_MAX=4`
before including `tcl.h`, then `Tcl_NumUtfChars`/`Tcl_GetCharLength`/`Tcl_UtfAtIndex`/
`Tcl_GetRange`/`Tcl_GetUniChar` will be mapped to `TclNumUtfChars`/
`TclGetCharLength`/`TclUtfAtIndex`/`TclGetRange`/`TclGetUniChar`.

Also, the following 3 functions which were deprecated in Tcl 8.7 (because
they don't work well with UTF-32) are added to this compatibility layer:
<pre>
    int Tcl_UniCharNcmp(const Tcl_UniChar *, const Tcl_UniChar *, unsigned long);
    int Tcl_UniCharNcasecmp(const Tcl_UniChar *, const Tcl_UniChar *, unsigned long);
    int Tcl_UniCharCaseMatch(const Tcl_UniChar *, const Tcl_UniChar *, int);
</pre>
Those 3 functions are still deprecated (See [TIP #542](542.md)), but they are
implemented in the UTF-16 compatibility layer for Tcl 8.7. In Tcl 9.0, they are gone.

Finally, the `"string"` objType is renamed to `"utf32string"`, and a new
`"string"` objType is implemented which uses UTF-16 codepoints. This
objType is used in the compatibility layer of the following 5 functions:
<pre>
    Tcl_UniChar *Tcl_GetUnicode(Tcl_Obj *);
    Tcl_UniChar *Tcl_GetUnicodeFromObj(Tcl_Obj *, int *);
    Tcl_Obj *Tcl_NewUnicodeObj(Tcl_UniChar *, int);
    Tcl_SetUnicodeObj(Tcl_Obj *, Tcl_UniChar *, int);
    void Tcl_AppendUnicodeToObj(Tcl_Obj *, const Tcl_UniChar *, int)
</pre>

If Tcl is compiled with `-DTCL_NO_DEPRECATED`, then the UTF-16 compatibility
layer is removed. This is meant to verify that the compatibility layer is not
used internally anywhere. This also means that extensions using any of the
above API will _Panic_. Compiling the extension with `-DTCL_UTF_MAX=4` will
make the extension work again, but this is only meant for test
purposes, not for production!

Finally, this TIP proposes to undo the deprecation of `Tcl_AppendUnicodeToObj`.
Although this was proposed in [TIP #542](542.md), it turned out that this function
could not really be removed, it just moved to be a internal stub function in
Tcl 9.0. Therefore, there is no burden exposing it again.

# Caveat

Since - internally - `TCL_UTF_MAX` is raised from 3 to 4, this influences
the behavior of the encoding/decoding functions. For example, the following code;
<pre>
    Tcl_EncodingState state;
    int read;
    Tcl_Encoding encoding = Tcl_Encoding("utf-8");
    char buf[TCL_UTF_MAX] = "";
    int result = Tcl_ExternalToUtf(interp, encoding, "🤝",
	    4, flags, &state, buf,
	    sizeof(buf), &read, NULL, NULL);
</pre>
In Tcl 8.6, after doing this call, `buf` will be filled with
the bytes 0xED 0xA0 0xBE, which is the cesu-8 representation
of a high surrogate. The function `Tcl_ExternalToUtf` in Tcl 8.6
is guaranteed to provide some output if the buffer provided has
at least 3 bytes. In Tcl 8.7, buffers used for `Tcl_ExternalToUtf`
or `Tcl_UtfToExternal` need at least 4 bytes, otherwise
4-byte utf-8 sequences cannot be handled.
Therefore, in Tcl 8.7, the above example won't give
any output (`read` = 0), since the buffer cannot handle
even a single unicode character.

# Implementation

See branch [`full-utf-for-87`](https://core.tcl-lang.org/tcl/timeline?r=full-utf-for-87)

# Copyright

This document has been placed in the public domain.

Added tip/623.md.













































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# TIP 623: Bless negative index arguments to Tcl_GetRange
        Author:        Don Porter <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Created:       24-Mar-2022
        Tcl-Version:   8.6.13
        Tcl-Branch:    tip-623
        Vote-Summary:  Accepted 3/0/0
        Votes-For:     DGP, JN, SL
        Votes-Against: none
        Votes-Present: none
-----

# Abstract

Proposes official approval and documentation of a meaning for
negative index values passed to **Tcl\_GetRange** which have long been
used unofficially with compromised reliability.

# Background

The routine

 > Tcl\_Obj\* **Tcl\_GetRange**\(Tcl\_Obj\* _objPtr_\, int _first_, int _last_)

first appeared in [23b23af342](http://core.tcl-lang.org/tcl/info/23b23af342)
and was first released in Tcl 8.2.  From the beginning it was documented:

 > **Tcl\_GetRange** returns a newly created object comprised of the
 > characters between _first_ and _last_ (inclusive) in the object’s
 > Unicode representation. If the object’s Unicode representation is
 > invalid, the Unicode representation is regenerated from the object’s
 > string  representation. 

This same documentation is in the Tcl 8.6.12 release unchanged other than
the replacement of the words _object_ by _value_.  This reflects a legacy
documentation practice widespread in Tcl where the functionality of a routine
is not documented in explicit terms of valid argument ranges and
corresponding results, but instead in terms of a somewhat vague description
of how the routine might be implemented.  

The documentation suggests that **Tcl\_GetRange** might be understood as
the equivalent of

 > **Tcl\_NewUnicodeObj**\(**Tcl\_GetUnicode**\(_objPtr_) + _first_, _last_ - _first_ + 1)

(In fact, it was never implemented precisely in that way, and the
implementation has been revised multiple times over the years.)
With this understanding, all non-empty substrings of the non-empty string
value _objPtr_ (with length of **N** characters, **N** > 0) are produced
by the index ranges 0 <= _first_ <= _last_ < **N**.  Any plausible
implementation of **Tcl\_GetRange** has to support those argument values.
The callers of **Tcl\_GetRange** within the source code of Tcl 8.2 itself
stay within those argument limits.  Support for other possible argument
values raises uncertainty.

The header comment of the **Tcl\_GetRange** routine says: 

 > **The first and last indices are assumed to be in the appropriate range.**

However, the comment offers no detail on what that appropriate range is.
There are no tests that directly exercise **Tcl\_GetRange** from which the
limits might be inferred.  Furthermore, the original implementation made
no checks of the values passed in for the _first_ and _last_ arguments.
This is true even though passing in a value of _last_ >= **N** to the
original Tcl 8.2 implementation caused it to read past the logical end of
the _objPtr_ value, possibly into uninitialized or unallocated memory.  

This is another legacy practice found in Tcl code with roots in an older
programming culture.  The expense of argument checking was often avoided.
In its place was an assumption that a routine and its callers were trusted
partners seeking a common goal of a working program.  A caller would have
no sensible reason to pass in a bad argument, so it was considered wasteful
to expend effort confirming it did not.  In the unfortunate case when a
broken caller might pass a program-breaking argument value,
"_it could keep both pieces_" of the broken program.
The open source nature of Tcl offered assurance that the programmers of
every caller had the ability to peek inside and know what they were doing.
In this environment where arguments were not checked, no mechanisms were
established for reporting errors that would never be detected.
**Tcl\_GetRange** has no documented failure mode.  It is compelled to
return some Tcl value, or abort the program.

In more recent times, more and more software joins together larger and
larger collections of modules from multiple origins.  The risks of
introducing a malicious module have increased, and interest in robust,
reliable operations has also grown.  Libraries that can be induced to
access memory outside proper allocations and initializations receive
increasingly less acceptance.  More powerful hardware has made the
costs of argument checking less noticeable.  We also have developed a
greater appreciation for the freedom of implementation evolution provided
by stronger encapsulation at interfaces.  The Tcl sources have been
gradually adapted over time to add more checks in more places, especially
at interfaces with foreign modules.

Which returns us to the question of what values of _first_ and _last_
the **Tcl\_GetRange** routine should accept.  Since a caller must avoid
passing a value _last_ >= **N**, an implied burden on the caller is to
know or retrieve the value of **N**.  In particular, a caller seeking
the suffix of _objPtr_, beginning with known valid index _first_ and
continuing to the end of the string, needs the value **N** to be able to 
pass (**N** - 1) as the _last_ argument.  The analogous Tcl
command **string range** is easier to use since it allows a special
value **end** as an index argument.  A C programmer is inspired by that
example to seek out an equivalent.

Within all of that context, a programmer might notice that the routine

 > Tcl\_Obj\* **Tcl\_NewUnicodeObj**\(Tcl\_UniChar\* _unicode_, int _numChars_)

has two documented modes of operation.  When _numChars_ >= 0, a new value
of length _numChars_ is created and returned, initializing from _unicode_.
However, when _numChars_ < 0, the new value initializes from _unicode_
up to, but not including, the first null character.  Combine this observation
with the simple implementation of **Tcl\_GetRange** hypothesized above and
suggested by its documentation, and one might craft the clever solution,

  > **Tcl\_GetRange**\(_objPtr_, _first_, -2)

as a call that can perform the suffix operation in many circumstances.

When _last_ is -2, the quantity (_last_ - _first_ + 1) is (-1 - _first_),
and when it is known 0 <= _first_ < **N** <= **INT\_MAX**, it becomes
clear that _numChars_ is negative.  For this scheme to work, it is
necessary that **Tcl\_GetUnicode** returns a pointer to a Tcl\_UniChar
array terminated by a null character.  That is not documented, but it has
been true.  The scheme also only works if the value of _objPtr_ does
not contain a null character.  This is a bug in the strategy, but one which
might not be encountered in normal operations.  The scheme also only
works when **Tcl\_GetRange** is implemented as hypothesized,
or in a way that duplicates every result that hypotehetical approach
would produce.  There is an even rarer bug lurking in calls where _objPtr_
has a mal-encoded string rep containing a NUL byte.

When _last_ is -1 instead, the utility as a suffix operation is almost as
good.  The only failure mode added is when _first_ is 0.  A caller might
test or otherwise rule out that case, since the suffix beginning at
index 0 is trivially known to be _objPtr_ itself.  The value of -1 is
used to signal special operations or conditions in several places in Tcl,
which might also inspire this choice.  For other increasingly negative values
for _last_, the scheme grows increasingly fragile as it fails for shorter and
shorter _objPtr_ values due to overflow.  

While this strategy of gaming a presumed **Tcl\_GetRange** implementation
supports this one useful calling mode, it also produces some absurd results.
For example, when **N** >= 3, the call

 > **Tcl\_GetRange**\(_objPtr_, 2, 0)

produces the same result as the call

 > **Tcl\_GetRange**\(_objPtr_, 2, **N** - 1)

which is at least surprising.  If this anomaly had been noticed first,
I expect it would have been perceived as a bug and fixed.

The suffix scheme for calling **Tcl\_GetRange** failed in the original
release, because **Tcl\_NewUnicodeObj** did not implement its documented
second mode.  This bug [218974](http://core.tcl-lang.org/tcl/info/218974)
was fixed for release Tcl 8.2.3 .

Checkin [174db4e4cd](http://core.tcl-lang.org/tcl/info/174db4e4cd) added
an optimization case to **Tcl\_GetRange** when _objPtr_ is a bytearray.
This change first appeared in release Tcl 8.6.0.  The optimized branch
did not duplicate the prior results when (_last_ - _first_ + 1) is negative
(because **Tcl\_NewByteArrayObj** does not support a compatible special
mode for a negative _length_ value).
This increased the circumstances where the suffix scheme fails, and where
the results of **Tcl\_GetRange** violate the EIAS principle.

During the development of TIP [[389]](389.md), the consistency and
safety concerns with out of range index values were noticed, and checks
were added to the **Tcl\_GetRange** routine
[c22b158bd6](http://core.tcl-lang.org/tcl/info/c22b158bd6) and
those checks later merged into the 8.7 branch
[e109760b1c](http://core.tcl-lang.org/tcl/info/e109760b1c).  
Ticket 
[767e070d35](http://core.tcl-lang.org/tcl/info/767e070d35) raised the
same concerns about Tcl 8.6, and the index value checks were backported
and then released in Tcl 8.6.11.  All these changes were made from
the point of view of improving safety and clarity.  There was no
awareness of the semi-utility of the suffix scheme.

Earlier this year ticket
[e9a2715d91](http://core.tcl-lang.org/tcl/info/e9a2715d91) raised
the alarm about the "significant change" to **Tcl\_GetRange** in 
Tcl 8.6.11.  The comments on that ticket are a record of discovery
of the events summarized above.  

# Proposal

Revise **Tcl\_GetRange** to have defined and documented behavior
when negative values are passed as the _first_ or _last_ arguments.

When _first_ is negative, **Tcl\_GetRange** behaves as if _first_ == 0.

When _last_ is negative, and the length of _objPtr_ is **N** characters,
**Tcl\_GetRange** behaves as if _last_ == **N** - 1.

In the Tcl 9 interface, these arguments have type **ptrdiff\_t**.

# Compatibility

This implementation is incompatible with Tcl releases 8.6.11 and 8.6.12.
It restores a degree of compatibility with Tcl releases up to 8.6.10.  

The compatibility point only concerns negative values of the _last_
argument.  Many programmers have considered those values to be out
of scope, so the change will not have impact on them.  Those programmers
who did make use of this range of argument values will now benefit from
having this functionality documented and supported.

# Addendum

After [TIP #660](660.md) was accepted, a lot of functions changed from
using size\_t to ptrdiff\_t parameters. In order to prevent confusion,
this change has been adapted in the TIP text above as well.

# Implementation

This change is already in place on the Tcl 8.6 development branch and
is poised to be released in Tcl 8.6.13.  To the extent the documentation
and implementation do not fully and clearly conform to this TIP, they
will be updated prior to release of Tcl 8.6.13.

# Copyright

This document has been placed in the public domain.

Added tip/624.md.











































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 624: Deprecate Tcl_MakeSafe
	Author:        Jan Nijtmans <[email protected]>
	State:         Final
	Type:          Project
	Vote:          Done
	Created:       06-April-2022
	Tcl-Version:   8.7
	Keywords:      Tcl
	Tcl-Branch:    rfe-655300
	Vote-Summary   Accepted 5/0/1
	Votes-For:     DGP, FV, JN, KBK, SL
	Votes-Against: none
	Votes-Present: MC
-----

# Abstract

This TIP proposes to deprecate `Tcl_MakeSafe`, and fully remove it
in Tcl 9.0

# Specification

For a discussion why `Tcl_MakeSafe` is bad, see [https://core.tcl-lang.org/tcl/tktview?name=655300|RFE 655300].

There is no known extension using `Tcl_MakeSafe`. And if there were, `Tcl_MakeSafe` would not
be doing the expected job anyway. It is not - generally - possible for a non-safe interpreter to
become safe: The core doesn't know which of the commands added after construction are supposed
to be safe or not. So, the only way to create a safe interpreter should be to start with one
from the start. 

# Implementation

See branch [`rfe-655300`](https://core.tcl-lang.org/tcl/timeline?r=rfe-655300)

# Copyright

This document has been placed in the public domain.

Added tip/625.md.











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
# TIP 625: Re-implementation of lists
        Author:        Ashok P. Nadkarni <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Created:       17-05-2022
        Tcl-Version:   8.7
        Keywords:      Tcl
        Tcl-Branch:    tip-625
        Vote-Summary   Accepted 3/0/0
        Votes-For:     BG, JN, KW
        Votes-Against: none
        Votes-Present: none
-----
<!-- TOC BEGIN (auto generated with tiptoc) -->
* <a href='#Abstract'>Abstract</a>
* <a href='#Rationale'>Rationale</a>
* <a href='#Specification'>Specification</a>
    * <a href='#Internalrepresentation'>Internal representation</a>
        * <a href='#Invariants'>Invariants</a>
        * <a href='#ListStorespaceallocation'>ListStore space allocation</a>
            * <a href='#Apportioningofadditionalspace'>Apportioning of additional space</a>
            * <a href='#Spacemanagementinunsharedrepresentation'>Space management in unshared representation</a>
        * <a href='#Spanmanagement'>Span management</a>
* <a href='#Performance'>Performance</a>
    * <a href='#Performancetestingscripts'>Performance testing scripts</a>
    * <a href='#Performancemeasurements'>Performance measurements</a>
        * <a href='#listandlistexpansion'>list and list expansion</a>
        * <a href='#lappend'>lappend</a>
        * <a href='#linsert'>linsert</a>
        * <a href='#lrange'>lrange</a>
        * <a href='#lassign'>lassign</a>
        * <a href='#lpop'>lpop</a>
        * <a href='#lset'>lset</a>
        * <a href='#lremove'>lremove</a>
        * <a href='#lreplace'>lreplace</a>
        * <a href='#lreverse'>lreverse</a>
        * <a href='#lsort'>lsort</a>
        * <a href='#lsearch'>lsearch</a>
        * <a href='#concat'>concat</a>
        * <a href='#lindex'>lindex</a>
        * <a href='#join'>join</a>
        * <a href='#split'>split</a>
        * <a href='#llength'>llength</a>
        * <a href='#lrepeat'>lrepeat</a>
        * <a href='#lmap'>lmap</a>
        * <a href='#foreach'>foreach</a>
    * <a href='#Memorystatistics'>Memory statistics</a>
        * <a href='#Memoryleaks'>Memory leaks</a>
        * <a href='#Memoryusage'>Memory usage</a>
* <a href='#Tests'>Tests</a>
* <a href='#Implementation'>Implementation</a>
* <a href='#Copyright'>Copyright</a>

<!-- TOC END -->

# <a id='Abstract'></a>Abstract

The current implementation of lists in Tcl is efficient for operations on the
tail but can be slow in many other cases. This TIP proposes an alternate
implementation to improve performance while maintaining full compatibility at
both the script and public C API levels. No new functionality is proposed.
Performance measurements are included for all list commands to support the
case for the new implementation.

Although the TIP targets 8.7, there is nothing in the implementation that
would prevent integration with 8.6.


# <a id='Rationale'></a>Rationale

The current list implementation is based on an internal representation that
stores elements in a reference counted structure with a dynamically sized
array field at the end. Allocations after the initial creation include
extra trailing space so that new elements can be quickly appended without
reallocation. Deletion from the back is also quick as it only requires updating
a count. **Both these optimizations however require the list Tcl_Obj as well
as the internal representation to be unshared**, which although not infrequent,
limits their applicability even accounting for the K operator idiom. 

The proposed implementation is also based on a variable size struct used to
store the list elements. As before, the initial allocation of list structures is
of the exact required size. However, reallocations caused by list operations
leave optional additional space in the front as well as the back. The same
efficiencies that apply to list tails in the current implementation can thus
also be applied to the list head. In addition, a list Tcl_Obj internal
representation includes an optional *span* structure that delineates a subrange
of elements in the master structure. 

The changes have the following benefits in performance for some frequently used
operations:

- Range operations are very fast, even for shared objects.

- Deletions from the head and tail are very fast since
these boil down to range operations. Again, this applies to shared objects as well.

- Insertions at head of unshared objects are as fast as appending. Under some
circumstances, this is possible even when the object is shared.

The measured performance of all commands for a number of conditions is given in
[Performance](#Performance). Aside from obvious issues of correctness, the
content of that section should determine acceptance or rejection of the TIP.

The following sample sequences illustrate some of the more substantial
improvements for value based list commands.

** 8.7 **

```
% timerate -calibrate {}
0.03367925540411432 µs/#-overhead 0.033679 µs/# 57958526 # 29691867 #/sec
% set L [lrepeat 1001 x] ; set idx 0
0
% timerate {lrange $L 1 end-1}
4.904651 µs/# 202498 # 203888 #/sec 993.182 net-ms
% timerate {set L [linsert $L $idx x]} 1000 1000
6.572000 µs/# 1000 # 152160 #/sec 6.572 net-ms
% timerate {set L [lremove $L end]} 1000 1000
6.004000 µs/# 1000 # 166555 #/sec 6.004 net-ms
% timerate {set L [lassign $L x]} 1000 1000
2.305000 µs/# 1000 # 433839 #/sec 2.305 net-ms
```

** TIP 625 **

```
% timerate -calibrate {}
0.03181002427730623 µs/#-overhead 0.031810 µs/# 61364304 # 31436631 #/sec
% set L [lrepeat 1001 x] ; set idx 0
0
% timerate {lrange $L 1 end-1}
0.125190 µs/# 6369421 # 7987846 #/sec 797.389 net-ms
% timerate {set L [linsert $L $idx x]} 1000 1000
0.499000 µs/# 1000 # 2004008 #/sec 0.499 net-ms
% timerate {set L [lremove $L end]} 1000 1000
0.503000 µs/# 1000 # 1988071 #/sec 0.503 net-ms
% timerate {set L [lassign $L x]} 1000 1000
0.286000 µs/# 1000 # 3496503 #/sec 0.286 net-ms
```

The improvement is even more pronounced with larger lists.

Commands that operate on list variables show similar improvements when operating
on shared values. Benefits on unshared values are less pronounced but still
present in many cases. 

Commands that show significant improvement (multiples) in specific cases
include `linsert`, `lrange`, `lassign`, `lreplace`, `lpop` and `lremove`.
The [Performance](#Performance) section has the details.

In addition to execution time, memory usage is also a consideration when it
comes to performance. Sharing of storage as above raises issues with regard to
when unreachable memory is actually freed. This is discussed in
[Memory usage](#Memoryusage).

# <a id='Specification'></a>Specification

## <a id='Internalrepresentation'></a>Internal representation

The internal representation of a list is implemented through three structs.

The `ListStore` struct is a structure that includes a variable size array that
serves as storage for a Tcl list. A contiguous sequence of slots in the array,
the *in-use* area, holds valid pointers to `Tcl_Obj` values that belong to one
or more Tcl lists. The unused slots before and after these are free slots that
may be used to prepend and append to the list without having to reallocate the
struct. The `ListStore` may be shared amongst multiple lists and is reference
counted.

```
typedef struct ListStore {
    int refCount;      /* Count of references to this span record */
    int firstUsed;     /* Index of first slot in use within the slots[] array */
    int numUsed;       /* Number of slots in use (starting at index firstUsed) */
    int numAllocated;  /* Total number of slots[] array slots. */
    int flags;         /* LISTSTORE_* flags */
    Tcl_Obj *slots[1]; /* Variable size array to be grown as needed */
} ListStore;
```

A `ListSpan` struct defines a sequence of slots within a `ListStore`. This
sequence always lies within the *in-use* area of the `ListStore`. Like
`ListStore`, the structure may be shared among multiple lists and is reference
counted.

```
typedef struct ListSpan {
    int refCount;     /* Count of references to this span record */
    int spanStart;    /* Starting index within parentList where the span */
    int spanLength;   /* Number of elements in the span */
} ListSpan;
```

A `ListRep` struct holds the internal representation of a Tcl list as stored
in a `Tcl_Obj`. It is composed of a `ListStore` and a `ListSpan` that together
define the content of the list. The `ListSpan` specifies the range of slots
within the `ListStore` that hold elements for this list. The `ListSpan` is
optional in which case the list includes all the in-use slots of the
`ListStore.`

```
typedef struct ListRep {
    ListStore *storePtr;/* Storage area shared amongst different lists */
    ListSpan *spanPtr;  /* If not NULL, the span holds the range of slots 
                           within *storePtr that contain this list elements. */
} ListRep;
```

### <a id='Invariants'></a>Invariants

In addition to the obvious invariants related to correctness, such as relations
between indices and lengths, the implementation maintains the following invariants
as a design choice.

1. If a `ListStore` is referenced from any `ListRep`/`Tcl_Obj` whose spanPtr field
is NULL, the firstUsed field of the `ListStore` must be 0, i.e. the in-use area
begins right at the front. To put it another way, if a `ListRep` does not have a
span, its `ListStore` has no free space in the front. This invariant is not
mandated for correctness, but maintaining it permits prepending to even **shared**
`ListStore` instances under certain conditions as described in
[Insertion](#Insertion).

2. List objects created from other types (via the string representation) always
have NULL spans. This means a list object created with a span will always start
without a string representation and thus have a canonical string representation
when it is generated. This is used in determining [Canonical lists](#Canonicallists).

### <a id='ListStorespaceallocation'></a>ListStore space allocation

When a `ListRep` list internal representation is created through `Tcl_NewListObj` or
through conversion from another internal type, a `ListStore` is created with the
`slots[]` array of size exactly that requested. As in the pre-TIP 625 implementation,
no extra space is allocated. The rationale for this is that lists are often created
and never modified thereafter so the extra space is wasted.

On the other hand, when a command such as `lappend` requires reallocation, a
`ListStore` is allocated with twice the space required by the current request.
This is based on the assumption that once an operation is executed it is likely
that further operations will be also be invoked. Allocating additional space
up front makes these much more efficient.

The above allocation strategy applies to the pre-TIP 625 list implementation as
well as the proposed one. The differences are

- While all extra space in the pre-TIP 625 implementation is trailing, the proposed
implementation apportions it between the leading and trailing areas as described
below.

- When a list operation results in a **smaller** list, if the space in-use has
shrunk to less than a quarter of the allocated space, the `ListStore` is
reallocated. This memory usage optimization is orthogonal to the rest of this
TIP and may be removed without affecting anything else.

#### <a id='Apportioningofadditionalspace'></a>Apportioning of additional space

When reallocation is triggered by an operation that increases the list size, the
additional allocated space is apportioned between the front and the back in the
following manner.

- For operations that append elements, if it is likely that the list has only had
append opertions invoked (can be determined through the absence of a span), all
extra space is allocated to the back. Otherwise, three fourth of the extra space is
allocated to the back and a fourth to the front.

- For operations that prepend elements, three fourth of the extra space is
allocated to the front and a fourth to the back.

- For operations that insert in the middle, the additional space is equally allocated
to the front and the back.

The above heuristic is plucked out of thin air, so to speak, but does not seem
entirely unreasonable based on [benchmarks](#Performance). It is completely
subject to change.

#### <a id='Spacemanagementinunsharedrepresentation'></a>Space management in unshared representation

When both the `Tcl_Obj` and its `ListRep` are unshared, the in-use area within
the `ListStore` may be moved to make room for new elements assuming the total
allocated space is large enough. In the pre-TIP 625 implementation, elements can
only be shifted upward (to higher index slots) since any allocated space is
always at the back. The availability of leading space in the proposed
implementation enables additional optimization. Assuming the availability of
both leading and trailing free space, the implementation chooses to move the
smaller segment. For example, inserting at index `1` in a list will cause the
single element at index `0` to be moved down to make room. Inserting at index
`end-1` on the other hand will cause the single element at the end to be moved up.

### <a id='Spanmanagement'></a>Span management

The introduction of spans into the internal representation of lists is the primary
design change proposed by this TIP. The use of spans offers some significant
advantages

- A basic range operation implemented using spans is very fast.
Since deletions from the front and back can be
thought of as range operations, those benefit from the same speed-up.

- A list with a spanned internal representation offers the same O(1) efficiency
(instead of O(n)) for prepending as was previously available only for appending.

The speed up for even moderately sized (few thousand elements) lists can be orders of magnitude faster for some operations as presented in the 
[Performance](#Performance) section.

However, use of spans also has some drawbacks.

- There is a execution cost associated with allocating an additional block of memory
to hold the `ListSpan` struct if not already existing.

- There is a potential memory cost in holding on to more memory than necessary.
For example, consider a `lrange` command that extracts 5 elements from a list of
a thousand elements. If the source list object is released after use, a span
based implementation would hold on to the 1000-element `ListStore` even though
only five elements were actually being referenced.

The code implements certain allocation policies to tackle the above issues.
See [Memory usage](#Memoryusage) for a further discussion.

# <a id='Performance'></a>Performance

The whole motivation for this TIP is performance so this section provides supporting
data in the form of benchmark results for all the list commands.

Needless to say, all the standard cautions regarding interpretation of
benchmarks apply.

## <a id='Performancetestingscripts'></a>Performance testing scripts

The numbers in this section are generated with the `listPerf.tcl` and 
`comparePerf.tcl` scripts in the `tests-perf` directory. The former generates
test data for a Tcl implementation while the latter is used to compare multiple
test runs. For example, the tables for the `lappend` command can be generated by

```
d:\tcl\core-8-branch\x64\bin\tclsh87.exe listPerf.tcl --label core-8-branch lappend > core-8-branch.perf 
d:\tcl\tip-625\bin\tclsh87.exe listPerf.tcl --label tip-625 lappend > tip-625.perf
tclsh comparePerf.tcl --print-test-number core-8-branch tip-625
```

Not specifying the command (`lappend` above) will measure all list commands.
Both scripts have various options to control list lengths, run iterations and
so on. See the script source for details.

Some caveats to keep in mind when interpreting results.

- There is a fair amount of relative variance in results for smaller list sizes.
When running these scripts on Windows, it is very important to turn off all
unnecessary services and background shell processes. This greatly reduces
variance from run to run. The same is likely true on other platforms. To account
for other applications interfering, the test results are based on running each
test multiple times and averaging after discarding outliers (depending on total
iterations).

- There is some difficulty in devising tests for unshared values. The overhead
for generating unshared values overshadows the actual test despite the use of
`timerate` calibration and `-overhead` options.

- Currently there is a minimum list size threshold of 100 ( arbitrary and
subject to change after further measurements) for generating span based lists.
Thus the rows for lists of 100 items or fewer should show little difference.

## <a id='Performancemeasurements'></a>Performance measurements

**Note: These are preliminary figures. Both the implementation and tests need
tuning.**

All tests run on 64-bit Windows 10.

In the tables below, the first column `[1]` is the baseline 8.7 time in usecs.
Column `[2]` is the TIP 625 time in usecs and ratio of baseline time to TIP 625
time (so 2.0 means TIP 625 is twice as fast).

### <a id='listandlistexpansion'></a>list and list expansion

**List creation from string**

List creation is unaffected by TIP 625. The span in the `Tcl_Obj` is simply
set to NULL.

```
           [1]           [2]
1.     0.24900|   0.24350|1.02  |list L[10] from a string
2.     0.24410|   0.25000|0.98  |list L[100] from a string
3.     0.24200|   0.26010|0.93  |list L[1000] from a string
4.     0.24360|   0.24190|1.01  |list L[10000] from a string
```

**List creation from expanded lists** 

List expansion using the `{*}` operator is unchanged. The performance
improvements in rows 9 and 12 should be ignored as creating a list from a single
list degenerates into a range operation which is optimized in TIP 625. It is
not generally applicable to the expansion operator.

```
5.     0.26960|   0.28310|0.95  |list L[10] from a {*}list
6.     0.43100|   0.42870|1.01  |list L[10] from a {*}list {*}list
7.     0.55480|   0.54280|1.02  |list L[100] from a {*}list
8.     0.73070|   0.67800|1.08  |list L[100] from a {*}list {*}list
9.     3.17630|   0.26440|12.01 |list L[1000] from a {*}list
10.    3.51040|   3.14870|1.11  |list L[1000] from a {*}list {*}list
11.   29.95070|   0.25500|117.45|list L[10000] from a {*}list
12.   31.90530|  28.23100|1.13  |list L[10000] from a {*}list {*}list
```

### <a id='lappend'></a>lappend

As seen from the table below, there is no real discernable difference between
the pre-TIP 625 implementation and TIP 625. This is to be expected as both optimize
list appends in almost identical fashion.

```
           [1]           [2]
1.     0.43330|   0.50000|0.87  |lappend L[5] shared 1 elems 10 times
2.     0.63000|   0.56670|1.11  |lappend L[50] shared 1 elems 100 times
3.     2.72930|   2.71200|1.01  |lappend L[500] shared 1 elems 1000 times
4.    26.32310|  24.00330|1.10  |lappend L[5000] shared 1 elems 10000 times
5.     0.20000|   0.20000|1.00  |lappend L[5] unshared 1 elems 10 times
6.     0.23000|   0.23000|1.00  |lappend L[50] unshared 1 elems 100 times
7.     0.22730|   0.22900|0.99  |lappend L[500] unshared 1 elems 1000 times
8.     0.22930|   0.22840|1.00  |lappend L[5000] unshared 1 elems 10000 times
9.     0.33330|   0.36670|0.91  |lappend L[5] unshared-span 1 elems 10 times
10.    0.25000|   0.26000|0.96  |lappend L[50] unshared-span 1 elems 100 times
11.    0.23930|   0.24170|0.99  |lappend L[500] unshared-span 1 elems 1000 times
12.    0.23750|   0.23980|0.99  |lappend L[5000] unshared-span 1 elems 10000 times
13.   32.06250|  29.77750|1.08  |lappend total run time
14.   32.06250|  29.77750|1.08  |Total run time
```

### <a id='linsert'></a>linsert

The linsert code pre-TIP 625 takes a different path when the index is a
constant from when it is a variable. In the former case the command is
executed entirely in byte code and is unchanged in TIP 625. The latter case
is implemented as a C function and has a new implementation in TIP 625.

The tables below are split based on the above in addition to the usual
distinction between shared and unshared values.

**Insertion into an shared list at a variable index**

As expected, the greatest improvement in performance with TIP 625 for 
insert operations is for repeated insertions at index 0 (rows 6, 7, 9, 10, 12, 13).
The improvement comes from the free leading space in a `ListStore` that allows
constant time insertion. **Note this is true even when the value is shared
provided certain conditions are met.** The magnitude of the improvement depends
on the list size and number of insertions ranging from 6x to 30x in the test
cases.

The initial insert at index 0 (rows 5, 8, 11) shows no improvement. This is
because the initial list allocation is always an exact size as in the pre-TIP
625 implementation, with extra space only allocated on the first insertion.

Insertions at other indices has no change in performance as the list storage
must always be reallocated when shared.

Insertions at the end also do not exhibit any change in performance for
the same reason. **However, if the implementation was modified to always
allocate a span for every list, it would see similar gains as insertions
at index 0.** This is currently not done to avoid allocating spans on
initial allocation.


```
           [1]           [2]
1.     0.24750|   0.24850|1.00  |linsert L[0] shared 1 elems 1 times at 0 (var)
2.     0.49820|   0.50050|1.00  |linsert L[10] shared 1 elems 1 times at 0 (var)
3.     2.06970|   0.42600|4.86  |linsert L[10] shared 1 elems 1000 times at 0 (var)
4.     8.91400|   0.59570|14.96 |linsert L[10] shared 5 elems 1000 times at 0 (var)
5.     0.78810|   0.71840|1.10  |linsert L[100] shared 1 elems 1 times at 0 (var)
6.     2.33900|   0.44600|5.24  |linsert L[100] shared 1 elems 1000 times at 0 (var)
7.     9.21300|   0.46500|19.81 |linsert L[100] shared 5 elems 1000 times at 0 (var)
8.     3.79430|   3.21220|1.18  |linsert L[1000] shared 1 elems 1 times at 0 (var)
9.     5.31230|   0.43000|12.35 |linsert L[1000] shared 1 elems 1000 times at 0 (var)
10.   12.25630|   0.47670|25.71 |linsert L[1000] shared 5 elems 1000 times at 0 (var)
11.   35.11010|  30.28560|1.16  |linsert L[10000] shared 1 elems 1 times at 0 (var)
12.   36.58100|   0.46070|79.40 |linsert L[10000] shared 1 elems 1000 times at 0 (var)
13.   43.44170|   0.45030|96.47 |linsert L[10000] shared 5 elems 1000 times at 0 (var)
14.    0.56020|   0.52930|1.06  |linsert L[10] shared 1 elems 1 times at 1 (var)
15.    2.25070|   1.82030|1.24  |linsert L[10] shared 1 elems 1000 times at 1 (var)
16.    8.92330|   7.68870|1.16  |linsert L[10] shared 5 elems 1000 times at 1 (var)
17.    0.77570|   0.72540|1.07  |linsert L[100] shared 1 elems 1 times at 1 (var)
18.    2.34870|   2.09230|1.12  |linsert L[100] shared 1 elems 1000 times at 1 (var)
19.    9.16830|   7.92000|1.16  |linsert L[100] shared 5 elems 1000 times at 1 (var)
20.    3.81680|   3.20380|1.19  |linsert L[1000] shared 1 elems 1 times at 1 (var)
21.    5.28400|   4.88830|1.08  |linsert L[1000] shared 1 elems 1000 times at 1 (var)
22.   12.31270|  10.48970|1.17  |linsert L[1000] shared 5 elems 1000 times at 1 (var)
23.   34.92510|  30.19400|1.16  |linsert L[10000] shared 1 elems 1 times at 1 (var)
24.   36.73070|  31.81330|1.15  |linsert L[10000] shared 1 elems 1000 times at 1 (var)
25.   43.21970|  38.56530|1.12  |linsert L[10000] shared 5 elems 1000 times at 1 (var)
26.    0.47370|   0.46620|1.02  |linsert L[10] shared 1 elems 1 times at 5 (var)
27.    2.07530|   1.79370|1.16  |linsert L[10] shared 1 elems 1000 times at 5 (var)
28.    8.96530|   7.67570|1.17  |linsert L[10] shared 5 elems 1000 times at 5 (var)
29.    0.77590|   0.70820|1.10  |linsert L[100] shared 1 elems 1 times at 50 (var)
30.    2.32600|   2.04500|1.14  |linsert L[100] shared 1 elems 1000 times at 50 (var)
31.    9.35530|   7.75070|1.21  |linsert L[100] shared 5 elems 1000 times at 50 (var)
32.    3.75230|   3.40850|1.10  |linsert L[1000] shared 1 elems 1 times at 500 (var)
33.    5.26800|   4.70970|1.12  |linsert L[1000] shared 1 elems 1000 times at 500 (var)
34.   12.28930|  10.39000|1.18  |linsert L[1000] shared 5 elems 1000 times at 500 (var)
35.   35.06610|  30.19210|1.16  |linsert L[10000] shared 1 elems 1 times at 5000 (var)
36.   36.68430|  31.26800|1.17  |linsert L[10000] shared 1 elems 1000 times at 5000 (var)
37.   43.36100|  38.76800|1.12  |linsert L[10000] shared 5 elems 1000 times at 5000 (var)
38.    0.57700|   0.57900|1.00  |linsert L[10] shared 1 elems 1 times at end-1 (var)
39.    2.09770|   1.89870|1.10  |linsert L[10] shared 1 elems 1000 times at end-1 (var)
40.    9.05570|   7.55030|1.20  |linsert L[10] shared 5 elems 1000 times at end-1 (var)
41.    0.80080|   0.76280|1.05  |linsert L[100] shared 1 elems 1 times at end-1 (var)
42.    2.41200|   2.12630|1.13  |linsert L[100] shared 1 elems 1000 times at end-1 (var)
43.    9.32400|   7.77270|1.20  |linsert L[100] shared 5 elems 1000 times at end-1 (var)
44.    3.84790|   3.32180|1.16  |linsert L[1000] shared 1 elems 1 times at end-1 (var)
45.    5.35570|   4.80630|1.11  |linsert L[1000] shared 1 elems 1000 times at end-1 (var)
46.   12.37500|  10.41570|1.19  |linsert L[1000] shared 5 elems 1000 times at end-1 (var)
47.   35.28820|  30.29200|1.16  |linsert L[10000] shared 1 elems 1 times at end-1 (var)
48.   36.78430|  31.61500|1.16  |linsert L[10000] shared 1 elems 1000 times at end-1 (var)
49.   44.48700|  39.07300|1.14  |linsert L[10000] shared 5 elems 1000 times at end-1 (var)
50.    0.64420|   0.55340|1.16  |linsert L[10] shared 1 elems 1 times at end (var)
51.    2.11600|   1.85770|1.14  |linsert L[10] shared 1 elems 1000 times at end (var)
52.    9.00430|   7.62200|1.18  |linsert L[10] shared 5 elems 1000 times at end (var)
53.    0.79890|   0.74750|1.07  |linsert L[100] shared 1 elems 1 times at end (var)
54.    2.42330|   2.05930|1.18  |linsert L[100] shared 1 elems 1000 times at end (var)
55.    9.48700|   7.78170|1.22  |linsert L[100] shared 5 elems 1000 times at end (var)
56.    3.80500|   3.30070|1.15  |linsert L[1000] shared 1 elems 1 times at end (var)
57.    5.61330|   4.72230|1.19  |linsert L[1000] shared 1 elems 1000 times at end (var)
58.   12.48070|  10.33970|1.21  |linsert L[1000] shared 5 elems 1000 times at end (var)
59.   35.22460|  29.26230|1.20  |linsert L[10000] shared 1 elems 1 times at end (var)
60.   37.17000|  31.39700|1.18  |linsert L[10000] shared 1 elems 1000 times at end (var)
61.   43.76670|  38.58900|1.13  |linsert L[10000] shared 5 elems 1000 times at end (var)
```

**Insertion into an unshared list at a variable index**

The pre-TIP 625 implementation moves the contents of the list storage "in-place"
when it is unshared and thus is fairly efficient as it is. As with the shared
case, there is an measurable improvement with TIP 625 when repeated prepending
but is much less pronounced since moving memory is fairly fast to begin with.
The difference will however become more pronounced for larger lists.

Moreover, this improvement also carries over to the case where the insertion is
at an index where the prefix is significantly shorter than the suffix around the
insertion point (77, 78). This is because with spans, there is both free leading
and trailing space permitting the shorter segment to be moved to make room for
insertions.

```
           [1]           [2]
62.    0.18780|   0.20680|0.91  |linsert L[0] unshared 1 elems 1 times at 0 (var)
63.    1.10530|   0.55870|1.98  |linsert L[10] unshared 1 elems 1000 times at 0 (var)
64.    1.00530|   0.57400|1.75  |linsert L[10] unshared 5 elems 1000 times at 0 (var)
65.    0.67730|   0.55030|1.23  |linsert L[100] unshared 1 elems 1000 times at 0 (var)
66.    0.98700|   0.57030|1.73  |linsert L[100] unshared 5 elems 1000 times at 0 (var)
67.    0.78970|   0.52500|1.50  |linsert L[1000] unshared 1 elems 1000 times at 0 (var)
68.    1.21670|   0.56600|2.15  |linsert L[1000] unshared 5 elems 1000 times at 0 (var)
69.    2.55330|   0.54470|4.69  |linsert L[10000] unshared 1 elems 1000 times at 0 (var)
70.    2.89630|   0.56370|5.14  |linsert L[10000] unshared 5 elems 1000 times at 0 (var)
71.    0.63900|   0.71400|0.89  |linsert L[10] unshared 1 elems 1000 times at 1 (var)
72.    1.03970|   1.27100|0.82  |linsert L[10] unshared 5 elems 1000 times at 1 (var)
73.    0.68130|   1.00930|0.68  |linsert L[100] unshared 1 elems 1000 times at 1 (var)
74.    1.04000|   0.68200|1.52  |linsert L[100] unshared 5 elems 1000 times at 1 (var)
75.    1.53330|   1.02900|1.49  |linsert L[1000] unshared 1 elems 1000 times at 1 (var)
76.    1.61600|   1.21000|1.34  |linsert L[1000] unshared 5 elems 1000 times at 1 (var)
77.    2.74670|   0.59370|4.63  |linsert L[10000] unshared 1 elems 1000 times at 1 (var)
78.    3.16400|   0.56770|5.57  |linsert L[10000] unshared 5 elems 1000 times at 1 (var)
79.    1.09870|   0.99970|1.10  |linsert L[10] unshared 1 elems 1000 times at 5 (var)
80.    1.00570|   1.28030|0.79  |linsert L[10] unshared 5 elems 1000 times at 5 (var)
81.    1.15530|   0.54670|2.11  |linsert L[100] unshared 1 elems 1000 times at 50 (var)
82.    1.00000|   0.88270|1.13  |linsert L[100] unshared 5 elems 1000 times at 50 (var)
83.    0.72100|   0.59070|1.22  |linsert L[1000] unshared 1 elems 1000 times at 500 (var)
84.    1.11730|   1.06100|1.05  |linsert L[1000] unshared 5 elems 1000 times at 500 (var)
85.    1.66330|   1.24730|1.33  |linsert L[10000] unshared 1 elems 1000 times at 5000 (var)
86.    2.07230|   1.27530|1.62  |linsert L[10000] unshared 5 elems 1000 times at 5000 (var)
87.    1.07970|   0.60230|1.79  |linsert L[10] unshared 1 elems 1000 times at end-1 (var)
88.    0.60630|   0.78870|0.77  |linsert L[10] unshared 5 elems 1000 times at end-1 (var)
89.    0.90630|   1.05270|0.86  |linsert L[100] unshared 1 elems 1000 times at end-1 (var)
90.    0.64300|   0.69070|0.93  |linsert L[100] unshared 5 elems 1000 times at end-1 (var)
91.    0.63330|   1.04100|0.61  |linsert L[1000] unshared 1 elems 1000 times at end-1 (var)
92.    0.62530|   1.13900|0.55  |linsert L[1000] unshared 5 elems 1000 times at end-1 (var)
93.    0.59200|   0.58500|1.01  |linsert L[10000] unshared 1 elems 1000 times at end-1 (var)
94.    0.61400|   0.61170|1.00  |linsert L[10000] unshared 5 elems 1000 times at end-1 (var)
95.    0.62470|   0.55700|1.12  |linsert L[10] unshared 1 elems 1000 times at end (var)
96.    0.65270|   0.62330|1.05  |linsert L[10] unshared 5 elems 1000 times at end (var)
97.    1.02030|   1.00730|1.01  |linsert L[100] unshared 1 elems 1000 times at end (var)
98.    0.62070|   0.57630|1.08  |linsert L[100] unshared 5 elems 1000 times at end (var)
99.    0.62030|   0.56030|1.11  |linsert L[1000] unshared 1 elems 1000 times at end (var)
100.   0.64170|   0.89930|0.71  |linsert L[1000] unshared 5 elems 1000 times at end (var)
101.   0.57830|   0.57030|1.01  |linsert L[10000] unshared 1 elems 1000 times at end (var)
102.   0.64330|   0.62070|1.04  |linsert L[10000] unshared 5 elems 1000 times at end (var)
```

**Insertion into an shared list at a constant index**

While the variable index argument to `linsert` generates a callout to the
`Tcl_ListObjReplace` C function, when an constant index is supplied for the
`linsert` command, the generated byte code implements the command as a sequence
of range and concat operations. It thus does not profit from the same
efficiencies as the variable case. Nevertheless, at larger list sizes, there is
a benefit as a consequence of the faster range operations implemented in
TIP 625. This benefit is however mitigated by the fact that a new list object
always has to be created which is always an expensive operation. The net
improvement is therefore minor.

There is currently no plan to modify the compiler generated bytecode to take
advantage of spans or any free space at the front of the list.

```
           [1]           [2]
103.   0.18540|   0.18130|1.02  |linsert L[0] shared 1 elems 1 times at 0 (const)
104.   0.25880|   0.26330|0.98  |linsert L[10] shared 1 elems 1 times at 0 (const)
105.   0.44330|   0.38000|1.17  |linsert L[10] shared 1 elems 100 times at 0 (const)
106.   1.22000|   0.96670|1.26  |linsert L[10] shared 5 elems 100 times at 0 (const)
107.   0.60530|   0.51480|1.18  |linsert L[100] shared 1 elems 1 times at 0 (const)
108.   0.73670|   0.62000|1.19  |linsert L[100] shared 1 elems 100 times at 0 (const)
109.   1.49330|   1.21330|1.23  |linsert L[100] shared 5 elems 100 times at 0 (const)
110.   3.95110|   2.93190|1.35  |linsert L[1000] shared 1 elems 1 times at 0 (const)
111.   4.13000|   3.28330|1.26  |linsert L[1000] shared 1 elems 100 times at 0 (const)
112.   4.97000|   3.83670|1.30  |linsert L[1000] shared 5 elems 100 times at 0 (const)
113.  38.36360|  28.76360|1.33  |linsert L[10000] shared 1 elems 1 times at 0 (const)
114.  37.51330|  29.32670|1.28  |linsert L[10000] shared 1 elems 100 times at 0 (const)
115.  39.89000|  30.17000|1.32  |linsert L[10000] shared 5 elems 100 times at 0 (const)
116.   0.47830|   0.51190|0.93  |linsert L[10] shared 1 elems 1 times at 1 (const)
117.   1.08000|   0.87330|1.24  |linsert L[10] shared 1 elems 100 times at 1 (const)
118.   3.25330|   1.90670|1.71  |linsert L[10] shared 5 elems 100 times at 1 (const)
119.   1.46070|   1.25230|1.17  |linsert L[100] shared 1 elems 1 times at 1 (const)
120.   1.89670|   1.64330|1.15  |linsert L[100] shared 1 elems 100 times at 1 (const)
121.   4.14000|   2.50000|1.66  |linsert L[100] shared 5 elems 100 times at 1 (const)
122.  11.23310|   5.98890|1.88  |linsert L[1000] shared 1 elems 1 times at 1 (const)
123.  11.66670|   6.32670|1.84  |linsert L[1000] shared 1 elems 100 times at 1 (const)
124.  14.07330|   7.62670|1.85  |linsert L[1000] shared 5 elems 100 times at 1 (const)
125. 112.16530|  58.52860|1.92  |linsert L[10000] shared 1 elems 1 times at 1 (const)
126. 113.97000|  60.19330|1.89  |linsert L[10000] shared 1 elems 100 times at 1 (const)
127. 115.52670|  62.52670|1.85  |linsert L[10000] shared 5 elems 100 times at 1 (const)
128.   0.50360|   0.50910|0.99  |linsert L[10] shared 1 elems 1 times at 5 (const)
129.   1.07000|   1.31000|0.82  |linsert L[10] shared 1 elems 100 times at 5 (const)
130.   3.20330|   1.90330|1.68  |linsert L[10] shared 5 elems 100 times at 5 (const)
131.   1.12490|   0.98450|1.14  |linsert L[100] shared 1 elems 1 times at 50 (const)
132.   1.61000|   1.35330|1.19  |linsert L[100] shared 1 elems 100 times at 50 (const)
133.   3.76000|   2.35330|1.60  |linsert L[100] shared 5 elems 100 times at 50 (const)
134.   7.66140|   4.52380|1.69  |linsert L[1000] shared 1 elems 1 times at 500 (const)
135.   8.06330|   6.87330|1.17  |linsert L[1000] shared 1 elems 100 times at 500 (const)
136.  10.31000|   8.18670|1.26  |linsert L[1000] shared 5 elems 100 times at 500 (const)
137.  75.09560|  43.91060|1.71  |linsert L[10000] shared 1 elems 1 times at 5000 (const)
138.  74.12000|  61.13670|1.21  |linsert L[10000] shared 1 elems 100 times at 5000 (const)
139.  77.89670|  63.89670|1.22  |linsert L[10000] shared 5 elems 100 times at 5000 (const)
140.   0.44220|   0.48840|0.91  |linsert L[10] shared 1 elems 1 times at 9 (const)
141.   1.07000|   0.89330|1.20  |linsert L[10] shared 1 elems 100 times at 9 (const)
142.   3.19670|   1.88670|1.69  |linsert L[10] shared 5 elems 100 times at 9 (const)
143.   0.73510|   0.73570|1.00  |linsert L[100] shared 1 elems 1 times at 99 (const)
144.   1.29330|   1.13000|1.14  |linsert L[100] shared 1 elems 100 times at 99 (const)
145.   3.45330|   2.33670|1.48  |linsert L[100] shared 5 elems 100 times at 99 (const)
146.   3.94120|   3.12830|1.26  |linsert L[1000] shared 1 elems 1 times at 999 (const)
147.   5.15670|   3.70000|1.39  |linsert L[1000] shared 1 elems 100 times at 999 (const)
148.   6.80330|   5.69000|1.20  |linsert L[1000] shared 5 elems 100 times at 999 (const)
149.  37.68500|  28.63000|1.32  |linsert L[10000] shared 1 elems 1 times at 9999 (const)
150.  37.92000|  30.65330|1.24  |linsert L[10000] shared 1 elems 100 times at 9999 (const)
151.  41.80330|  31.68000|1.32  |linsert L[10000] shared 5 elems 100 times at 9999 (const)
152.   0.45730|   0.48470|0.94  |linsert L[10] shared 1 elems 1 times at 8 (const)
153.   1.05330|   2.13330|0.49  |linsert L[10] shared 1 elems 100 times at 8 (const)
154.   3.14000|   2.29670|1.37  |linsert L[10] shared 5 elems 100 times at 8 (const)
155.   0.76410|   0.71740|1.07  |linsert L[100] shared 1 elems 1 times at 98 (const)
156.   1.30670|   1.12330|1.16  |linsert L[100] shared 1 elems 100 times at 98 (const)
157.   3.47330|   2.30330|1.51  |linsert L[100] shared 5 elems 100 times at 98 (const)
158.   3.91820|   3.14420|1.25  |linsert L[1000] shared 1 elems 1 times at 998 (const)
159.   4.62670|   3.68330|1.26  |linsert L[1000] shared 1 elems 100 times at 998 (const)
160.   6.83330|   5.57000|1.23  |linsert L[1000] shared 5 elems 100 times at 998 (const)
161.  37.70950|  29.19590|1.29  |linsert L[10000] shared 1 elems 1 times at 9998 (const)
162.  38.74670|  29.55670|1.31  |linsert L[10000] shared 1 elems 100 times at 9998 (const)
163.  40.15670|  31.91330|1.26  |linsert L[10000] shared 5 elems 100 times at 9998 (const)
```

**Insertion into an unshared list at a constant index**

In the case of an **unshared** list the performance benefit can be significantly
greater (15-35x) than the shared case (195, 196, 203, 204). This is because of
the sequence of byte code operations generated which dups the operand list
object, extracts the prefix and suffix ranges and concatenates them with the
insertion objects in the middle. The prefix is extracted as a range from the
dup'ed object which can be expensive in the pre-TIP 625 implementation when the
prefix is long. In TIP 625 range operations on shared objects are still very
efficient and hence the improvement in performance.

```
           [1]           [2]
164.   0.13330|   0.12820|1.04  |linsert L[0] unshared 1 elems 1 times at 0 (const)
165.   0.70330|   0.56330|1.25  |linsert L[10] unshared 1 elems 100 times at 0 (const)
166.   1.34670|   1.13000|1.19  |linsert L[10] unshared 5 elems 100 times at 0 (const)
167.   0.97330|   1.16000|0.84  |linsert L[100] unshared 1 elems 100 times at 0 (const)
168.   1.69000|   1.53000|1.10  |linsert L[100] unshared 5 elems 100 times at 0 (const)
169.   4.27000|   3.34330|1.28  |linsert L[1000] unshared 1 elems 100 times at 0 (const)
170.   5.30670|   4.06670|1.30  |linsert L[1000] unshared 5 elems 100 times at 0 (const)
171.  38.51330|  29.28330|1.32  |linsert L[10000] unshared 1 elems 100 times at 0 (const)
172.  39.07000|  30.26330|1.29  |linsert L[10000] unshared 5 elems 100 times at 0 (const)
173.   0.99670|   1.01330|0.98  |linsert L[10] unshared 1 elems 100 times at 1 (const)
174.   2.42670|   2.01330|1.21  |linsert L[10] unshared 5 elems 100 times at 1 (const)
175.   1.68670|   1.57670|1.07  |linsert L[100] unshared 1 elems 100 times at 1 (const)
176.   3.07000|   2.53330|1.21  |linsert L[100] unshared 5 elems 100 times at 1 (const)
177.   8.40670|   6.45000|1.30  |linsert L[1000] unshared 1 elems 100 times at 1 (const)
178.  10.08000|   7.74670|1.30  |linsert L[1000] unshared 5 elems 100 times at 1 (const)
179.  78.64330|  57.81670|1.36  |linsert L[10000] unshared 1 elems 100 times at 1 (const)
180.  79.64000|  59.39670|1.34  |linsert L[10000] unshared 5 elems 100 times at 1 (const)
181.   0.97000|   0.85000|1.14  |linsert L[10] unshared 1 elems 100 times at 5 (const)
182.   2.81670|   1.98330|1.42  |linsert L[10] unshared 5 elems 100 times at 5 (const)
183.   1.45000|   1.18670|1.22  |linsert L[100] unshared 1 elems 100 times at 50 (const)
184.   2.87670|   2.30000|1.25  |linsert L[100] unshared 5 elems 100 times at 50 (const)
185.   6.32000|   5.09000|1.24  |linsert L[1000] unshared 1 elems 100 times at 500 (const)
186.   7.62330|   6.20670|1.23  |linsert L[1000] unshared 5 elems 100 times at 500 (const)
187.  57.87330|  44.85670|1.29  |linsert L[10000] unshared 1 elems 100 times at 5000 (const)
188.  59.49000|  46.44330|1.28  |linsert L[10000] unshared 5 elems 100 times at 5000 (const)
189.   1.10670|   0.84670|1.31  |linsert L[10] unshared 1 elems 100 times at 9 (const)
190.   2.42670|   1.97670|1.23  |linsert L[10] unshared 5 elems 100 times at 9 (const)
191.   1.28000|   1.09330|1.17  |linsert L[100] unshared 1 elems 100 times at 99 (const)
192.   2.74330|   2.21670|1.24  |linsert L[100] unshared 5 elems 100 times at 99 (const)
193.   4.36000|   0.93000|4.69  |linsert L[1000] unshared 1 elems 100 times at 999 (const)
194.   5.99670|   2.57670|2.33  |linsert L[1000] unshared 5 elems 100 times at 999 (const)
195.  37.42000|   0.99670|37.54 |linsert L[10000] unshared 1 elems 100 times at 9999 (const)
196.  39.17670|   2.60330|15.05 |linsert L[10000] unshared 5 elems 100 times at 9999 (const)
197.   0.97330|   0.85000|1.15  |linsert L[10] unshared 1 elems 100 times at 8 (const)
198.   2.44000|   1.98000|1.23  |linsert L[10] unshared 5 elems 100 times at 8 (const)
199.   1.19000|   1.30670|0.91  |linsert L[100] unshared 1 elems 100 times at 98 (const)
200.   2.74670|   2.22000|1.24  |linsert L[100] unshared 5 elems 100 times at 98 (const)
201.   4.37000|   0.95000|4.60  |linsert L[1000] unshared 1 elems 100 times at 998 (const)
202.   6.00000|   2.57000|2.33  |linsert L[1000] unshared 5 elems 100 times at 998 (const)
203.  37.51000|   1.09330|34.31 |linsert L[10000] unshared 1 elems 100 times at 9998 (const)
204.  38.61330|   2.60670|14.81 |linsert L[10000] unshared 5 elems 100 times at 9998 (const)
```

**Total run time**

```
           [1]           [2]
205. 2530.56730|1705.90700|1.48  |linsert total run time
```

### <a id='lrange'></a>lrange

**Extracting ranges from shared lists**

Prior to TIP 625 range operations on shared lists involved allocating new
list storage, copying the elements (pointers) within the range and incrementing
all their reference counts. With the introduction of spans in TIP 625, this is
reduced to allocating a `ListSpan` and storing the range endpoint indices.
The improvement in performance is therefore considerable for even moderately
sized ranges (20, 23, 24) and even more for larger ranges (32, 34, 35).

For smaller ranges spans are not used. See [Memory usage](#Memoryusage).


```
           [1]           [2]
1.     0.21440|   0.25370|0.85  |lrange L[10] shared range 0 0
2.     0.25440|   0.25410|1.00  |lrange L[10] shared range 0 end-1
3.     0.24980|   0.24210|1.03  |lrange L[10] shared range 1 3
4.     0.21510|   0.22770|0.94  |lrange L[10] shared range 1 7
5.     0.23670|   0.23180|1.02  |lrange L[10] shared range 1 end
6.     0.20950|   0.26910|0.78  |lrange L[10] shared range end-1 end
7.     0.20490|   0.23460|0.87  |lrange L[100] shared range 0 0
8.     0.52390|   0.48350|1.08  |lrange L[100] shared range 0 end-1
9.     0.26780|   0.29530|0.91  |lrange L[100] shared range 12 36
10.    0.44480|   0.41870|1.06  |lrange L[100] shared range 12 84
11.    0.52210|   0.48630|1.07  |lrange L[100] shared range 1 end
12.    0.21310|   0.23690|0.90  |lrange L[100] shared range end-1 end
13.    0.25190|   0.22590|1.12  |lrange L[100] shared-span range 0 0
14.    0.53790|   0.48840|1.10  |lrange L[100] shared-span range 0 end-1
15.    0.28620|   0.29560|0.97  |lrange L[100] shared-span range 12 36
16.    0.45080|   0.41780|1.08  |lrange L[100] shared-span range 12 84
17.    0.53400|   0.50430|1.06  |lrange L[100] shared-span range 1 end
18.    0.25040|   0.26950|0.93  |lrange L[100] shared-span range end-1 end
19.    0.24860|   0.21460|1.16  |lrange L[1000] shared range 0 0
20.    3.52010|   0.24920|14.13 |lrange L[1000] shared range 0 end-1
21.    1.02110|   0.89190|1.14  |lrange L[1000] shared range 125 375
22.    2.70940|   0.23740|11.41 |lrange L[1000] shared range 125 875
23.    3.51850|   0.20270|17.36 |lrange L[1000] shared range 1 end
24.    0.22500|   0.22570|1.00  |lrange L[1000] shared range end-1 end
25.    0.21470|   0.27290|0.79  |lrange L[1000] shared-span range 0 0
26.    3.52640|   0.26750|13.18 |lrange L[1000] shared-span range 0 end-1
27.    1.03050|   0.91470|1.13  |lrange L[1000] shared-span range 125 375
28.    2.74930|   0.21490|12.79 |lrange L[1000] shared-span range 125 875
29.    3.54340|   0.25600|13.84 |lrange L[1000] shared-span range 1 end
30.    0.23830|   0.25140|0.95  |lrange L[1000] shared-span range end-1 end
31.    0.20370|   0.25660|0.79  |lrange L[10000] shared range 0 0
32.   34.71510|   0.20390|170.26|lrange L[10000] shared range 0 end-1
33.    8.84370|   7.63740|1.16  |lrange L[10000] shared range 1250 3750
34.   26.02270|   0.20440|127.31|lrange L[10000] shared range 1250 8750
35.   34.68470|   0.20520|169.03|lrange L[10000] shared range 1 end
36.    0.23660|   0.21570|1.10  |lrange L[10000] shared range end-1 end
37.    0.23460|   0.25280|0.93  |lrange L[10000] shared-span range 0 0
38.   34.67930|   0.25190|137.67|lrange L[10000] shared-span range 0 end-1
39.    8.83120|   7.80600|1.13  |lrange L[10000] shared-span range 1250 3750
40.   26.00760|   0.28250|92.06 |lrange L[10000] shared-span range 1250 8750
41.   34.69180|   0.21290|162.95|lrange L[10000] shared-span range 1 end
42.    0.23830|   0.24700|0.96  |lrange L[10000] shared-span range end-1 end
```

**Extracting ranges from unshared lists**

When lists are unshared, the overhead of unshared list creation for 
performance tests seems to make measurement difficult while the actual range
operation is very fast. This is reflected by the 0 values in the table below.


```
43.    0.05100|   0.00470|10.85 |lrange L[10] unshared range 0 0
44.    0.04680|   0.00770|6.08  |lrange L[10] unshared range 0 end-1
45.    0.09790|   0.04960|1.97  |lrange L[10] unshared range 1 3
46.    0.05050|   0.05060|1.00  |lrange L[10] unshared range 1 7
47.    0.07620|   0.04910|1.55  |lrange L[10] unshared range 1 end
48.    0.07200|   0.02710|2.66  |lrange L[10] unshared range end-1 end
49.    0.03360|   0.10320|0.33  |lrange L[100] unshared range 0 0
50.    0.06580|   0.00000|Inf   |lrange L[100] unshared range 0 end-1
51.    0.04010|   0.06420|0.62  |lrange L[100] unshared range 12 36
52.    0.04080|   0.06420|0.64  |lrange L[100] unshared range 12 84
53.    0.07140|   0.06390|1.12  |lrange L[100] unshared range 1 end
54.    0.03600|   0.11250|0.32  |lrange L[100] unshared range end-1 end
55.    0.05800|   0.09130|0.64  |lrange L[100] unshared-span range 0 0
56.    0.03770|   0.03110|1.21  |lrange L[100] unshared-span range 0 end-1
57.    0.04950|   0.00000|Inf   |lrange L[100] unshared-span range 12 36
58.    0.03120|   0.01390|2.24  |lrange L[100] unshared-span range 12 84
59.    0.05440|   0.00520|10.46 |lrange L[100] unshared-span range 1 end
60.    0.02480|   0.05610|0.44  |lrange L[100] unshared-span range end-1 end
61.    0.00000|   0.00220|0.00  |lrange L[1000] unshared range 0 0
62.    0.06130|   0.00740|8.28  |lrange L[1000] unshared range 0 end-1
63.    0.03550|   0.04470|0.79  |lrange L[1000] unshared range 125 375
64.    0.09490|   0.04210|2.25  |lrange L[1000] unshared range 125 875
65.    0.14050|   0.01310|10.73 |lrange L[1000] unshared range 1 end
66.    0.00000|   0.23580|0.00  |lrange L[1000] unshared range end-1 end
67.    0.05750|   0.10460|0.55  |lrange L[1000] unshared-span range 0 0
68.    0.04160|   0.08040|0.52  |lrange L[1000] unshared-span range 0 end-1
69.    0.01420|   0.08840|0.16  |lrange L[1000] unshared-span range 125 375
70.    0.01840|   0.00000|Inf   |lrange L[1000] unshared-span range 125 875
71.    0.14030|   0.08980|1.56  |lrange L[1000] unshared-span range 1 end
72.    0.00000|   0.05250|0.00  |lrange L[1000] unshared-span range end-1 end
73.    0.35680|   0.00000|Inf   |lrange L[10000] unshared range 0 0
74.    0.00000|   0.29400|0.00  |lrange L[10000] unshared range 0 end-1
75.    0.32920|   0.00000|Inf   |lrange L[10000] unshared range 1250 3750
76.    1.08890|   0.00000|Inf   |lrange L[10000] unshared range 1250 8750
77.    1.34590|   0.00000|Inf   |lrange L[10000] unshared range 1 end
78.    0.00000|   0.00000|NaN   |lrange L[10000] unshared range end-1 end
79.    0.71840|   0.00000|Inf   |lrange L[10000] unshared-span range 0 0
80.    0.85540|   0.07690|11.12 |lrange L[10000] unshared-span range 0 end-1
81.    1.09630|   0.00000|Inf   |lrange L[10000] unshared-span range 1250 3750
82.    1.56450|   0.00000|Inf   |lrange L[10000] unshared-span range 1250 8750
83.    2.23600|   0.00000|Inf   |lrange L[10000] unshared-span range 1 end
84.    0.47300|   0.00000|Inf   |lrange L[10000] unshared-span range end-1 end
85.  249.40840|  29.73670|8.39  |lrange total run time
```

### <a id='lassign'></a>lassign

A `lassign` is essentially one or more `lindex`-like operations combined with
a range operation. TIP 625 optimizes the latter and thus shows similar
benefits (5-8, 11-12) for the same reasons as [lrange](#lrange). 

```
           [1]           [2]
1.     0.96470|   0.51570|1.87  |lassign L[10] shared 1 elems 1000 times
2.     1.89870|   1.16070|1.64  |lassign L[10] shared 5 elems 1000 times
3.     1.19530|   1.21800|0.98  |lassign L[100] shared 1 elems 1000 times
4.     1.24400|   2.17270|0.57  |lassign L[100] shared 5 elems 1000 times
5.     3.81000|   0.43970|8.66  |lassign L[1000] shared 1 elems 1000 times
6.     3.82770|   1.00600|3.80  |lassign L[1000] shared 5 elems 1000 times
7.    30.35730|   0.42370|71.65 |lassign L[10000] shared 1 elems 1000 times
8.    34.00100|   0.97600|34.84 |lassign L[10000] shared 5 elems 1000 times
9.     0.50000|   0.87500|0.57  |lassign L[10] unshared 1 elems 8 times
10.    0.64970|   0.63950|1.02  |lassign L[100] unshared 1 elems 98 times
11.    2.64930|   0.49930|5.31  |lassign L[1000] unshared 1 elems 498 times
12.   23.00290|   0.49100|46.85 |lassign L[10000] unshared 1 elems 4998 times
13.  104.10050|  10.41710|9.99  |lassign total run time
```

### <a id='lpop'></a>lpop


**Popping an element from a shared list variable**

A `lpop` in the general case is has the same performance with the exception
of popping elements in the front or end (13, 16) which benefit from being
able to use a span.

```
           [1]           [2]
1.     0.62500|   0.66670|0.94  |lpop L[10] shared at 0 8 times
2.     0.66670|   0.66670|1.00  |lpop L[10] shared at 1 8 times
3.     0.75000|   0.79170|0.95  |lpop L[10] shared at end-1 8 times
4.     0.75000|   0.75000|1.00  |lpop L[10] shared at end 8 times
5.     0.77210|   0.71770|1.08  |lpop L[100] shared at 0 98 times
6.     0.74150|   0.71770|1.03  |lpop L[100] shared at 1 98 times
7.     0.84010|   0.78910|1.06  |lpop L[100] shared at end-1 98 times
8.     0.80610|   0.84350|0.96  |lpop L[100] shared at end 98 times
9.     3.00070|   0.57430|5.22  |lpop L[1000] shared at 0 498 times
10.    3.01610|   2.60440|1.16  |lpop L[1000] shared at 1 498 times
11.    3.07430|   2.70820|1.14  |lpop L[1000] shared at end-1 498 times
12.    3.08300|   0.60310|5.11  |lpop L[1000] shared at end 498 times
13.   26.51510|   0.57460|46.15 |lpop L[10000] shared at 0 4998 times
14.   26.54970|  23.53140|1.13  |lpop L[10000] shared at 1 4998 times
15.   26.71740|  23.13300|1.15  |lpop L[10000] shared at end-1 4998 times
16.   26.75190|   0.65620|40.77 |lpop L[10000] shared at end 4998 times
```

**Popping an element from an unshared list variable**

Again, unshared list storage is manipulated in both implementations by fast
memory movement operations. There is 3x benefit from TIP 625 being able to move
the smaller segment in the split (29, 30) but memory operations being fast, this
is not as pronounced as the shared case.

```
17.    1.00000|   0.54170|1.85  |lpop L[10] unshared at 0 8 times
18.    0.50000|   0.58330|0.86  |lpop L[10] unshared at 1 8 times
19.    0.62500|   0.62500|1.00  |lpop L[10] unshared at end-1 8 times
20.    0.62500|   0.62500|1.00  |lpop L[10] unshared at end 8 times
21.    0.56460|   0.57480|0.98  |lpop L[100] unshared at 0 98 times
22.    0.57140|   0.57480|0.99  |lpop L[100] unshared at 1 98 times
23.    0.62930|   0.63270|0.99  |lpop L[100] unshared at end-1 98 times
24.    0.61220|   0.63950|0.96  |lpop L[100] unshared at end 98 times
25.    0.63720|   0.61310|1.04  |lpop L[1000] unshared at 0 498 times
26.    0.62520|   0.57630|1.08  |lpop L[1000] unshared at 1 498 times
27.    0.62180|   0.62450|1.00  |lpop L[1000] unshared at end-1 498 times
28.    0.61310|   0.63450|0.97  |lpop L[1000] unshared at end 498 times
29.    1.63330|   0.56870|2.87  |lpop L[10000] unshared at 0 4998 times
30.    1.79790|   0.57550|3.12  |lpop L[10000] unshared at 1 4998 times
31.    0.61620|   0.63030|0.98  |lpop L[10000] unshared at end-1 4998 times
32.    0.61040|   0.63150|0.97  |lpop L[10000] unshared at end 4998 times
```

**Popping a nested element**

There is no benefit popping a nested element because the outer list size
is not affected and the inner list in the test scripts is only a pair.
There would be a benefit if the inner list was large but benefits with
large lists is already illustrated above.

```
33.    1.87500|   0.95830|1.96  |lpop L[10] shared at {0 0} 8 times
34.    1.00000|   1.79170|0.56  |lpop L[10] shared at {1 0} 8 times
35.    1.00000|   1.87500|0.53  |lpop L[10] shared at {end-1 0} 8 times
36.    1.91670|   1.75000|1.10  |lpop L[10] shared at {end 0} 8 times
37.    1.13610|   1.90140|0.60  |lpop L[100] shared at {0 0} 98 times
38.    1.15310|   1.03400|1.12  |lpop L[100] shared at {1 0} 98 times
39.    1.19730|   1.94560|0.62  |lpop L[100] shared at {end-1 0} 98 times
40.    1.16330|   1.98300|0.59  |lpop L[100] shared at {end 0} 98 times
41.    3.92770|   3.52340|1.11  |lpop L[1000] shared at {0 0} 498 times
42.    3.99930|   3.52880|1.13  |lpop L[1000] shared at {1 0} 498 times
43.    4.14660|   3.55560|1.17  |lpop L[1000] shared at {end-1 0} 498 times
44.    4.13520|   3.78110|1.09  |lpop L[1000] shared at {end 0} 498 times
45.   35.43270|  29.50360|1.20  |lpop L[10000] shared at {0 0} 4998 times
46.   35.42940|  29.55170|1.20  |lpop L[10000] shared at {1 0} 4998 times
47.   35.69910|  29.65230|1.20  |lpop L[10000] shared at {end-1 0} 4998 times
48.   35.72930|  29.53960|1.21  |lpop L[10000] shared at {end 0} 4998 times
49.  305.88310| 215.85440|1.42  |lpop total run time
```

### <a id='lset'></a>lset

The `lset` command always modifies existing elements except when it is appending
elements at the end in unshared objects. Thus the optimizations enabled by spans
have no relevance and there is no fundamental difference in performance with TIP
625.

```
           [1]           [2]
1.     0.66100|   0.52020|1.27  |lset L[10] shared at 0
2.     0.58350|   0.50630|1.15  |lset L[10] shared at 1
3.     0.74100|   0.56530|1.31  |lset L[10] shared at end-1
4.     0.53390|   0.56890|0.94  |lset L[10] shared at end
5.    18.29250|  14.80990|1.24  |lset L[10] shared at end+1
6.     0.77470|   0.76170|1.02  |lset L[100] shared at 0
7.     0.77850|   0.73750|1.06  |lset L[100] shared at 1
8.     0.78550|   0.86950|0.90  |lset L[100] shared at end-1
9.     0.82000|   0.82230|1.00  |lset L[100] shared at end
10.   18.29150|  15.01350|1.22  |lset L[100] shared at end+1
11.    3.77540|   3.24230|1.16  |lset L[1000] shared at 0
12.    3.77920|   3.21060|1.18  |lset L[1000] shared at 1
13.    3.85980|   3.34070|1.16  |lset L[1000] shared at end-1
14.    3.78070|   3.78780|1.00  |lset L[1000] shared at end
15.   21.49420|  17.83840|1.20  |lset L[1000] shared at end+1
16.   35.05950|  28.91080|1.21  |lset L[10000] shared at 0
17.   35.02110|  28.86800|1.21  |lset L[10000] shared at 1
18.   35.35520|  29.16350|1.21  |lset L[10000] shared at end-1
19.   35.36760|  29.61640|1.19  |lset L[10000] shared at end
20.   53.12720|  46.70010|1.14  |lset L[10000] shared at end+1
21.    0.46900|   0.58610|0.80  |lset L[10] unshared at 0
22.    0.54760|   0.42710|1.28  |lset L[10] unshared at 1
23.    0.63430|   0.48870|1.30  |lset L[10] unshared at end-1
24.    0.70830|   0.48200|1.47  |lset L[10] unshared at end
25.    0.48820|   0.49160|0.99  |lset L[10] unshared at end+1
26.    0.43980|   0.45920|0.96  |lset L[100] unshared at 0
27.    0.47010|   0.43100|1.09  |lset L[100] unshared at 1
28.    0.50790|   0.51480|0.99  |lset L[100] unshared at end-1
29.    0.51490|   0.48460|1.06  |lset L[100] unshared at end
30.    0.48470|   0.48910|0.99  |lset L[100] unshared at end+1
31.    0.54990|   0.43500|1.26  |lset L[1000] unshared at 0
32.    0.66490|   0.42830|1.55  |lset L[1000] unshared at 1
33.    0.48850|   0.48410|1.01  |lset L[1000] unshared at end-1
34.    0.48220|   0.48240|1.00  |lset L[1000] unshared at end
35.    0.48480|   0.49340|0.98  |lset L[1000] unshared at end+1
36.    0.42830|   0.42870|1.00  |lset L[10000] unshared at 0
37.    0.43210|   0.42910|1.01  |lset L[10000] unshared at 1
38.    0.48240|   0.48850|0.99  |lset L[10000] unshared at end-1
39.    0.47850|   0.48820|0.98  |lset L[10000] unshared at end
40.    0.47870|   0.49310|0.97  |lset L[10000] unshared at end+1
41.    0.80710|   0.83320|0.97  |lset L[10] shared at {0 0}
42.    0.81530|   0.84830|0.96  |lset L[10] shared at {1 0}
43.    0.86030|   0.85740|1.00  |lset L[10] shared at {end-1 0}
44.    0.86040|   0.84410|1.02  |lset L[10] shared at {end 0}
45.    0.89310|   0.86580|1.03  |lset L[100] shared at {0 0}
46.    0.88720|   0.88110|1.01  |lset L[100] shared at {1 0}
47.    0.92060|   0.92840|0.99  |lset L[100] shared at {end-1 0}
48.    0.90130|   0.93150|0.97  |lset L[100] shared at {end 0}
49.    3.84860|   3.30240|1.17  |lset L[1000] shared at {0 0}
50.    3.87790|   3.27960|1.18  |lset L[1000] shared at {1 0}
51.    3.90020|   3.38740|1.15  |lset L[1000] shared at {end-1 0}
52.    3.92310|   3.33990|1.17  |lset L[1000] shared at {end 0}
53.   35.12130|  28.95020|1.21  |lset L[10000] shared at {0 0}
54.   35.13800|  29.34310|1.20  |lset L[10000] shared at {1 0}
55.   35.29860|  28.99230|1.22  |lset L[10000] shared at {end-1 0}
56.   35.25650|  29.49380|1.20  |lset L[10000] shared at {end 0}
57.    0.58430|   0.57820|1.01  |lset L[10] unshared at {0 0}
58.    0.57740|   0.56700|1.02  |lset L[10] unshared at {1 0}
59.    0.61630|   0.61840|1.00  |lset L[10] unshared at {end-1 0}
60.    0.60040|   0.61650|0.97  |lset L[10] unshared at {end 0}
61.    0.58370|   0.57960|1.01  |lset L[100] unshared at {0 0}
62.    0.57160|   0.58160|0.98  |lset L[100] unshared at {1 0}
63.    0.61570|   0.61860|1.00  |lset L[100] unshared at {end-1 0}
64.    0.60550|   0.60200|1.01  |lset L[100] unshared at {end 0}
65.    0.58340|   0.58690|0.99  |lset L[1000] unshared at {0 0}
66.    0.56380|   0.58650|0.96  |lset L[1000] unshared at {1 0}
67.    0.62190|   0.61750|1.01  |lset L[1000] unshared at {end-1 0}
68.    0.60010|   0.61210|0.98  |lset L[1000] unshared at {end 0}
69.    0.55840|   0.57300|0.97  |lset L[10000] unshared at {0 0}
70.    0.57610|   0.56020|1.03  |lset L[10000] unshared at {1 0}
71.    0.61370|   0.60830|1.01  |lset L[10000] unshared at {end-1 0}
72.    0.62110|   0.61860|1.00  |lset L[10000] unshared at {end 0}
73.  455.91970| 385.96240|1.18  |lset total run time

```

### <a id='lremove'></a>lremove

**Removal of elements from a shared list**

Removal of leading or trailing elements is essentially a range operation and
thus sees order of magnitude improvements in performance when operating
on shared lists (13, 17, 19, 23, 37, 41, 43, 47).

Removal at other indices from shared lists requires new list creation and
this does not show any benefits.


```
           [1]           [2]
1.     0.61560|   0.69080|0.89  |lremove L[10] shared 1 elements at 0
2.     0.46840|   0.50220|0.93  |lremove L[10] shared 1 elements at 1
3.     0.60580|   0.44440|1.36  |lremove L[10] shared 1 elements at 5
4.     0.50520|   0.48700|1.04  |lremove L[10] shared 1 elements at end-1
5.     0.47830|   0.57630|0.83  |lremove L[10] shared 1 elements at end
6.     0.64130|   0.79860|0.80  |lremove L[10] shared 5 elements at 0 1 5 end-1 end
7.     0.84040|   0.68670|1.22  |lremove L[100] shared 1 elements at 0
8.     0.76790|   0.80940|0.95  |lremove L[100] shared 1 elements at 1
9.     0.82900|   0.67930|1.22  |lremove L[100] shared 1 elements at 50
10.    0.77090|   0.75290|1.02  |lremove L[100] shared 1 elements at end-1
11.    0.95350|   0.72420|1.32  |lremove L[100] shared 1 elements at end
12.    1.15080|   1.04890|1.10  |lremove L[100] shared 5 elements at 0 1 50 end-1 end
13.    3.51060|   0.43450|8.08  |lremove L[1000] shared 1 elements at 0
14.    3.52400|   3.22860|1.09  |lremove L[1000] shared 1 elements at 1
15.    3.52350|   3.14890|1.12  |lremove L[1000] shared 1 elements at 500
16.    3.52310|   3.25950|1.08  |lremove L[1000] shared 1 elements at end-1
17.    3.74320|   0.47500|7.88  |lremove L[1000] shared 1 elements at end
18.    3.83280|   3.48050|1.10  |lremove L[1000] shared 5 elements at 0 1 500 end-1 end
19.   30.39120|   0.42240|71.95 |lremove L[10000] shared 1 elements at 0
20.   30.27250|  28.59490|1.06  |lremove L[10000] shared 1 elements at 1
21.   30.34820|  28.50400|1.06  |lremove L[10000] shared 1 elements at 5000
22.   30.42090|  28.71930|1.06  |lremove L[10000] shared 1 elements at end-1
23.   30.53150|   0.45170|67.59 |lremove L[10000] shared 1 elements at end
24.   32.39280|  28.88290|1.12  |lremove L[10000] shared 5 elements at 0 1 5000 end-1 end
25.    0.71680|   0.47780|1.50  |lremove L[10] shared-span 1 elements at 0
26.    0.45080|   0.48900|0.92  |lremove L[10] shared-span 1 elements at 1
27.    0.66590|   0.48710|1.37  |lremove L[10] shared-span 1 elements at 5
28.    0.87990|   0.52540|1.67  |lremove L[10] shared-span 1 elements at end-1
29.    0.56630|   0.54030|1.05  |lremove L[10] shared-span 1 elements at end
30.    0.97410|   0.70920|1.37  |lremove L[10] shared-span 5 elements at 0 1 5 end-1 end
31.    0.73820|   0.72490|1.02  |lremove L[100] shared-span 1 elements at 0
32.    0.73480|   0.75080|0.98  |lremove L[100] shared-span 1 elements at 1
33.    0.79750|   0.72650|1.10  |lremove L[100] shared-span 1 elements at 50
34.    0.77370|   0.88570|0.87  |lremove L[100] shared-span 1 elements at end-1
35.    0.77440|   0.75230|1.03  |lremove L[100] shared-span 1 elements at end
36.    0.99760|   0.98270|1.02  |lremove L[100] shared-span 5 elements at 0 1 50 end-1 end
37.    3.51090|   0.52070|6.74  |lremove L[1000] shared-span 1 elements at 0
38.    3.54570|   3.29990|1.07  |lremove L[1000] shared-span 1 elements at 1
39.    3.99660|   3.31420|1.21  |lremove L[1000] shared-span 1 elements at 500
40.    3.67910|   3.25230|1.13  |lremove L[1000] shared-span 1 elements at end-1
41.    3.75820|   0.52310|7.18  |lremove L[1000] shared-span 1 elements at end
42.    4.44580|   3.57670|1.24  |lremove L[1000] shared-span 5 elements at 0 1 500 end-1 end
43.   32.86260|   0.44870|73.24 |lremove L[10000] shared-span 1 elements at 0
44.   33.38560|  28.51260|1.17  |lremove L[10000] shared-span 1 elements at 1
45.   30.40200|  28.58650|1.06  |lremove L[10000] shared-span 1 elements at 5000
46.   30.58530|  28.65760|1.07  |lremove L[10000] shared-span 1 elements at end-1
47.   30.42020|   0.48410|62.84 |lremove L[10000] shared-span 1 elements at end
48.   32.47680|  28.85620|1.13  |lremove L[10000] shared-span 5 elements at 0 1 5000 end-1 end
```

**Removal of elements from a unshared list**

Removal of elements from an unshared list object is done in both implementations
by moving elements within the existing list storage array. The difference is that
with TIP 625, the shorter segment can be moved in the common case where a single
element is being removed. This is reflected in the 7x-8x speed removing elements
towards the front of the list (64, 65).

```
49.    0.37500|   0.62500|0.60  |lremove L[10] unshared 1 elements at 0
50.    0.33330|   0.37500|0.89  |lremove L[10] unshared 1 elements at 1
51.    0.33330|   0.75000|0.44  |lremove L[10] unshared 1 elements at 5
52.    0.87500|   0.87500|1.00  |lremove L[10] unshared 1 elements at end-1
53.    0.87500|   0.37500|2.33  |lremove L[10] unshared 1 elements at end
54.    0.73810|   0.24150|3.06  |lremove L[100] unshared 1 elements at 0
55.    0.29590|   0.74490|0.40  |lremove L[100] unshared 1 elements at 1
56.    0.24490|   0.25850|0.95  |lremove L[100] unshared 1 elements at 50
57.    0.31630|   0.78910|0.40  |lremove L[100] unshared 1 elements at end-1
58.    0.28570|   0.58500|0.49  |lremove L[100] unshared 1 elements at end
59.    0.38400|   0.23470|1.64  |lremove L[1000] unshared 1 elements at 0
60.    0.82930|   0.71470|1.16  |lremove L[1000] unshared 1 elements at 1
61.    0.34930|   0.30400|1.15  |lremove L[1000] unshared 1 elements at 500
62.    0.77600|   0.29600|2.62  |lremove L[1000] unshared 1 elements at end-1
63.    0.78670|   0.28530|2.76  |lremove L[1000] unshared 1 elements at end
64.    1.67200|   0.20080|8.33  |lremove L[10000] unshared 1 elements at 0
65.    1.65570|   0.21680|7.64  |lremove L[10000] unshared 1 elements at 1
66.    0.92130|   0.87950|1.05  |lremove L[10000] unshared 1 elements at 5000
67.    0.32290|   0.27950|1.16  |lremove L[10000] unshared 1 elements at end-1
68.    0.30750|   0.27250|1.13  |lremove L[10000] unshared 1 elements at end
69.    0.29170|   0.70830|0.41  |lremove L[10] unshared-span 1 elements at 0
70.    0.75000|   0.25000|3.00  |lremove L[10] unshared-span 1 elements at 1
71.    0.25000|   0.25000|1.00  |lremove L[10] unshared-span 1 elements at 5
72.    0.87500|   0.87500|1.00  |lremove L[10] unshared-span 1 elements at end-1
73.    0.25000|   0.25000|1.00  |lremove L[10] unshared-span 1 elements at end
74.    0.26870|   0.27890|0.96  |lremove L[100] unshared-span 1 elements at 0
75.    0.72790|   0.69050|1.05  |lremove L[100] unshared-span 1 elements at 1
76.    0.24830|   0.68370|0.36  |lremove L[100] unshared-span 1 elements at 50
77.    0.76870|   0.32650|2.35  |lremove L[100] unshared-span 1 elements at end-1
78.    0.74150|   0.30270|2.45  |lremove L[100] unshared-span 1 elements at end
79.    0.77070|   0.70670|1.09  |lremove L[1000] unshared-span 1 elements at 0
80.    0.30130|   0.26400|1.14  |lremove L[1000] unshared-span 1 elements at 1
81.    0.73600|   0.75200|0.98  |lremove L[1000] unshared-span 1 elements at 500
82.    0.76800|   0.29070|2.64  |lremove L[1000] unshared-span 1 elements at end-1
83.    0.28270|   0.34130|0.83  |lremove L[1000] unshared-span 1 elements at end
84.    1.29200|   0.25410|5.08  |lremove L[10000] unshared-span 1 elements at 0
85.    1.63650|   0.26850|6.09  |lremove L[10000] unshared-span 1 elements at 1
86.    0.76990|   0.90030|0.86  |lremove L[10000] unshared-span 1 elements at 5000
87.    0.28720|   0.23410|1.23  |lremove L[10000] unshared-span 1 elements at end-1
88.    0.26990|   0.29040|0.93  |lremove L[10000] unshared-span 1 elements at end
```

**Total run time**

```
89.  461.74330| 294.10770|1.57  |lremove total run time
```

### <a id='lreplace'></a>lreplace

**Pure inserts in a shared list**

Pure inserts that are repeated prepends to a list are much faster (43, 44, 63, 64).
`lreplace` unsurprisingly show the same characteristics as the
[linsert](#linsert) command. See there for more details.

```
           [1]           [2]
1.     0.47940|   0.47790|1.00  |lreplace L[10] shared 0 (0:-1) elems at 0 with 1 elems 1 times.
2.     0.50010|   0.51730|0.97  |lreplace L[10] shared 0 (0:-1) elems at 0 with 10 elems 1 times.
3.     0.62500|   0.62500|1.00  |lreplace L[10] shared 0 (0:-1) elems at 0 with 1 elems 8 times.
4.     0.75000|   0.62500|1.20  |lreplace L[10] shared 0 (0:-1) elems at 0 with 10 elems 8 times.
5.     0.48000|   0.48200|1.00  |lreplace L[10] shared 0 (1:-1) elems at 1 with 1 elems 1 times.
6.     0.49280|   0.53140|0.93  |lreplace L[10] shared 0 (1:-1) elems at 1 with 10 elems 1 times.
7.     0.62500|   0.62500|1.00  |lreplace L[10] shared 0 (1:-1) elems at 1 with 1 elems 8 times.
8.     0.75000|   0.75000|1.00  |lreplace L[10] shared 0 (1:-1) elems at 1 with 10 elems 8 times.
9.     0.48990|   0.68220|0.72  |lreplace L[10] shared 0 (5:-1) elems at 5 with 1 elems 1 times.
10.    0.65100|   0.52350|1.24  |lreplace L[10] shared 0 (5:-1) elems at 5 with 10 elems 1 times.
11.    0.62500|   0.62500|1.00  |lreplace L[10] shared 0 (5:-1) elems at 5 with 1 elems 8 times.
12.    0.75000|   0.75000|1.00  |lreplace L[10] shared 0 (5:-1) elems at 5 with 10 elems 8 times.
13.    0.48510|   0.52490|0.92  |lreplace L[10] shared 0 (end-1:-1) elems at end-1 with 1 elems 1 times.
14.    0.51940|   0.53900|0.96  |lreplace L[10] shared 0 (end-1:-1) elems at end-1 with 10 elems 1 times.
15.    0.66670|   0.70830|0.94  |lreplace L[10] shared 0 (end-1:-1) elems at end-1 with 1 elems 8 times.
16.    0.75000|   0.75000|1.00  |lreplace L[10] shared 0 (end-1:-1) elems at end-1 with 10 elems 8 times.
17.    0.49670|   0.65090|0.76  |lreplace L[10] shared 0 (end:-1) elems at end with 1 elems 1 times.
18.    0.52690|   0.75680|0.70  |lreplace L[10] shared 0 (end:-1) elems at end with 10 elems 1 times.
19.    0.66670|   0.70830|0.94  |lreplace L[10] shared 0 (end:-1) elems at end with 1 elems 8 times.
20.    0.75000|   0.75000|1.00  |lreplace L[10] shared 0 (end:-1) elems at end with 10 elems 8 times.
21.    0.86160|   0.72000|1.20  |lreplace L[100] shared 0 (0:-1) elems at 0 with 1 elems 1 times.
22.    0.98610|   0.82330|1.20  |lreplace L[100] shared 0 (0:-1) elems at 0 with 10 elems 1 times.
23.    1.03060|   0.61560|1.67  |lreplace L[100] shared 0 (0:-1) elems at 0 with 1 elems 98 times.
24.    2.35710|   0.71430|3.30  |lreplace L[100] shared 0 (0:-1) elems at 0 with 10 elems 98 times.
25.    0.82810|   0.73730|1.12  |lreplace L[100] shared 0 (1:-1) elems at 1 with 1 elems 1 times.
26.    0.74340|   0.75490|0.98  |lreplace L[100] shared 0 (1:-1) elems at 1 with 10 elems 1 times.
27.    1.01020|   1.01360|1.00  |lreplace L[100] shared 0 (1:-1) elems at 1 with 1 elems 98 times.
28.    2.30950|   2.24490|1.03  |lreplace L[100] shared 0 (1:-1) elems at 1 with 10 elems 98 times.
29.    0.91550|   0.72490|1.26  |lreplace L[100] shared 0 (50:-1) elems at 50 with 1 elems 1 times.
30.    0.78790|   0.75560|1.04  |lreplace L[100] shared 0 (50:-1) elems at 50 with 10 elems 1 times.
31.    0.98300|   0.99660|0.99  |lreplace L[100] shared 0 (50:-1) elems at 50 with 1 elems 98 times.
32.    2.28230|   2.21430|1.03  |lreplace L[100] shared 0 (50:-1) elems at 50 with 10 elems 98 times.
33.    0.95890|   0.75470|1.27  |lreplace L[100] shared 0 (end-1:-1) elems at end-1 with 1 elems 1 times.
34.    0.79480|   0.87110|0.91  |lreplace L[100] shared 0 (end-1:-1) elems at end-1 with 10 elems 1 times.
35.    1.03400|   1.03060|1.00  |lreplace L[100] shared 0 (end-1:-1) elems at end-1 with 1 elems 98 times.
36.    2.32990|   2.26530|1.03  |lreplace L[100] shared 0 (end-1:-1) elems at end-1 with 10 elems 98 times.
37.    0.81070|   0.77270|1.05  |lreplace L[100] shared 0 (end:-1) elems at end with 1 elems 1 times.
38.    0.88110|   0.82370|1.07  |lreplace L[100] shared 0 (end:-1) elems at end with 10 elems 1 times.
39.    1.04080|   1.03060|1.01  |lreplace L[100] shared 0 (end:-1) elems at end with 1 elems 98 times.
40.    2.32990|   2.25850|1.03  |lreplace L[100] shared 0 (end:-1) elems at end with 10 elems 98 times.
41.    3.47370|   3.27660|1.06  |lreplace L[1000] shared 0 (0:-1) elems at 0 with 1 elems 1 times.
42.    3.42180|   3.28980|1.04  |lreplace L[1000] shared 0 (0:-1) elems at 0 with 10 elems 1 times.
43.    3.61600|   0.65870|5.49  |lreplace L[1000] shared 0 (0:-1) elems at 0 with 1 elems 125 times.
44.    5.33330|   0.74130|7.19  |lreplace L[1000] shared 0 (0:-1) elems at 0 with 10 elems 125 times.
45.    3.44310|   3.21840|1.07  |lreplace L[1000] shared 0 (1:-1) elems at 1 with 1 elems 1 times.
46.    3.48970|   3.29960|1.06  |lreplace L[1000] shared 0 (1:-1) elems at 1 with 10 elems 1 times.
47.    3.61870|   3.86930|0.94  |lreplace L[1000] shared 0 (1:-1) elems at 1 with 1 elems 125 times.
48.    5.32000|   5.61600|0.95  |lreplace L[1000] shared 0 (1:-1) elems at 1 with 10 elems 125 times.
49.    3.47820|   3.21690|1.08  |lreplace L[1000] shared 0 (500:-1) elems at 500 with 1 elems 1 times.
50.    3.51640|   3.34630|1.05  |lreplace L[1000] shared 0 (500:-1) elems at 500 with 10 elems 1 times.
51.    3.59470|   3.66130|0.98  |lreplace L[1000] shared 0 (500:-1) elems at 500 with 1 elems 125 times.
52.    5.30930|   5.32270|1.00  |lreplace L[1000] shared 0 (500:-1) elems at 500 with 10 elems 125 times.
53.    3.37250|   3.31760|1.02  |lreplace L[1000] shared 0 (end-1:-1) elems at end-1 with 1 elems 1 times.
54.    3.47360|   3.22670|1.08  |lreplace L[1000] shared 0 (end-1:-1) elems at end-1 with 10 elems 1 times.
55.    3.67730|   3.74930|0.98  |lreplace L[1000] shared 0 (end-1:-1) elems at end-1 with 1 elems 125 times.
56.    5.36000|   5.43730|0.99  |lreplace L[1000] shared 0 (end-1:-1) elems at end-1 with 10 elems 125 times.
57.    3.47170|   3.26540|1.06  |lreplace L[1000] shared 0 (end:-1) elems at end with 1 elems 1 times.
58.    3.54830|   3.42090|1.04  |lreplace L[1000] shared 0 (end:-1) elems at end with 10 elems 1 times.
59.    3.66130|   3.71200|0.99  |lreplace L[1000] shared 0 (end:-1) elems at end with 1 elems 125 times.
60.    5.35470|   5.40270|0.99  |lreplace L[1000] shared 0 (end:-1) elems at end with 10 elems 125 times.
61.   30.27910|  30.01480|1.01  |lreplace L[10000] shared 0 (0:-1) elems at 0 with 1 elems 1 times.
62.   30.36400|  31.46430|0.97  |lreplace L[10000] shared 0 (0:-1) elems at 0 with 10 elems 1 times.
63.   32.08320|   0.68590|46.78 |lreplace L[10000] shared 0 (0:-1) elems at 0 with 1 elems 1250 times.
64.   48.88990|   0.84270|58.02 |lreplace L[10000] shared 0 (0:-1) elems at 0 with 10 elems 1250 times.
65.   30.27520|  30.60110|0.99  |lreplace L[10000] shared 0 (1:-1) elems at 1 with 1 elems 1 times.
66.   30.42620|  29.92770|1.02  |lreplace L[10000] shared 0 (1:-1) elems at 1 with 10 elems 1 times.
67.   32.10670|  32.28190|0.99  |lreplace L[10000] shared 0 (1:-1) elems at 1 with 1 elems 1250 times.
68.   48.80400|  51.68190|0.94  |lreplace L[10000] shared 0 (1:-1) elems at 1 with 10 elems 1250 times.
69.   30.26310|  29.98060|1.01  |lreplace L[10000] shared 0 (5000:-1) elems at 5000 with 1 elems 1 times.
70.   30.35280|  29.73200|1.02  |lreplace L[10000] shared 0 (5000:-1) elems at 5000 with 10 elems 1 times.
71.   32.14530|  32.12450|1.00  |lreplace L[10000] shared 0 (5000:-1) elems at 5000 with 1 elems 1250 times.
72.   49.19330|  50.84690|0.97  |lreplace L[10000] shared 0 (5000:-1) elems at 5000 with 10 elems 1250 times.
73.   30.36830|  29.65420|1.02  |lreplace L[10000] shared 0 (end-1:-1) elems at end-1 with 1 elems 1 times.
74.   30.38940|  30.02930|1.01  |lreplace L[10000] shared 0 (end-1:-1) elems at end-1 with 10 elems 1 times.
75.   32.29440|  32.24910|1.00  |lreplace L[10000] shared 0 (end-1:-1) elems at end-1 with 1 elems 1250 times.
76.   49.03310|  51.02960|0.96  |lreplace L[10000] shared 0 (end-1:-1) elems at end-1 with 10 elems 1250 times.
77.   30.43670|  29.91730|1.02  |lreplace L[10000] shared 0 (end:-1) elems at end with 1 elems 1 times.
78.   30.47630|  29.89420|1.02  |lreplace L[10000] shared 0 (end:-1) elems at end with 10 elems 1 times.
79.   32.31550|  32.84430|0.98  |lreplace L[10000] shared 0 (end:-1) elems at end with 1 elems 1250 times.
80.   48.94850|  50.78560|0.96  |lreplace L[10000] shared 0 (end:-1) elems at end with 10 elems 1250 times.
```

**Pure deletes from a shared list**

Pure deletions from the front or the back translate to a range operation and
show order of magnitude increases (91, 95, 96, 100) as TIP 625 makes use of spans
in these cases.

Deletions from the middle show no difference as a new list object has to be
created when the operand list is shared.

```
81.    0.56120|   0.65720|0.85  |lreplace L[10] shared 0:0 with 0 elems 1 times.
82.    0.61420|   0.61920|0.99  |lreplace L[10] shared 1:1 with 0 elems 1 times.
83.    0.57910|   0.63710|0.91  |lreplace L[10] shared 5:5 with 0 elems 1 times.
84.    0.64440|   0.70020|0.92  |lreplace L[10] shared end-1:end-1 with 0 elems 1 times.
85.    0.64570|   0.66650|0.97  |lreplace L[10] shared end:end with 0 elems 1 times.
86.    0.85890|   0.88870|0.97  |lreplace L[100] shared 0:0 with 0 elems 1 times.
87.    0.87410|   0.87850|0.99  |lreplace L[100] shared 1:1 with 0 elems 1 times.
88.    0.84450|   0.88400|0.96  |lreplace L[100] shared 50:50 with 0 elems 1 times.
89.    0.92150|   0.95340|0.97  |lreplace L[100] shared end-1:end-1 with 0 elems 1 times.
90.    1.05190|   0.93860|1.12  |lreplace L[100] shared end:end with 0 elems 1 times.
91.    3.62780|   0.58330|6.22  |lreplace L[1000] shared 0:0 with 0 elems 1 times.
92.    3.78750|   3.27940|1.15  |lreplace L[1000] shared 1:1 with 0 elems 1 times.
93.    3.64500|   3.36440|1.08  |lreplace L[1000] shared 500:500 with 0 elems 1 times.
94.    3.57190|   3.34580|1.07  |lreplace L[1000] shared end-1:end-1 with 0 elems 1 times.
95.    3.80310|   0.65340|5.82  |lreplace L[1000] shared end:end with 0 elems 1 times.
96.   32.88180|   0.57780|56.91 |lreplace L[10000] shared 0:0 with 0 elems 1 times.
97.   34.93830|  29.90320|1.17  |lreplace L[10000] shared 1:1 with 0 elems 1 times.
98.   35.16850|  29.76260|1.18  |lreplace L[10000] shared 5000:5000 with 0 elems 1 times.
99.   35.48920|  30.26280|1.17  |lreplace L[10000] shared end-1:end-1 with 0 elems 1 times.
100.  35.31320|   0.64430|54.81 |lreplace L[10000] shared end:end with 0 elems 1 times.
```

**Replacing elements in a shared list**

The table below covers cases where the number of elements deleted is less, equal
and greater than the number inserted. Replacement (where elements are deleted
and inserted) of elements in shared lists always require a new list object to be
created. Thus there is no difference in performance in any of the cases.


```
101.   0.65750|   0.61980|1.06  |lreplace L[10] shared 0:1 with 3 elems 1 times.
102.   0.70640|   0.62930|1.12  |lreplace L[10] shared 0:1 with 2 elems 1 times.
103.   0.61070|   0.69230|0.88  |lreplace L[10] shared 0:1 with 1 elems 1 times.
104.   0.61710|   0.80190|0.77  |lreplace L[10] shared 1:2 with 3 elems 1 times.
105.   0.82560|   0.60530|1.36  |lreplace L[10] shared 1:2 with 2 elems 1 times.
106.   0.64700|   0.63040|1.03  |lreplace L[10] shared 1:2 with 1 elems 1 times.
107.   0.73040|   0.69910|1.04  |lreplace L[10] shared 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
108.   0.66290|   0.76100|0.87  |lreplace L[10] shared 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
109.   0.98590|   0.72480|1.36  |lreplace L[10] shared 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
110.   0.78410|   0.86180|0.91  |lreplace L[10] shared 0 (end-1:end) elems at end-1 with 3 elems 1 times.
111.   0.64710|   0.87300|0.74  |lreplace L[10] shared 0 (end-1:end) elems at end-1 with 2 elems 1 times.
112.   0.81320|   0.67810|1.20  |lreplace L[10] shared 0 (end-1:end) elems at end-1 with 1 elems 1 times.
113.   0.90510|   0.89730|1.01  |lreplace L[100] shared 0:1 with 3 elems 1 times.
114.   0.88180|   0.87050|1.01  |lreplace L[100] shared 0:1 with 2 elems 1 times.
115.   0.90480|   1.09520|0.83  |lreplace L[100] shared 0:1 with 1 elems 1 times.
116.   0.88150|   0.95750|0.92  |lreplace L[100] shared 1:2 with 3 elems 1 times.
117.   0.89530|   0.88120|1.02  |lreplace L[100] shared 1:2 with 2 elems 1 times.
118.   0.90940|   0.87730|1.04  |lreplace L[100] shared 1:2 with 1 elems 1 times.
119.   0.95880|   0.92530|1.04  |lreplace L[100] shared 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
120.   0.97030|   0.94920|1.02  |lreplace L[100] shared 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
121.   0.96520|   0.99490|0.97  |lreplace L[100] shared 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
122.   0.96970|   0.94620|1.02  |lreplace L[100] shared 0 (end-1:end) elems at end-1 with 3 elems 1 times.
123.   0.95190|   0.97260|0.98  |lreplace L[100] shared 0 (end-1:end) elems at end-1 with 2 elems 1 times.
124.   0.96100|   0.94280|1.02  |lreplace L[100] shared 0 (end-1:end) elems at end-1 with 1 elems 1 times.
125.   3.88890|   3.31820|1.17  |lreplace L[1000] shared 0:1 with 3 elems 1 times.
126.   3.88640|   3.36360|1.16  |lreplace L[1000] shared 0:1 with 2 elems 1 times.
127.   3.93460|   3.32050|1.18  |lreplace L[1000] shared 0:1 with 1 elems 1 times.
128.   3.83000|   3.33620|1.15  |lreplace L[1000] shared 1:2 with 3 elems 1 times.
129.   3.90790|   3.28990|1.19  |lreplace L[1000] shared 1:2 with 2 elems 1 times.
130.   3.96350|   3.37550|1.17  |lreplace L[1000] shared 1:2 with 1 elems 1 times.
131.   4.01580|   3.44970|1.16  |lreplace L[1000] shared 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
132.   4.00600|   3.46050|1.16  |lreplace L[1000] shared 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
133.   4.04070|   3.39300|1.19  |lreplace L[1000] shared 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
134.   3.96110|   3.45400|1.15  |lreplace L[1000] shared 0 (end-1:end) elems at end-1 with 3 elems 1 times.
135.   3.99370|   3.41680|1.17  |lreplace L[1000] shared 0 (end-1:end) elems at end-1 with 2 elems 1 times.
136.   4.03230|   3.47010|1.16  |lreplace L[1000] shared 0 (end-1:end) elems at end-1 with 1 elems 1 times.
137.  34.93770|  29.83270|1.17  |lreplace L[10000] shared 0:1 with 3 elems 1 times.
138.  34.98580|  30.19310|1.16  |lreplace L[10000] shared 0:1 with 2 elems 1 times.
139.  35.05860|  30.02560|1.17  |lreplace L[10000] shared 0:1 with 1 elems 1 times.
140.  35.10190|  29.87490|1.17  |lreplace L[10000] shared 1:2 with 3 elems 1 times.
141.  35.09290|  30.15570|1.16  |lreplace L[10000] shared 1:2 with 2 elems 1 times.
142.  35.15620|  30.31950|1.16  |lreplace L[10000] shared 1:2 with 1 elems 1 times.
143.  35.45930|  30.32200|1.17  |lreplace L[10000] shared 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
144.  35.39280|  29.78930|1.19  |lreplace L[10000] shared 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
145.  35.34340|  29.96270|1.18  |lreplace L[10000] shared 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
146.  35.38980|  30.14600|1.17  |lreplace L[10000] shared 0 (end-1:end) elems at end-1 with 3 elems 1 times.
147.  35.38750|  29.86510|1.18  |lreplace L[10000] shared 0 (end-1:end) elems at end-1 with 2 elems 1 times.
148.  35.28000|  30.06530|1.17  |lreplace L[10000] shared 0 (end-1:end) elems at end-1 with 1 elems 1 times.
149.   0.60670|   0.62750|0.97  |lreplace L[10] shared-span 0:1 with 3 elems 1 times.
150.   0.61480|   0.62680|0.98  |lreplace L[10] shared-span 0:1 with 2 elems 1 times.
151.   0.62980|   0.65230|0.97  |lreplace L[10] shared-span 0:1 with 1 elems 1 times.
152.   0.64620|   0.61170|1.06  |lreplace L[10] shared-span 1:2 with 3 elems 1 times.
153.   0.60560|   0.63060|0.96  |lreplace L[10] shared-span 1:2 with 2 elems 1 times.
154.   0.61010|   0.63700|0.96  |lreplace L[10] shared-span 1:2 with 1 elems 1 times.
155.   0.76760|   0.77940|0.98  |lreplace L[10] shared-span 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
156.   0.66550|   0.97870|0.68  |lreplace L[10] shared-span 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
157.   0.68190|   0.81500|0.84  |lreplace L[10] shared-span 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
158.   0.70920|   0.77750|0.91  |lreplace L[10] shared-span 0 (end-1:end) elems at end-1 with 3 elems 1 times.
159.   0.69400|   0.79640|0.87  |lreplace L[10] shared-span 0 (end-1:end) elems at end-1 with 2 elems 1 times.
160.   0.79150|   0.68680|1.15  |lreplace L[10] shared-span 0 (end-1:end) elems at end-1 with 1 elems 1 times.
161.   0.89000|   0.85330|1.04  |lreplace L[100] shared-span 0:1 with 3 elems 1 times.
162.   0.91340|   0.87790|1.04  |lreplace L[100] shared-span 0:1 with 2 elems 1 times.
163.   0.91230|   0.89800|1.02  |lreplace L[100] shared-span 0:1 with 1 elems 1 times.
164.   0.91210|   0.87770|1.04  |lreplace L[100] shared-span 1:2 with 3 elems 1 times.
165.   0.90490|   0.87460|1.03  |lreplace L[100] shared-span 1:2 with 2 elems 1 times.
166.   0.89170|   0.89650|0.99  |lreplace L[100] shared-span 1:2 with 1 elems 1 times.
167.   0.96910|   0.92580|1.05  |lreplace L[100] shared-span 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
168.   0.96320|   0.95080|1.01  |lreplace L[100] shared-span 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
169.   0.98120|   0.99000|0.99  |lreplace L[100] shared-span 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
170.   0.98520|   0.95170|1.04  |lreplace L[100] shared-span 0 (end-1:end) elems at end-1 with 3 elems 1 times.
171.   0.96350|   0.93680|1.03  |lreplace L[100] shared-span 0 (end-1:end) elems at end-1 with 2 elems 1 times.
172.   0.95590|   0.97240|0.98  |lreplace L[100] shared-span 0 (end-1:end) elems at end-1 with 1 elems 1 times.
173.   3.93890|   3.33180|1.18  |lreplace L[1000] shared-span 0:1 with 3 elems 1 times.
174.   3.90450|   3.34690|1.17  |lreplace L[1000] shared-span 0:1 with 2 elems 1 times.
175.   3.90990|   3.35300|1.17  |lreplace L[1000] shared-span 0:1 with 1 elems 1 times.
176.   3.87520|   3.32150|1.17  |lreplace L[1000] shared-span 1:2 with 3 elems 1 times.
177.   3.86850|   3.30460|1.17  |lreplace L[1000] shared-span 1:2 with 2 elems 1 times.
178.   3.93850|   3.44900|1.14  |lreplace L[1000] shared-span 1:2 with 1 elems 1 times.
179.   3.98380|   3.41950|1.17  |lreplace L[1000] shared-span 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
180.   3.95630|   3.43710|1.15  |lreplace L[1000] shared-span 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
181.   3.91830|   3.39130|1.16  |lreplace L[1000] shared-span 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
182.   3.99120|   3.46460|1.15  |lreplace L[1000] shared-span 0 (end-1:end) elems at end-1 with 3 elems 1 times.
183.   3.99690|   3.37240|1.19  |lreplace L[1000] shared-span 0 (end-1:end) elems at end-1 with 2 elems 1 times.
184.   3.96020|   3.48160|1.14  |lreplace L[1000] shared-span 0 (end-1:end) elems at end-1 with 1 elems 1 times.
185.  35.03300|  29.85710|1.17  |lreplace L[10000] shared-span 0:1 with 3 elems 1 times.
186.  35.08120|  30.09080|1.17  |lreplace L[10000] shared-span 0:1 with 2 elems 1 times.
187.  35.07970|  29.82660|1.18  |lreplace L[10000] shared-span 0:1 with 1 elems 1 times.
188.  35.08990|  29.80730|1.18  |lreplace L[10000] shared-span 1:2 with 3 elems 1 times.
189.  34.97130|  29.80890|1.17  |lreplace L[10000] shared-span 1:2 with 2 elems 1 times.
190.  35.24050|  29.76600|1.18  |lreplace L[10000] shared-span 1:2 with 1 elems 1 times.
191.  35.47870|  30.21850|1.17  |lreplace L[10000] shared-span 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
192.  35.41750|  30.18880|1.17  |lreplace L[10000] shared-span 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
193.  35.59270|  30.04520|1.18  |lreplace L[10000] shared-span 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
194.  35.46990|  29.97180|1.18  |lreplace L[10000] shared-span 0 (end-1:end) elems at end-1 with 3 elems 1 times.
195.  35.47750|  30.15570|1.18  |lreplace L[10000] shared-span 0 (end-1:end) elems at end-1 with 2 elems 1 times.
196.  35.50200|  30.01660|1.18  |lreplace L[10000] shared-span 0 (end-1:end) elems at end-1 with 1 elems 1 times.
```

**Pure inserts into an unshared list**

There is significant improvement when the number of elements before the insertion
point is much smaller than the number after (227-229).

```
197.   0.87500|   0.79170|1.11  |lreplace L[10] unshared 0 (0:-1) elems at 0 with 1 elems 1 times.
198.   0.91670|   0.41670|2.20  |lreplace L[10] unshared 0 (0:-1) elems at 0 with 10 elems 1 times.
199.   0.83330|   0.37500|2.22  |lreplace L[10] unshared 0 (1:-1) elems at 1 with 1 elems 1 times.
200.   0.87500|   0.87500|1.00  |lreplace L[10] unshared 0 (1:-1) elems at 1 with 10 elems 1 times.
201.   0.83330|   0.87500|0.95  |lreplace L[10] unshared 0 (5:-1) elems at 5 with 1 elems 1 times.
202.   0.37500|   0.75000|0.50  |lreplace L[10] unshared 0 (5:-1) elems at 5 with 10 elems 1 times.
203.   0.37500|   0.87500|0.43  |lreplace L[10] unshared 0 (end-1:-1) elems at end-1 with 1 elems 1 times.
204.   0.41670|   0.41670|1.00  |lreplace L[10] unshared 0 (end-1:-1) elems at end-1 with 10 elems 1 times.
205.   0.75000|   0.87500|0.86  |lreplace L[10] unshared 0 (end:-1) elems at end with 1 elems 1 times.
206.   0.37500|   0.95830|0.39  |lreplace L[10] unshared 0 (end:-1) elems at end with 10 elems 1 times.
207.   0.70410|   0.70410|1.00  |lreplace L[100] unshared 0 (0:-1) elems at 0 with 1 elems 1 times.
208.   0.42860|   0.30610|1.40  |lreplace L[100] unshared 0 (0:-1) elems at 0 with 10 elems 1 times.
209.   0.34010|   0.28910|1.18  |lreplace L[100] unshared 0 (1:-1) elems at 1 with 1 elems 1 times.
210.   0.83330|   0.80270|1.04  |lreplace L[100] unshared 0 (1:-1) elems at 1 with 10 elems 1 times.
211.   0.30950|   1.49660|0.21  |lreplace L[100] unshared 0 (50:-1) elems at 50 with 1 elems 1 times.
212.   0.82650|   0.80950|1.02  |lreplace L[100] unshared 0 (50:-1) elems at 50 with 10 elems 1 times.
213.   0.28570|   0.29250|0.98  |lreplace L[100] unshared 0 (end-1:-1) elems at end-1 with 1 elems 1 times.
214.   0.31290|   0.35030|0.89  |lreplace L[100] unshared 0 (end-1:-1) elems at end-1 with 10 elems 1 times.
215.   0.76190|   0.74490|1.02  |lreplace L[100] unshared 0 (end:-1) elems at end with 1 elems 1 times.
216.   0.38100|   0.77550|0.49  |lreplace L[100] unshared 0 (end:-1) elems at end with 10 elems 1 times.
217.   0.86670|   0.24000|3.61  |lreplace L[1000] unshared 0 (0:-1) elems at 0 with 1 elems 1 times.
218.   0.54400|   0.32530|1.67  |lreplace L[1000] unshared 0 (0:-1) elems at 0 with 10 elems 1 times.
219.   0.45870|   0.25600|1.79  |lreplace L[1000] unshared 0 (1:-1) elems at 1 with 1 elems 1 times.
220.   0.57330|   0.73600|0.78  |lreplace L[1000] unshared 0 (1:-1) elems at 1 with 10 elems 1 times.
221.   0.82400|   0.32800|2.51  |lreplace L[1000] unshared 0 (500:-1) elems at 500 with 1 elems 1 times.
222.   0.51200|   0.88000|0.58  |lreplace L[1000] unshared 0 (500:-1) elems at 500 with 10 elems 1 times.
223.   0.29600|   0.76270|0.39  |lreplace L[1000] unshared 0 (end-1:-1) elems at end-1 with 1 elems 1 times.
224.   0.52800|   0.84800|0.62  |lreplace L[1000] unshared 0 (end-1:-1) elems at end-1 with 10 elems 1 times.
225.   0.27730|   0.74930|0.37  |lreplace L[1000] unshared 0 (end:-1) elems at end with 1 elems 1 times.
226.   0.36270|   0.39200|0.93  |lreplace L[1000] unshared 0 (end:-1) elems at end with 10 elems 1 times.
227.   2.29090|   0.27250|8.41  |lreplace L[10000] unshared 0 (0:-1) elems at 0 with 1 elems 1 times.
228.   3.16880|   0.34930|9.07  |lreplace L[10000] unshared 0 (0:-1) elems at 0 with 10 elems 1 times.
229.   2.31570|   0.26000|8.91  |lreplace L[10000] unshared 0 (1:-1) elems at 1 with 1 elems 1 times.
230.   3.12450|   1.53010|2.04  |lreplace L[10000] unshared 0 (1:-1) elems at 1 with 10 elems 1 times.
231.   1.36030|   1.02910|1.32  |lreplace L[10000] unshared 0 (5000:-1) elems at 5000 with 1 elems 1 times.
232.   2.33390|   1.58240|1.47  |lreplace L[10000] unshared 0 (5000:-1) elems at 5000 with 10 elems 1 times.
233.   0.36160|   0.31870|1.13  |lreplace L[10000] unshared 0 (end-1:-1) elems at end-1 with 1 elems 1 times.
234.   0.34850|   1.26880|0.27  |lreplace L[10000] unshared 0 (end-1:-1) elems at end-1 with 10 elems 1 times.
235.   0.30770|   0.30590|1.01  |lreplace L[10000] unshared 0 (end:-1) elems at end with 1 elems 1 times.
236.   0.38990|   1.24130|0.31  |lreplace L[10000] unshared 0 (end:-1) elems at end with 10 elems 1 times.
```

**Pure deletes in an unshared list**

There is no measured difference in performance.

*Note: this has to be looked at further. I would have expected a 2x improvement
for deletions from the head for the 10000 element list based on other results.*

```
237.   0.87500|   1.00000|0.88  |lreplace L[10] unshared 0:0 with 0 elems 1 times.
238.   1.00000|   1.00000|1.00  |lreplace L[10] unshared 1:1 with 0 elems 1 times.
239.   1.00000|   1.79170|0.56  |lreplace L[10] unshared 5:5 with 0 elems 1 times.
240.   1.08330|   0.37500|2.89  |lreplace L[10] unshared end-1:end-1 with 0 elems 1 times.
241.   0.58330|   0.50000|1.17  |lreplace L[10] unshared end:end with 0 elems 1 times.
242.   0.96940|   0.37410|2.59  |lreplace L[100] unshared 0:0 with 0 elems 1 times.
243.   0.39120|   0.45920|0.85  |lreplace L[100] unshared 1:1 with 0 elems 1 times.
244.   0.53400|   0.34690|1.54  |lreplace L[100] unshared 50:50 with 0 elems 1 times.
245.   0.94900|   0.40820|2.32  |lreplace L[100] unshared end-1:end-1 with 0 elems 1 times.
246.   0.46260|   0.43540|1.06  |lreplace L[100] unshared end:end with 0 elems 1 times.
247.   0.86400|   0.41870|2.06  |lreplace L[1000] unshared 0:0 with 0 elems 1 times.
248.   0.88800|   0.38400|2.31  |lreplace L[1000] unshared 1:1 with 0 elems 1 times.
249.   0.38400|   0.90670|0.42  |lreplace L[1000] unshared 500:500 with 0 elems 1 times.
250.   0.99470|   0.99200|1.00  |lreplace L[1000] unshared end-1:end-1 with 0 elems 1 times.
251.   0.97070|   0.42400|2.29  |lreplace L[1000] unshared end:end with 0 elems 1 times.
252.   0.39170|   0.36000|1.09  |lreplace L[10000] unshared 0:0 with 0 elems 1 times.
253.   0.34560|   0.40590|0.85  |lreplace L[10000] unshared 1:1 with 0 elems 1 times.
254.   0.40850|   0.38690|1.06  |lreplace L[10000] unshared 5000:5000 with 0 elems 1 times.
255.   0.54130|   0.67390|0.80  |lreplace L[10000] unshared end-1:end-1 with 0 elems 1 times.
256.   0.44610|   0.44750|1.00  |lreplace L[10000] unshared end:end with 0 elems 1 times.
```

**Replacements in unshared list**

The TIP 625 implementation is a few times faster (293, 295, 296, 341, 343, 344)
when the starting replacement index is much closer to the head than the tail.
Again this is because TIP 625 permits moving the shorter segment to make room
for insertions.

```
257.   1.00000|   1.00000|1.00  |lreplace L[10] unshared 0:1 with 3 elems 1 times.
258.   0.37500|   0.37500|1.00  |lreplace L[10] unshared 0:1 with 2 elems 1 times.
259.   1.00000|   1.00000|1.00  |lreplace L[10] unshared 0:1 with 1 elems 1 times.
260.   0.50000|   1.04170|0.48  |lreplace L[10] unshared 1:2 with 3 elems 1 times.
261.   1.00000|   0.87500|1.14  |lreplace L[10] unshared 1:2 with 2 elems 1 times.
262.   0.50000|   2.50000|0.20  |lreplace L[10] unshared 1:2 with 1 elems 1 times.
263.   1.12500|   1.12500|1.00  |lreplace L[10] unshared 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
264.   1.00000|   1.12500|0.89  |lreplace L[10] unshared 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
265.   1.25000|   0.66670|1.87  |lreplace L[10] unshared 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
266.   0.41670|   1.00000|0.42  |lreplace L[10] unshared 0 (end-1:end) elems at end-1 with 3 elems 1 times.
267.   1.08330|   0.58330|1.86  |lreplace L[10] unshared 0 (end-1:end) elems at end-1 with 2 elems 1 times.
268.   0.58330|   1.12500|0.52  |lreplace L[10] unshared 0 (end-1:end) elems at end-1 with 1 elems 1 times.
269.   0.96940|   0.41500|2.34  |lreplace L[100] unshared 0:1 with 3 elems 1 times.
270.   0.42520|   0.91840|0.46  |lreplace L[100] unshared 0:1 with 2 elems 1 times.
271.   0.48640|   0.90480|0.54  |lreplace L[100] unshared 0:1 with 1 elems 1 times.
272.   0.47280|   0.43880|1.08  |lreplace L[100] unshared 1:2 with 3 elems 1 times.
273.   0.91160|   0.98640|0.92  |lreplace L[100] unshared 1:2 with 2 elems 1 times.
274.   0.53740|   0.32990|1.63  |lreplace L[100] unshared 1:2 with 1 elems 1 times.
275.   0.99660|   1.02040|0.98  |lreplace L[100] unshared 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
276.   0.47280|   0.42520|1.11  |lreplace L[100] unshared 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
277.   0.51360|   0.50000|1.03  |lreplace L[100] unshared 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
278.   0.97960|   0.98640|0.99  |lreplace L[100] unshared 0 (end-1:end) elems at end-1 with 3 elems 1 times.
279.   0.94560|   0.96600|0.98  |lreplace L[100] unshared 0 (end-1:end) elems at end-1 with 2 elems 1 times.
280.   0.48300|   0.52720|0.92  |lreplace L[100] unshared 0 (end-1:end) elems at end-1 with 1 elems 1 times.
281.   0.56800|   0.44000|1.29  |lreplace L[1000] unshared 0:1 with 3 elems 1 times.
282.   0.46130|   0.91200|0.51  |lreplace L[1000] unshared 0:1 with 2 elems 1 times.
283.   0.53870|   0.55470|0.97  |lreplace L[1000] unshared 0:1 with 1 elems 1 times.
284.   1.14400|   0.40000|2.86  |lreplace L[1000] unshared 1:2 with 3 elems 1 times.
285.   0.41600|   0.37600|1.11  |lreplace L[1000] unshared 1:2 with 2 elems 1 times.
286.   0.44000|   0.39730|1.11  |lreplace L[1000] unshared 1:2 with 1 elems 1 times.
287.   0.98400|   0.50670|1.94  |lreplace L[1000] unshared 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
288.   0.78930|   0.49870|1.58  |lreplace L[1000] unshared 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
289.   1.01070|   0.99200|1.02  |lreplace L[1000] unshared 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
290.   0.96530|   0.48270|2.00  |lreplace L[1000] unshared 0 (end-1:end) elems at end-1 with 3 elems 1 times.
291.   1.00000|   0.98130|1.02  |lreplace L[1000] unshared 0 (end-1:end) elems at end-1 with 2 elems 1 times.
292.   0.46930|   0.44000|1.07  |lreplace L[1000] unshared 0 (end-1:end) elems at end-1 with 1 elems 1 times.
293.   2.44610|   0.45010|5.43  |lreplace L[10000] unshared 0:1 with 3 elems 1 times.
294.   0.41490|   0.39600|1.05  |lreplace L[10000] unshared 0:1 with 2 elems 1 times.
295.   1.81360|   0.39630|4.58  |lreplace L[10000] unshared 0:1 with 1 elems 1 times.
296.   2.60000|   0.38850|6.69  |lreplace L[10000] unshared 1:2 with 3 elems 1 times.
297.   0.44320|   0.40720|1.09  |lreplace L[10000] unshared 1:2 with 2 elems 1 times.
298.   1.49570|   0.46590|3.21  |lreplace L[10000] unshared 1:2 with 1 elems 1 times.
299.   0.54000|   0.52080|1.04  |lreplace L[10000] unshared 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
300.   0.42930|   0.49250|0.87  |lreplace L[10000] unshared 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
301.   0.48510|   0.52480|0.92  |lreplace L[10000] unshared 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
302.   0.53410|   0.47120|1.13  |lreplace L[10000] unshared 0 (end-1:end) elems at end-1 with 3 elems 1 times.
303.   0.49710|   0.48210|1.03  |lreplace L[10000] unshared 0 (end-1:end) elems at end-1 with 2 elems 1 times.
304.   0.44850|   0.49230|0.91  |lreplace L[10000] unshared 0 (end-1:end) elems at end-1 with 1 elems 1 times.
305.   0.37500|   0.37500|1.00  |lreplace L[10] unshared-span 0:1 with 3 elems 1 times.
306.   0.37500|   0.87500|0.43  |lreplace L[10] unshared-span 0:1 with 2 elems 1 times.
307.   0.37500|   0.87500|0.43  |lreplace L[10] unshared-span 0:1 with 1 elems 1 times.
308.   0.37500|   0.37500|1.00  |lreplace L[10] unshared-span 1:2 with 3 elems 1 times.
309.   0.87500|   0.41670|2.10  |lreplace L[10] unshared-span 1:2 with 2 elems 1 times.
310.   0.37500|   1.16670|0.32  |lreplace L[10] unshared-span 1:2 with 1 elems 1 times.
311.   1.00000|   1.00000|1.00  |lreplace L[10] unshared-span 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
312.   1.00000|   1.00000|1.00  |lreplace L[10] unshared-span 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
313.   0.45830|   1.00000|0.46  |lreplace L[10] unshared-span 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
314.   1.00000|   1.00000|1.00  |lreplace L[10] unshared-span 0 (end-1:end) elems at end-1 with 3 elems 1 times.
315.   1.00000|   1.12500|0.89  |lreplace L[10] unshared-span 0 (end-1:end) elems at end-1 with 2 elems 1 times.
316.   1.00000|   0.45830|2.18  |lreplace L[10] unshared-span 0 (end-1:end) elems at end-1 with 1 elems 1 times.
317.   0.41500|   0.91500|0.45  |lreplace L[100] unshared-span 0:1 with 3 elems 1 times.
318.   0.40140|   0.38100|1.05  |lreplace L[100] unshared-span 0:1 with 2 elems 1 times.
319.   0.96600|   0.37760|2.56  |lreplace L[100] unshared-span 0:1 with 1 elems 1 times.
320.   0.42180|   0.92520|0.46  |lreplace L[100] unshared-span 1:2 with 3 elems 1 times.
321.   0.40140|   0.87070|0.46  |lreplace L[100] unshared-span 1:2 with 2 elems 1 times.
322.   1.00680|   0.91500|1.10  |lreplace L[100] unshared-span 1:2 with 1 elems 1 times.
323.   0.45240|   1.02040|0.44  |lreplace L[100] unshared-span 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
324.   1.00340|   0.44900|2.23  |lreplace L[100] unshared-span 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
325.   0.45580|   1.01020|0.45  |lreplace L[100] unshared-span 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
326.   0.97620|   0.99660|0.98  |lreplace L[100] unshared-span 0 (end-1:end) elems at end-1 with 3 elems 1 times.
327.   0.98640|   0.93540|1.05  |lreplace L[100] unshared-span 0 (end-1:end) elems at end-1 with 2 elems 1 times.
328.   0.48980|   0.47960|1.02  |lreplace L[100] unshared-span 0 (end-1:end) elems at end-1 with 1 elems 1 times.
329.   0.54130|   0.91200|0.59  |lreplace L[1000] unshared-span 0:1 with 3 elems 1 times.
330.   0.90930|   0.87730|1.04  |lreplace L[1000] unshared-span 0:1 with 2 elems 1 times.
331.   1.02670|   0.92000|1.12  |lreplace L[1000] unshared-span 0:1 with 1 elems 1 times.
332.   0.89870|   0.39200|2.29  |lreplace L[1000] unshared-span 1:2 with 3 elems 1 times.
333.   0.89330|   0.93330|0.96  |lreplace L[1000] unshared-span 1:2 with 2 elems 1 times.
334.   0.48800|   0.88800|0.55  |lreplace L[1000] unshared-span 1:2 with 1 elems 1 times.
335.   1.67200|   0.99470|1.68  |lreplace L[1000] unshared-span 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
336.   0.52800|   0.44800|1.18  |lreplace L[1000] unshared-span 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
337.   0.50400|   0.44530|1.13  |lreplace L[1000] unshared-span 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
338.   0.48270|   0.42930|1.12  |lreplace L[1000] unshared-span 0 (end-1:end) elems at end-1 with 3 elems 1 times.
339.   0.44530|   0.45330|0.98  |lreplace L[1000] unshared-span 0 (end-1:end) elems at end-1 with 2 elems 1 times.
340.   0.48530|   0.99470|0.49  |lreplace L[1000] unshared-span 0 (end-1:end) elems at end-1 with 1 elems 1 times.
341.   2.48640|   0.40530|6.13  |lreplace L[10000] unshared-span 0:1 with 3 elems 1 times.
342.   0.41890|   0.40930|1.02  |lreplace L[10000] unshared-span 0:1 with 2 elems 1 times.
343.   1.79730|   0.39870|4.51  |lreplace L[10000] unshared-span 0:1 with 1 elems 1 times.
344.   2.42000|   0.41730|5.80  |lreplace L[10000] unshared-span 1:2 with 3 elems 1 times.
345.   0.37920|   0.41360|0.92  |lreplace L[10000] unshared-span 1:2 with 2 elems 1 times.
346.   1.77710|   0.41440|4.29  |lreplace L[10000] unshared-span 1:2 with 1 elems 1 times.
347.   0.50530|   0.42830|1.18  |lreplace L[10000] unshared-span 0 (end-2:end-1) elems at end-2 with 3 elems 1 times.
348.   0.46240|   0.46690|0.99  |lreplace L[10000] unshared-span 0 (end-2:end-1) elems at end-2 with 2 elems 1 times.
349.   0.74880|   0.47840|1.57  |lreplace L[10000] unshared-span 0 (end-2:end-1) elems at end-2 with 1 elems 1 times.
350.   0.41440|   0.46510|0.89  |lreplace L[10000] unshared-span 0 (end-1:end) elems at end-1 with 3 elems 1 times.
351.   0.40290|   0.47520|0.85  |lreplace L[10000] unshared-span 0 (end-1:end) elems at end-1 with 2 elems 1 times.
352.   0.64530|   0.45630|1.41  |lreplace L[10000] unshared-span 0 (end-1:end) elems at end-1 with 1 elems 1 times.
```

**Total run time**

```
353.2129.60240|1799.40910|1.18  |lreplace total run time
```

### <a id='lreverse'></a>lreverse

TIP 625 does not change the implementation of `lreverse`.

```
           [1]           [2]
1.     0.28000|   0.32230|0.87  |lreverse L[10] shared
2.     0.54080|   0.52420|1.03  |lreverse L[100] shared
3.     3.12020|   2.99680|1.04  |lreverse L[1000] shared
4.     3.12240|   2.97590|1.05  |lreverse L[1000] shared-span
5.    28.84760|  28.37830|1.02  |lreverse L[10000] shared
6.    29.05440|  28.26280|1.03  |lreverse L[10000] shared-span
7.     0.08260|   0.04570|1.81  |lreverse L[10] unshared
8.     0.16640|   0.11280|1.48  |lreverse L[100] unshared
9.     0.13310|   0.07190|1.85  |lreverse L[100] unshared-span
10.    0.60120|   0.74040|0.81  |lreverse L[1000] unshared
11.    0.35760|   0.37410|0.96  |lreverse L[1000] unshared-span
12.    3.32980|   3.39540|0.98  |lreverse L[10000] unshared
13.    3.29130|   3.27690|1.00  |lreverse L[10000] unshared-span
14.   72.92740|  71.47740|1.02  |lreverse total run time
```

### <a id='lsort'></a>lsort

TIP 625 does not change the implementation of `lsort`.

```
           [1]           [2]
1.  1235.98330|1076.14330|1.15  |lsort L[10000] shared
2.  1204.60000|1050.87670|1.15  |lsort L[9998] shared-span
3.  1195.14670|1038.43000|1.15  |lsort L[10000] unshared
4.  1201.93670|1051.67330|1.14  |lsort L[9998] unshared-span
5.  4837.66670|4217.12330|1.15  |lsort total run time

```

### <a id='lsearch'></a>lsearch

TIP 625 does not change the implementation of `lsearch`.

```
           [1]           [2]
1.     0.43450|   0.39900|1.09  |lsearch L[10] shared
2.     1.27670|   1.25140|1.02  |lsearch L[100] shared
3.     9.97910|   9.79560|1.02  |lsearch L[1000] shared
4.    96.00840|  94.60320|1.01  |lsearch L[10000] shared
5.     0.44090|   0.40390|1.09  |lsearch L[10] shared-span
6.     1.28580|   1.28200|1.00  |lsearch L[100] shared-span
7.    10.00410|   9.80580|1.02  |lsearch L[1000] shared-span
8.    96.09630|  93.87000|1.02  |lsearch L[10000] shared-span
9.   215.52570| 211.41090|1.02  |lsearch total run time
```

### <a id='concat'></a>concat

The performance of `concat` is more or less the same. The implementation in TIP 625
is a little different however. Since the list store no long directly represents
the contents of a Tcl list in the presence of a span in the internal representation,
the canonical list marker has been moved from the element storage structure
(`List` pre-625, `ListStore` post-625) to the `ListSpan` structure.

```
           [1]           [2]
1.     0.39210|   0.45290|0.87  |concat L[10] pure lists with elements of length 1
2.     0.39130|   0.42740|0.92  |concat L[10] canonical lists with elements of length 1
3.     0.52120|   0.51800|1.01  |concat L[10] non-canonical lists with elements of length 1
4.     0.39150|   0.44130|0.89  |concat L[10] pure lists with elements of length 100
5.     0.39300|   0.43200|0.91  |concat L[10] canonical lists with elements of length 100
6.     0.49680|   0.55880|0.89  |concat L[10] non-canonical lists with elements of length 100
7.     1.02070|   0.88440|1.15  |concat L[100] pure lists with elements of length 1
8.     1.01440|   0.88620|1.14  |concat L[100] canonical lists with elements of length 1
9.     0.54440|   0.54540|1.00  |concat L[100] non-canonical lists with elements of length 1
10.    1.02290|   0.89080|1.15  |concat L[100] pure lists with elements of length 100
11.    1.01180|   0.88060|1.15  |concat L[100] canonical lists with elements of length 100
12.    1.15390|   1.13920|1.01  |concat L[100] non-canonical lists with elements of length 100
13.    7.55860|   6.06680|1.25  |concat L[1000] pure lists with elements of length 1
14.    7.55550|   6.02160|1.25  |concat L[1000] canonical lists with elements of length 1
15.    0.59930|   0.51360|1.17  |concat L[1000] non-canonical lists with elements of length 1
16.    7.54490|   6.06080|1.24  |concat L[1000] pure lists with elements of length 100
17.    7.53940|   6.10690|1.23  |concat L[1000] canonical lists with elements of length 100
18.    5.61890|   5.89150|0.95  |concat L[1000] non-canonical lists with elements of length 100
19.   73.01750|  60.45310|1.21  |concat L[10000] pure lists with elements of length 1
20.   73.15510|  60.58030|1.21  |concat L[10000] canonical lists with elements of length 1
21.    1.51330|   1.68590|0.90  |concat L[10000] non-canonical lists with elements of length 1
22.   73.16820|  60.36880|1.21  |concat L[10000] pure lists with elements of length 100
23.   73.03110|  60.63200|1.20  |concat L[10000] canonical lists with elements of length 100
24.  560.61300| 561.31200|1.00  |concat L[10000] non-canonical lists with elements of length 100
25.    0.38680|   0.42730|0.91  |concat L[10] pure spanned lists with elements of length 1
26.    0.38390|   0.42340|0.91  |concat L[10] canonical spanned lists with elements of length 1
27.    0.39030|   0.47080|0.83  |concat L[10] pure spanned lists with elements of length 100
28.    0.39880|   0.45830|0.87  |concat L[10] canonical spanned lists with elements of length 100
29.    1.01650|   0.88040|1.15  |concat L[100] pure spanned lists with elements of length 1
30.    1.01970|   0.88460|1.15  |concat L[100] canonical spanned lists with elements of length 1
31.    1.02070|   0.88790|1.15  |concat L[100] pure spanned lists with elements of length 100
32.    1.01970|   0.88440|1.15  |concat L[100] canonical spanned lists with elements of length 100
33.    7.57620|   6.31530|1.20  |concat L[1000] pure spanned lists with elements of length 1
34.    7.58030|   6.18480|1.23  |concat L[1000] canonical spanned lists with elements of length 1
35.    7.60980|   6.33390|1.20  |concat L[1000] pure spanned lists with elements of length 100
36.    7.58360|   6.18870|1.23  |concat L[1000] canonical spanned lists with elements of length 100
37.   73.03940|  61.31010|1.19  |concat L[10000] pure spanned lists with elements of length 1
38.   73.09240|  61.00820|1.20  |concat L[10000] canonical spanned lists with elements of length 1
39.   73.10410|  60.94180|1.20  |concat L[10000] pure spanned lists with elements of length 100
40.   72.63530|  60.26010|1.21  |concat L[10000] canonical spanned lists with elements of length 100
41. 1227.12620|1117.61030|1.10  |concat total run time
```


### <a id='lindex'></a>lindex

TIP 625 does not fundamentally change the implementation of `lindex` except
the index lookup has a level of indirection when a span is present.


```
           [1]           [2]
1.     0.34410|   0.34050|1.01  |lindex L[10] shared at 5
2.     0.30290|   0.32290|0.94  |lindex L[100] shared at 50
3.     0.35450|   0.33670|1.05  |lindex L[100] shared-span at 50
4.     0.32070|   0.34110|0.94  |lindex L[1000] shared at 500
5.     0.31040|   0.34520|0.90  |lindex L[1000] shared-span at 500
6.     0.28380|   0.28780|0.99  |lindex L[10000] shared at 5000
7.     0.33510|   0.31780|1.05  |lindex L[10000] shared-span at 5000
8.     2.25130|   2.29190|0.98  |lindex total run time

```

### <a id='join'></a>join

TIP 625 does not change the implementation of `join`.

```
           [1]           [2]
1.     0.63350|   0.73150|0.87  |join L[10] shared
2.     3.31150|   3.51940|0.94  |join L[100] shared
3.    28.70850|  29.40520|0.98  |join L[1000] shared
4.   283.47030| 301.63530|0.94  |join L[10000] shared
5.     0.68130|   0.66160|1.03  |join L[10] shared-span
6.     3.20260|   3.18550|1.01  |join L[100] shared-span
7.    30.30590|  29.93550|1.01  |join L[1000] shared-span
8.   292.52900| 282.82870|1.03  |join L[10000] shared-span
9.   642.84250| 651.90270|0.99  |join total run time
```

### <a id='split'></a>split

The `split` command is primarily a test of string conversion to lists.
TIP 625 does not fundamentally change this as no spans are created or additional
free space allocated.

```
           [1]           [2]
1.     1.13950|   1.20560|0.95  |split L[10]
2.     7.84830|   8.06740|0.97  |split L[100]
3.    67.91360|  71.40540|0.95  |split L[1000]
4.   745.95000| 741.73270|1.01  |split L[10000]
5.   822.85130| 822.41110|1.00  |split total run time
```

### <a id='llength'></a>llength

TIP 625 does not fundamentally change the implementation of `llength` except
the index lookup has a level of indirection when a span is present.

```
           [1]           [2]
1.     0.16300|   0.16470|0.99  |llength L[10] shared
2.     0.16430|   0.15990|1.03  |llength L[100] shared
3.     0.16770|   0.16350|1.03  |llength L[100] shared-span
4.     0.16100|   0.15750|1.02  |llength L[1000] shared
5.     0.17380|   0.17630|0.99  |llength L[1000] shared-span
6.     0.15780|   0.17000|0.93  |llength L[10000] shared
7.     0.21030|   0.19790|1.06  |llength L[10000] shared-span
8.     1.19790|   1.19000|1.01  |llength total run time
```

### <a id='lrepeat'></a>lrepeat

TIP 625 does not change the implementation of `lrepeat`.

```
           [1]           [2]
1.     0.32680|   0.29960|1.09  |lrepeat L[10] 1 elems at a time
2.     0.40190|   0.42080|0.96  |lrepeat L[10] 5 elems at a time
3.     0.47420|   0.44520|1.07  |lrepeat L[100] 1 elems at a time
4.     1.18740|   1.41090|0.84  |lrepeat L[100] 5 elems at a time
5.     2.04560|   1.88900|1.08  |lrepeat L[1000] 1 elems at a time
6.     9.70230|  11.49970|0.84  |lrepeat L[1000] 5 elems at a time
7.    18.70830|  17.58500|1.06  |lrepeat L[10000] 1 elems at a time
8.    91.49820| 110.88470|0.83  |lrepeat L[10000] 5 elems at a time
9.   124.34470| 144.43490|0.86  |lrepeat total run time
10.  124.34470| 144.43490|0.86  |Total run time
```

### <a id='lmap'></a>lmap

TIP 625 does not change the implementation of `lmap`.

```
           [1]           [2]
1.     3.77170|   3.72460|1.01  |lmap L[10] shared
2.    30.98280|  30.33220|1.02  |lmap L[100] shared
3.   281.95500| 296.92430|0.95  |lmap L[1000] shared
4.  2836.64670|2810.33000|1.01  |lmap L[10000] shared
5.     3.43640|   3.35300|1.02  |lmap L[10] shared-span
6.    29.05240|  30.18750|0.96  |lmap L[100] shared-span
7.   278.59670| 303.73630|0.92  |lmap L[1000] shared-span
8.  2791.50330|2765.93670|1.01  |lmap L[10000] shared-span
9.  6255.94490|6244.52470|1.00  |lmap total run time
10. 6255.94490|6244.52470|1.00  |Total run time
```

### <a id='foreach'></a>foreach

TIP 625 does not change the implementation of `foreach`.

```
           [1]           [2]
1.     3.30660|   3.29140|1.00  |foreach L[10] shared
2.    28.85590|  27.62580|1.04  |foreach L[100] shared
3.   289.98170| 283.34770|1.02  |foreach L[1000] shared
4.  2919.51000|2836.30000|1.03  |foreach L[10000] shared
5.     3.08390|   2.66870|1.16  |foreach L[10] shared-span
6.    28.62160|  27.74730|1.03  |foreach L[100] shared-span
7.   287.61600| 283.09830|1.02  |foreach L[1000] shared-span
8.  2908.58670|2822.31330|1.03  |foreach L[10000] shared-span
9.  6469.56230|6286.39250|1.03  |foreach total run time
```

## <a id='Memorystatistics'></a>Memory statistics

The sections below shows memory statistics when compiled with TCL_MEM_DEBUG and
with TCL_FINALIZE_ON_EXIT set. The statistics are based on a full run of the
performance suite across all commands.

### <a id='Memoryleaks'></a>Memory leaks

The following snippets show the output of `memory onexit` for the two
implementations. As seen, both have identical allocation left over on exit.

**8.7**

```
0000027E7D6E0428 - 0000027E7D6E0457  48 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclBasic.c 4877 
0000027E7D6E17A8 - 0000027E7D6E17D7  48 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclBasic.c 4712 
0000027E7D6E0D28 - 0000027E7D6E0D57  48 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclExecute.c 2880 
0000027E7D6E16A8 - 0000027E7D6E16D7  48 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclBasic.c 6660 
0000027E7D28ADE8 - 0000027E7D28AEB3  204 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclCompile.c 2855 
0000027E7D6E08A8 - 0000027E7D6E08CF  40 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclObj.c 4541 
0000027E7DA509E8 - 0000027E7DA509EC  5 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclLiteral.c 255 
0000027E7D6E15A8 - 0000027E7D6E15D7  48 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclLiteral.c 250 
0000027E7DA76CA8 - 0000027E7DA76CB2  11 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclStringObj.c 151 
0000027E7D6E0E28 - 0000027E7D6E0E57  48 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclStringObj.c 2847 
0000027E7CB9CD28 - 0000027E7CB9CD57  48 @ unknown 0 
0000027E7CB9A8A8 - 0000027E7CB9A8D7  48 @ unknown 0 
0000027E7CB9C8A8 - 0000027E7CB9C8D7  48 @ unknown 0 
0000027E7C6D7428 - 0000027E7C6D7457  48 @ unknown 0 
0000027E7C6FFA28 - 0000027E7C6FFA57  48 @ unknown 0 
0000027E7C6FD5A8 - 0000027E7C6FD5D7  48 @ unknown 0 
0000027E7C66DEF8 - 0000027E7C66DF09  18 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclStringObj.c 338 
0000027E7C5E0008 - 0000027E7C5E0037  48 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclIOUtil.c 3942 
0000027E7C5CFD88 - 0000027E7C5CFDAF  40 @ D:\src\tcltk\list-redux\tcl\win\..\win\tclWinLoad.c 392 
0000027E7C63F4C8 - 0000027E7C63F4CC  5 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclStringObj.c 338 
0000027E7C62BDC8 - 0000027E7C62BDF7  48 @ unknown 0 
0000027E7A97A3C8 - 0000027E7A97A3C9  2 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclLiteral.c 255 
0000027E7A96E4A8 - 0000027E7A96E4D7  48 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclLiteral.c 250 
0000027E7A72E988 - 0000027E7A72E9F7  112 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclBasic.c 1071 
0000027E7A7231C8 - 0000027E7A7231DF  24 @ D:\src\tcltk\list-redux\tcl\win\..\generic\tclPreserve.c 329 
```

**TIP 625**

```
000001EF07518AA8 - 000001EF07518AD7  48 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclBasic.c 4877 
000001EF07519328 - 000001EF07519357  48 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclBasic.c 4712 
000001EF07518EA8 - 000001EF07518ED7  48 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclExecute.c 2880 
000001EF07519BA8 - 000001EF07519BD7  48 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclBasic.c 6660 
000001EF071BBF18 - 000001EF071BBFE3  204 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclCompile.c 2855 
000001EF075185A8 - 000001EF075185CF  40 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclObj.c 4541 
000001EF06EF0AE8 - 000001EF06EF0AEC  5 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclLiteral.c 255 
000001EF075188A8 - 000001EF075188D7  48 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclLiteral.c 250 
000001EF0722F348 - 000001EF0722F352  11 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclStringObj.c 151 
000001EF075195A8 - 000001EF075195D7  48 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclStringObj.c 2847 
000001EF0681A8A8 - 000001EF0681A8D7  48 @ unknown 0 
000001EF06817CA8 - 000001EF06817CD7  48 @ unknown 0 
000001EF068184A8 - 000001EF068184D7  48 @ unknown 0 
000001EF0642B7B8 - 000001EF0642B7E7  48 @ unknown 0 
000001EF0645CD38 - 000001EF0645CD67  48 @ unknown 0 
000001EF0645B9B8 - 000001EF0645B9E7  48 @ unknown 0 
000001EF0636FF98 - 000001EF0636FFA9  18 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclStringObj.c 338 
000001EF06338E38 - 000001EF06338E67  48 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclIOUtil.c 3942 
000001EF0632ABB8 - 000001EF0632ABDF  40 @ d:\src\tcltk\core-8-branch\tcl\win\..\win\tclWinLoad.c 392 
000001EF063A0258 - 000001EF063A025C  5 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclStringObj.c 338 
000001EF06391828 - 000001EF06391857  48 @ unknown 0 
000001EF05ECA6B8 - 000001EF05ECA6B9  2 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclLiteral.c 255 
000001EF05EBFB78 - 000001EF05EBFBA7  48 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclLiteral.c 250 
000001EF0454D4C8 - 000001EF0454D537  112 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclBasic.c 1071 
000001EF04544598 - 000001EF045445AF  24 @ d:\src\tcltk\core-8-branch\tcl\win\..\generic\tclPreserve.c 329 
```

### <a id='Memoryusage'></a>Memory usage

The comparison below of `memory info` shows no statistical difference between
the two implementation.

```
    [1]           [2]
5591454.58600|5803295.19000|0.96  |memdbg total mallocs (in thousands)
5591392.09200|5803232.53600|0.96  |memdbg total frees (in thousands)
     62.49400|  62.65400|1.00  |memdbg current packets allocated (in thousands)
   4516.11500|4530.28300|1.00  |memdbg current bytes allocated (in thousands)
     99.94300|  99.94400|1.00  |memdbg maximum packets allocated (in thousands)
   9612.75600|9617.71900|1.00  |memdbg maximum bytes allocated (in thousands)
```

The same is true of the memory statistics as returned by Windows.

```
    [1]           [2]
  12.56640|  12.53910|1.00  |Memory (MB) -privatebytes pre-test
  16.53130|  16.17970|1.02  |Memory (MB) -privatebytes post-test
   3.96480|   3.64060|1.09  |Memory (MB) delta -privatebytes
  21.20310|  21.18360|1.00  |Memory (MB) -workingset pre-test
  25.19140|  24.32030|1.04  |Memory (MB) -workingset post-test
   3.98830|   3.13670|1.27  |Memory (MB) delta -workingset
  21.20700|  21.18750|1.00  |Memory (MB) -workingsetpeak pre-test
  29.62890|  29.45310|1.01  |Memory (MB) -workingsetpeak post-test
   8.42190|   8.26560|1.02  |Memory (MB) delta -workingsetpeak
```

The above numbers however do not tell the whole story because they only shows
statistics at the end of a program. They do not make any statement about how
long objects are held on to in a real application.

Memory wastage in the pre-TIP 625 implementation comes from overallocation of
space in the list storage area which makes further list append operations O(1).
The TIP 625 implementation also has this overallocation overhead but in addition
may keep objects alive for longer than needed which contributes to memory
overhead. This is offset by increased sharing of memory between lists.

Consider the following sequence of pseudo-commands.

```
1. while {[incr i] <= 1000} {lappend L $i}
2. set R [lrange $L 250 749]
3. unset L
4. lappend R X
```

After 1. both implementations use the same amount of memory for the list 
(ignoring fixed overhead) - 1000 allocated element Tcl_Obj's plus 1000
allocated list slots for the elements plus up to the same number of unused
slots for further appends.

After 2. the pre-TIP 625 implementation will have allocated another block
of internal storage for 500 elements, copied the appropriate element pointers
and incremented their reference counts. The TIP 625 implementation on the
other hand, only needs a small additional block for a `ListSpan` and thus
is more memory efficient in addition to being significantly faster.

After 3. the situation is reversed. In the pre-TIP 625 implementation, the
original element array will be freed and only the second 500+ element block will
remain allocated. In TIP 625 on the other hand, the original 1000+ element array
will remain. Moreover, 500 element Tcl_Obj's remain allocated even though they
are "garbage" (assuming there are no other references to them). They will be
reclaimed (well, reference counts decremented) on the next access to `R` if
there are no other references to the list storage. During that time these
objects are unnecessary memory overhead.

Note: as an aside this last delayed freeing of objects can be avoided with
the use of the K operator but should generally not be necessary.

After 4. The access to R causes the garbage objects to be reclaimed.

In consideration of the above, the TIP 625 implementation adopts the following
policy. A `ListRep` for a list of `N` elements will only be implemented with a
`ListSpan` component provided all the following conditions are met. This puts
some boundaries on overhead due to late release of objects.

- `N` must be at least `TCL_LIST_SPAN_MINSIZE`

- `N` must be at least half the size of the currently in-use space of the
corresponding `ListStore`

- `N` must be at least 3/8 the size of the total allocated space for the `ListStore`.

If any of the above conditions are not met, the list internal representation
will just allocate a `ListStore` similar to the pre-TIP 625 implementation
without a `ListSpan` component.

In addition, whereas the current implementation never reduces allocated space,
the TIP 625 implementation will reallocate if the used space falls below
(currently) a quarter of the allocated space. This saves memory at the cost of
speed. Changing this behaviour is orthogonal to rest of the TIP.

In the light of the above, the question posed is whether the TIP 625 memory
usage is higher in practice than the pre-TIP 625 implementation and if so,
whether the difference is large enough to make the TIP non-viable despite the
improvements in speed.

Measurements with long-lived real world applications are needed to ascertain
memory impact (memory is less of consideration with ephemeral programs).
It is worth keeping in mind that

- the garbage objects only occur with range operations and not (for example)
prepending etc.

- the impact is only felt on usage patterns where the "parent" list's lifetime
is shorter than the "child" spanned list **and** the latter is long lived
(for instance, not a local) **and** is not subsequently modified.

# <a id='Tests'></a>Tests

The Tcl test suite passes with no failures. The existing test suite has been
extended with a new test script listRep.test which focuses on code paths
in the list implementation in addition to functional tests.

# <a id='Implementation'></a>Implementation

See branch [`tip-625`](https://core.tcl-lang.org/tcl/tip-625).

# <a id='Copyright'></a>Copyright

This document has been placed in the public domain.







Added tip/626.md.



















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 626: Command arguments > 2^31 elements
        Author:        Jan Nijtmans <[email protected]>
        State:         Draft
        Type:          Project
        Vote:          Pending
        Created:       24-05-2022
        Tcl-Version:   9.1
        Keywords:      Tcl
        Tcl-Branch:    tip-626
-----

# Abstract

This TIP proposes to change Tcl internally, to use `Tcl_CreateObjCommand2()` (TIP #627), and
to change all internal handling, allowing > 2^31 elements. This doesn't change any
API (since the API is already available), but it has some consequences.

# Implementation

See branch [`tip-626`](https://core.tcl-lang.org/tcl/timeline?r=tip-626)

# Copyright

This document has been placed in the public domain.

Added tip/627.md.

















































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 627: New functions for handling commands > 2^31 elements (for 8.7)
        Author:        Jan Nijtmans <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Created:       01-06-2022
        Tcl-Version:   8.7
        Keywords:      Tcl
        Tcl-Branch:    tip-627
        Vote-Summary   Accepted 3/0/1
        Votes-For:     JN, KBK, KW
        Votes-Against: none
        Votes-Present: FV
-----

# Abstract

This TIP proposes 4 new functions:

 * `Tcl_CreateObjCommand2`
 * `Tcl_CreateObjTrace2`
 * `Tcl_NRCreateCommand2`
 * `Tcl_NRCallObjProc2`

Those functions do the same as `Tcl_CreateObjCommand`/`Tcl_CreateObjTrace`/`Tcl_NRCreateCommand`/`Tcl_NRCallObjProc`,
but their `Tcl_ObjCmdProc *` argument is now of type `Tcl_ObjCmdProc2 *`, and
`Tcl_CmdObjTraceProc *` (for `Tcl_CreateObjTrace2`) is now of type `Tcl_CmdObjTraceProc2 *`.
Those new types can handle more than 2^31 command line arguments when used in Tcl 9.0.

# Specification

The following new functions are defined:

 * `Tcl_CreateObjCommand2(Tcl_Interp *, const char *, Tcl_ObjCmdProc2 *, ClientData, Tcl_CmdDeleteProc *)`
 * `Tcl_CreateObjTrace2(Tcl_Interp *, Tcl_Size, int, Tcl_CmdObjTraceProc2 *, ClientData, Tcl_CmdObjTraceDeleteProc *)`
 * `Tcl_NRCreateCommand2(Tcl_Interp *, const char *, Tcl_ObjCmdProc2 *, Tcl_ObjCmdProc2 *, ClientData, Tcl_CmdDeleteProc *)`
 * `Tcl_NRCallObjProc2(Tcl_Interp *, Tcl_ObjCmdProc2 *, ClientData, Tcl_Size, Tcl_Obj *const *)`


The definitions of the new types are:
<pre>
typedef int (Tcl_ObjCmdProc2) (ClientData clientData, Tcl_Interp *interp,
	Tcl_Size objc, struct Tcl_Obj *const *objv);
typedef int (Tcl_CmdObjTraceProc2) (ClientData clientData, Tcl_Interp *interp,
	Tcl_Size level, const char *command, Tcl_Command commandInfo, Tcl_Size objc,
	Tcl_Obj *const *objv);
</pre>
Note that the `objc` argument changed type from `int` to `Tcl_Size`.

Those functions allow extensions to register commands or trace functions which can handle
more than 2^31 elements. Since the Tcl core cannot handle commands with more than
2^31 elements yet, this - for now - is of limited usability: The core should first be
extended to handle this everywhere, which is a massive amount of work. Therefore,
I am choosing to submit this part separately, so it can be used in Tcl 8.7 as well.
A later [TIP #626](626.md) (for Tcl 9.0), which makes the actual transition
making it really useful, can then decided upon separately. Also, if the API is
decided upon, the actual transition could even be delayed until Tcl 9.1: As
long as the API stays the same, it is considered an upwards compatible
change, no matter how it is handled internally.

Starting with Tcl 9.0, the `Tcl_CmdInfo` struct gets two additional
elements:
<pre>
typedef struct {
    ...
    Tcl_ObjCmdProc2 *objProc2;	/* Command's object2-based function. */
    void *objClientData2;	/* ClientData for object2 proc. */
} Tcl_CmdInfo;
</pre>
After calling the function `Tcl_GetCommandInfo()`, if `Tcl_CreateObjCommand2`
was used for registering the command, those fields will contain the
original function and clientData used in `Tcl_CreateObjCommand2`.
This change cannot be made in Tcl 8.7, since `Tcl_CmdInfo` is
usually allocated on the C-stack: Enlarging a struct size
(and writing the additional fields) is not considered binary
compatible. In Tcl 9.0, binary compatibility is lost anyway,
there we can afford this addition. Also - Tcl 9.0 only -,
when `Tcl_CreateObjCommand2` is used, the `isNativeObjectProc`
will be set to `2`. Current code is normally checking `isNativeObjectProc`
for being !=0, in order to see whether `objProc`/`objClientData`
is usable. That's still true: if `isNativeObjectProc` is `2`,
`objProc`/`objClientData` will contain wrapper information,
resulting in calling `objProc2`/`objClientData2`. So, no
current code needs to be adapted for Tcl 9.0: The promise
of source compatibility is still kept.

# Addendum

After [TIP #665](665.md) was accepted, a lot of functions changed from
using size\_t to Tcl\_Size parameters. In order to prevent confusion,
this change has been adapted in the TIP text above as well.

# Implementation

See branch [`tip-627`](https://core.tcl-lang.org/tcl/timeline?r=tip-627)

# Compatibility

The proposed change is 100% source and binary compatible with Tcl 8.6, since
the new functions are implemented as wrappers around the original functions.

# Copyright

This document has been placed in the public domain.

Added tip/628.md.























































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 628: Shared 8.7/9.0 build environment
        Author:        Jan Nijtmans <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Created:       22-06-2022
        Tcl-Version:   9.0
        Keywords:      Tcl
        Tcl-Branch:    tcl8-compat
        Vote-Summary:  Accepted 3/0/0
        Votes-For:     JN, KBK SL
        Votes-Against: none
        Votes-Present: none
-----

# Abstract

Imagine the situation we want to compile an extensions for both
Tcl 8.7 and 9.0. That means, two environments need to be set up, with
each of them having it's own 'tcl.h' and 'libtclstub&lt;version&gt;.a'.

This TIP proposes bringing this challenge down to a single environment
with can compile the extension for both 8.7 (possibly 8.6 also) and 9.0.

# Specification

First, the stub library 'libtclstub9.0.a' is renamed to 'libtclstub.a', so
without version number. Reason: the source code of 'libtclstub9.0.a' is 
exactly the same as 'libtclstub8.7.a', there is no reason to
have a version-number in the filename. Actually 'libtclstub9.0.a' has
some more functions, which are not usable in Tcl 8.7, but that is
handled by proper if'def'ing in 'tcl.h'. This makes 'libtclstub.a'
usable for both Tcl 8.x and 9.0.

The biggest difference between 'tcl.h' in 8.7 and 9.0 is that in
Tcl 8.7 many variables have 'int' arguments while in Tcl 9.0 those
are 'ptrdiff_t' arguments. That can be handled in 'tcl.h' as follows:
<pre>
 #if !defined(TCL_MAJOR_VERSION)
 #   define TCL_MAJOR_VERSION 9
 #endif
 #if TCL_MAJOR_VERSION > 8
 #   define Tcl_Size ptrdiff_t
 #else
 #   define Tcl_Size int
 #endif
</pre>

All parameters in 'tcl.h', 'tclDecls.h' ... are modified to use type 'Tcl_Size'
in stead of 'ptrdiff_t'. This makes 'tcl.h' from 9.0 usable for Tcl 8.7 too
with the following additional restrictions:

* Anything what was deprecated in Tcl 8.7 (and so, removed in 9.0) is still not usable in this mode.
* It only works for stub-enabled extensions, not for static linking.
* 'TCL_VERSION' and 'TCL_PATCHLEVEL' are not available for extensions.
* No guarantee that the extension will load in Tcl 8.6 too (it will work if no Tcl 8.7-specific API is used in the extension)

# Demo

So, how should an extension for Tcl 8.7 be compiled in a Tcl 9.0 environment? The
only thing to be done is add `-DTCL_MAJOR_VERSION=8` to the `CFLAGS`. Everything
else is exactly the same as compiling for Tcl 9.0.

Example. Let's build 'pkga.dll'. This dll can be compiled
as follows (for 64-bit Windows) for loading it in tclsh90:
<pre>
    x86_64-w64-mingw32-gcc -shared -DUSE_TCL_STUBS=1 -o tcl9pkga.dll unix/dltest/pkga.c -ltclstub
</pre>
Now, compile the same dll for use in Tcl 8.6 or 8.7:
<pre>
    x86_64-w64-mingw32-gcc -shared -DUSE_TCL_STUBS=1 -DTCL_MAJOR_VERSION=8 -o pkga.dll unix/dltest/pkga.c -ltclstub
</pre>

You can try it out:
<pre>
> tclsh90
$ load ./tcl9pkga.dll
$ pkga_eq
wrong # args: should be "pkga_eq string1 string2"
$ exit
> tclsh86
$ load ./pkga.dll
$ pkga_eq
wrong # args: should be "pkga_eq string1 string2"
$ exit
> tclsh90
$ load ./pkga.dll
interpreter uses an incompatible stubs mechanism
$ exit
</pre>

# Implementation

See branch [`tcl8-compat`](https://core.tcl-lang.org/tcl/timeline?r=tcl8-compat)

win/Makefile is adapted such that the 'registry' and 'dde' dll's are compiled
for both Tcl 9.0 and 8.6 (since those 2 dll's fulfill all restrictions mentioned
above). And also unix/dltest/Makefile is adapted such that 'pkga', 'pkgb' and 'pkgc'
also are compiled for both (8.6 and 9.0) environments.

# TEA

For extensions, the TEA files (tcl.m4 and rules.vc) are also extended in order to
make it easier to use this feature. For 'rules.vc' there's the additional `OPTS=tcl8`,
for 'configure' there's the additional `--with-tcl8`. The effect of these options is
that `-DTCL_MAJOR_VERSION=8` is added to the `CFLAGS` and that the shared library name
changes from `libtcl9XXX.so` (`tcl9XXX.dll`) back to `libXXX.so` (`XXX.dll`).

This enhancement is implemented in the [`tcl8-compat`](https://core.tcl-lang.org/tclconfig/timeline?r=tcl8-compat)
branch from the "tclconfig" repository. When this change is merged to trunk, all extensions
can use it by just re-generating the "configure" script. No other changes are necessary.

# Details

The explanation above that the biggest difference between 8.7 and 9.0 is the
`int` vs. `ptrdiff_t` is not the whole story. For example, the functions 
`Tcl_UtfNcmp`, `Tcl_UtfNcasecmp` ('tclDecls.h') and `TclpUtfNcmp2` ('tclIntDecls.h')
have a `unsigned long` parameter in Tcl8.7 which becomes `size_t` in Tcl 9.0. 
On most platforms, `sizeof(unsigned long)` is equal to `sizeof(size_t)`, so there
is no problem, but there is one exception which needs special consideration:
Windows 64-bit (`unsigned long` = 32-bit, `size_t` = 64-bit). This means that
extensions compiled for Tcl 8.7 in a Tcl 9.0 build environment will push
8 bytes on the stack in stead of 4. Since Windows 64 is little-endian, the
last 4 bytes will be 0. Conclusion: we are lucky that Windows 64-bit is
little-endian and that the parameter is the last one: Pushing 4 extra
zero-bytes doesn't hurt at all, everything further works as expected. The
'pkga' demo is changed to use `Tcl_UtfNcmp` in order to prove that it works.

All other differences between Tcl 8.7 and 9.0 are properly handled with
ifdef's, the three mentioned functions were the only 'tricky' ones.

# Packaging Tcl distributions

For example, on Ubuntu, the following Tcl 8.6 distribution packages exists:

    * tcl8.6
    * tcl8.6-dev

When Tcl 8.7 and 9.0 are available, we will see the following new ones:

    * tcl8.7
    * tcl8.7-dev
    * tcl9.0
    * tcl9.0-dev

The runtime packages (all without "-dev") can be installed together, so
whenever doing:
<pre>
sudo apt-get install tcl8.7 tcl9.0
</pre>
This will install both Tcl 8.7 and Tcl 9.0, and everything will run
fine independant.

However, with the "-dev" packages it doesn't work that way. Both
the "tcl8.7-dev" and "tcl9.0-dev" packages contain (among others)
`/usr/include/tcl.h`, so if we install both it's not clear which "tcl.h"
file we have. So, it is impossible to install two different Tcl "-dev"
packages. We have to choose which Tcl version we want to develop for.

This TIP is written to resolve exactly this problem. Since the "tcl9.0-dev"
package contains a `tcl.h` file which works for both Tcl 8.7 and Tcl9.0
development, we can develop extensions for both Tcl 8.7 and Tcl 9.0
with a single "-dev" package. And we can immediately run the
compiled extension in our environment, whether we want to test it with Tcl 8.7 or 9.0.

# Tcl 9.1

Since  this TIP adds `#if TCL_MAJOR_VERSION ...` to 'tcl.h', this will be a
maintenance burden if it's kept too long. Therefore, I propose to remove
this stuff in Tcl 9.1. So, if you want to build and extension for both the
8.x and the 9.x line, you need a 9.0 development environment.

# Addendum

After [TIP #660](660.md) was accepted, a lot of functions changed from
using size\_t to ptrdiff\_t parameters. In order to prevent confusion,
this change has been adapted in the TIP text above as well.

# Compatibility

The proposed change is 100% source and binary compatible with Tcl 9.0,
but it also makes the 'tcl.h' header file and the stub library compatible
with Tcl 8.7.

# Copyright

This document has been placed in the public domain.

Added tip/629.md.







































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
# TIP 629: Add a lseq (formally "range") command to the core of list commands
        Author:        Eric Taylor <[email protected]>
        Author:        Brian Griffin <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Created:       28-06-2022
        Tcl-Version:   8.7
        Tcl-Branch:    tip-629
        Vote-Summary:  Accepted 8/0/0
        Votes-For:     SL, MC, KK, AK, JN, FV, KW, BG
        Votes-Against: none
        Votes-Present: none
-----

# Abstract

This TIP proposes that a new list command, `lseq` (formally
"`range`"), be added to the core. The command would be similar to the
`lrepeat` command, in that it would conveniently produce a list, given
some arguments. The command would take a range of rational numbers and
produce a list. It would be most useful in a foreach loop, but could
have other uses as well, such as when using the `in` or `ni` operators
in an expression or `if` command.

# Rationale and Discussion

Often one wants to iterate on a list of numbers, and the current most
popular choices are using a `foreach` or `for` command. The `for`
command is a throwback to the C `for` statement, and is somewhat ugly
and can be difficult to read. It is also prone to off-by-one errors.

For ease of programming, especially when performance is not that
important, I propose to add to the core a command, `lseq`, which
would provide a utility that is often found in other languages as a
keyword or built-in function. For example, Python permits a range of
numbers to be entered easily and has syntax to iterate over all the
values in a range.

# Proposal

The `lseq` command would take the following forms:


>**lseq** *Start* ?(**..** &#124; **to**)? *End* ??**by**? *Step*?

>**lseq**  *Start* **count** *Count* ??**by**? *Step*?

>**lseq** *Count* ?**by** *Step*?


The "`..`" and the words "`to`", "`count`" and "`by`" would be filler
words to make the command more readable. These are optional, similar
to how the word "`else`" is optional in an "`if`" statement.

If all the numeric values are whole numbers, then the range will
contain only integer values, otherwise values will be floating point
numbers. Numeric values may also be expressed as a valid expr
expression, for example: `{$start+5}`. Normal Tcl quoting rules apply.

The most obvious use might be in a foreach loop. Instead of this to
write the numbers 1 through 10,

    for {set i 1} {$i <= 10} {incr i} {
        puts $i
    }

one could instead write:

    foreach i [lseq 1 .. 10] {
        puts $i
    }

This would likely reduce the possibility of a programming error, where
the programmer used < instead of <=.

It could also be used in an if statement, like so:

    if {$i in [lseq 2 .. 10]} {puts inside} else {puts outside}

The command would understand when to create a list of numbers that are
decreasing, by the "*start*" and "*end*" values or by
using the optional "`by`" and "*step*" arguments.

The "`count`" operator would indicate the desire to create N elements, starting
at some value, with an optional increment (either positive or negative,
with a default of 1).

# Examples

	% lseq 10 .. 1
	-> 10 9 8 7 6 5 4 3 2 1

	% lseq 1 .. 10
	-> 1 2 3 4 5 6 7 8 9 10

	% lseq 10 .. 1 by 2    ;# wrong direction results in empty list
	->

	% lseq 10 .. 1 by -2
    -> 10 8 6 4 2

	% lseq 5.0 to 15.
	-> 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0

	% lseq 5.0 to 25. by 5
	-> 5.0 10.0 15.0 20.0 25.0

	% lseq 25. to 5. by -2.5
	-> 25.0 22.5 20.0 17.5 15.0 12.5 10.0 7.5 5.0

	% lseq 25. to 5. by -5
	-> 25.0 20.0 15.0 10.0 5.0

    % set start 1
    % lseq $start to "$start+9" by 2
	-> 1 3 5 7 9

	% lseq 1 to 10 by -2 ;# wrong direction results in empty list
	->

	% lseq 25. to -25. by -3.25
	-> 25.0 21.75 18.5 15.25 12.0 8.75 5.5 2.25 -1.0 -4.25 -7.5 -10.75 -14.0 -17.25 -20.5 -23.75

	% lseq 5
	-> 0 1 2 3 4

	% lseq 3 count 7
	-> 3 4 5 6 7 8 9

	% lseq 0 count 8 by 2
	-> 0 2 4 6 8 10 12 14

	% lseq 10 0 -1.125
	-> 10.0 8.875 7.75 6.625 5.5 4.375 3.25 2.125 1.0

# Implementation

Each value in the sequence are computed via this equation where *index*
is an integer value 0 through length-1:

	value = start + (step * index)

The length of the list is determined by the *Count* value, or by the
equation:

	length = (end - start + step)/step

In the case where *Step* <= 0, the length will be 0 which means the
result is an empty list.

The following is a pure Tcl prototype of the command. This is
simplified by not including argument processing, a straight forward
operation, but very lengthy.

Prototype to demonstrate the algorithm:

	proc lseq {args} {
		# magic processing $args here
	    processArguments $args ;# result in "start", "end", "step", and "count".

	    if {![info exists count]} {
		    set length [expr {($end-$start+$step)/$step}]
	    } else {
		    set length $count
	    }

	    # Create list
	    set value [list]
	    if {$length > 0} {
		    for {set index 0} {$i<$length} {incr index} {
                lappend value [expr {$start + {$step * $index}}]
			}
        }
        return $value
	}

The complete C implementation is on the fossil branch [tip-629](https://core.tcl-lang.org/tcl/timeline?r=tip-629).

# Compatibility

Adding any command to the core would risk the possibility that some
program might have chosen to write a proc using the new name. However,
for new programs, the programmer would likely accept this limitation.

# Discussion

I have attempted to take all the discussion comments into
consideration. Concerns over inclusion vs exclusion of the "end" value
in the sequence results have been addressed by having the resulting
list contents based on 2 mathematical equations. Knowing these
equations, the user can select parameters easily enough to get the
needed results. Also, by using the straight line equation, error
accumulation with float numbers is eliminated, or at least minimized.

Of all the proposed names for the command, I chose "lseq"
because it is an 'l' command as are all the other List commands. I
also thought that "seq", short for "sequence", would be more
appropriate in the event that new options are proposed for the command
to create sequences of numbers that may not be a linear range,
for example: "lseq -fibonacci 0 to 100".

# Honorable Mention

The implemented algorithm came from
[TIP-225](225.md),
authored by Salvatore Sanfilippo and Miguel Sofer.

# Copyright

This document has been placed in the public domain.

Added tip/630.md.





























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 630: TclOO commands > 2^31 (for 8.7)
        Author:        Jan Nijtmans <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Created:       05-07-2022
        Tcl-Version:   8.7
        Keywords:      Tcl
        Tcl-Branch:    tcloo-64bit
        Vote-Summary   Accepted 3/0/1
        Votes-For:     JN, KBK, KW
        Votes-Against: none
        Votes-Present: FV
-----

# Abstract

This TIP proposes 3 new functions for TclOO:

 * `Tcl_MethodIsType2`
 * `Tcl_NewInstanceMethod2`
 * `Tcl_NewMethod2`

Those functions do the same as `Tcl_MethodIsType`/`Tcl_NewInstanceMethod`/`Tcl_NewMethod`,
but their `typePtr` argument is now of type `const Tcl_MethodType2 *`.
Those new types can handle more than 2^31 command line arguments when used in Tcl 9.0.

Since the Tcl core cannot handle commands with more than
2^31 elements yet, this - for now - is of limited usability: The core should first be
extended to handle this everywhere, which is a massive amount of work. Therefore,
I am choosing to submit this part separately, so it can be used in Tcl 8.7 as well.
A later [TIP #626](626.md) (for Tcl 9.0), which makes the actual transition
making it really useful, can then decided upon separately. Also, if the API is
decided upon, the actual transition could even be delayed until Tcl 9.1: As
long as the API stays the same, it is considered an upwards compatible
change, no matter how it is handled internally.

# Specification

The following new functions are defined:

 * `int Tcl_MethodIsType2(Tcl_Method, const Tcl_MethodType2 *, ClientData *)`
 * `Tcl_Method Tcl_NewInstanceMethod2(Tcl_Interp *, Tcl_Class *, Tcl_Obj *, int, const Tcl_MethodType2 *, ClientData)`
 * `Tcl_Method Tcl_NewMethod2(Tcl_Interp *, Tcl_Class *, Tcl_Obj *, int, const Tcl_MethodType2 *, ClientData)`

The definitions of the new types are:
<pre>
    typedef int (Tcl_MethodCallProc2)(void \*clientData, Tcl_Interp \*interp,
           Tcl_ObjectContext objectContext, Tcl_Size objc, Tcl_Obj \*const \*objv);
    typedef struct {
        int version;               /* Structure version field. Always to be equal
                                    * to TCL_OO_METHOD_VERSION_2 in
                                    * declarations. \*/
        const char \*name;          /\* Name of this type of method, mostly for
                                    * debugging purposes. \*/
        Tcl_MethodCallProc2 \*callProc;
                                   /\* How to invoke this method. \*/
        Tcl_MethodDeleteProc \*deleteProc;
                                   /* How to delete this method's type-specific
                                    * data, or NULL if the type-specific data
                                    * does not need deleting. \*/
        Tcl_CloneProc \*cloneProc;  /\* How to copy this method's type-specific
                                    * data, or NULL if the type-specific data can
                                    * be copied directly. \*/
    } Tcl_MethodType2;
</pre>
Note that the `objc` argument (Tcl_MethodCallProc2) changed from `int` to `Tcl_Size`.
and the `callProc` field (Tcl_MethodType2) changed from `Tcl_MethodCallProc *` to `Tcl_MethodCallProc2 *`.

Two new constants are defined:

 * TCL_OO_METHOD_VERSION_1  (same as TCL_OO_METHOD_VERSION_CURRENT), to be used in `Tcl_MethodType`
 * TCL_OO_METHOD_VERSION_2, to be used in `Tcl_MethodType2`

# Addendum

After [TIP #665](665.md) was accepted, a lot of functions changed from
using size\_t to Tcl\_Size parameters. In order to prevent confusion,
this change has been adapted in the TIP text above as well.

# Implementation

See branch [`tcloo-64bit`](https://core.tcl-lang.org/tcl/timeline?r=tcloo-64bit)

There also is a [`tcloo-64bit`](https://core.tcl-lang.org/itcl/timeline?r=tcloo-64bit) branch
for Itcl, which demonstrates this TIP (and [TIP #627](627.md) too).

# Compatibility

The proposed change is 100% source and binary compatible with Tcl 8.6.

# Copyright

This document has been placed in the public domain.

Added tip/631.md.





































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 631: ledit - a generalized insert/delete command for list variables
	Author:		Ashok P. Nadkarni <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	6-Aug-2022
	Tcl-Version:	8.7
	Tcl-Branch:	tip-631
	Keywords:	list
	Vote-Summary:	Accepted 6/0/0
	Votes-For:	BG, KW, KK, MC, SL, FV
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

Add a command to efficiently delete and insert multiple elements in
list values stored in variables.

# Rationale

Tcl provides commands `lappend`, `lpop` and `lset` to efficiently operate on
unshared list values stored in variables. The efficiency of these commands is a
result of its operating on variables containing unshared values which can then
be modified in place, generally without needing reallocation or copying
as extra trailing free space is present in the list internal representation.

There is however no equivalent for the `lreplace` command which operates on list
values and subsumes several different insert/delete/replace functions. The TIP
625 implementation also allows for leading free space and subranges in the
internal representation. This opens the door for more efficient operation in
several situations and hence the motivation for this TIP.

# Specification

The `ledit` command has the following syntax:

	ledit listVar first last ?element element ...?

The command fetches the list value in variable `listVar` and replaces the
elements in the range given by indices *first* to *last* (inclusive) with the
*element* arguments. The resulting value is then stored back in the `listVar`
variable. The indices follow the standard Tcl index format supporting simple
index arithmetic and indices relative to the end using the `end` keyword.

Some special cases are:

* If either *first* or *last* is negative, it is considered to refer to the
position before the first element of the list.

* If either *first* or *last* is greater than the length of the list, it
indicates the position just after the last element of the list.

* If *last* is less than *first*, no elements are deleted and the *element*
arguments are inserted in front of the element at *first*.

* If no *element* arguments are specified, the command only deletes elements.

* An error is raised if the value in `listVar` does not exist (as in `lset`) or
cannot be interpreted as a list.

# Discussion

The command subsumes "lprepend" (`lappend` analogue for front insertions) or
"linject" (`linsert` analogue for variables) though they would be a little more
intuitive to use.

## Name conflicts

As a data point, this name is not found in the entire magicsplat
distribution with source for over a hundred packages and extensions.

Concerns were voiced on the chat that `ledit` is easily confused with `subst`.
The name `lupdate` was suggested though one might argue that can be confused
with `update`.

The author has no particular objection to choosing a different name.

# Copyright

This document has been placed in the public domain.

Added tip/632.md.





























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 632: return gif animated metadata
	Author:		Harald Oehlmann <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	12-Aug-2022
	Tcl-Version:	8.7
    Vote:	Done
    Vote-Summary:   Accepted 6/0/0
	Votes-For:      MC, BG, SL, JN, FV, KW 
	Votes-Against:  none
	Votes-Present:  none
	Tk-Ticket:	f285ddcd23
	Tk-Branch:	rfe-f285ddcd-animated-gif-metadata
	Keywords:	tk image
-----

# Abstract

Return the animation parameters of an animated GIF within the image metadata.

# Rationale

Tk provides the possibility to get one image of an animated image sequence as follows:

    $image configure -format "gif -index $index"

Nevertheless, the parameters for animated gif display are not returned.
This TIP proposes to return those parameters to be able to display the animated gif with the help of TCL code.

Please refer to this stack overflow question and answer: <https://stackoverflow.com/questions/72486189/tcl-tk-animated-gif-not-decoded-correctly>

# Specification

If the gif file indexed image is loaded to a tcl image, the following metadata keys are set if the relevant data is present:

 * *delay time*: returns the delay time in unit "10ms". This is only present, if delay time is given and greater 0.
 * *disposal method*: one of *do not dispose*, *restore to background color*, *restore to previous*. This key is not present if no disposal method specified.
 * *user interaction*: value *1*, if specified as required. This key is not present, if no user interaction required.
 * *update region*: 4 numbers in pixel unit: *X0*, *Y0*, *width*, *height*. This is only given, if the update box is not identical to the whole image.

The key and value names are taken from the GIF89a standard document.

# Example

The example solution given in the stack overflow ticket by Schelte Bron may be modified as follows:

```TCL
proc nextFrame {image {index 0}} {
    if {[catch {tmpimg configure -format "gif -index $index"} stderr]} {
        set nextIndex 0
        set time 1
    } else {
        set nextIndex [expr {$index + 1}]
        set metadata [tmpimg cget -metadata]
        if {    [dict exists $metadata "disposal method"]
                && [dict get $metadata "disposal method"] eq "do not dispose"
        } {
            $image copy tmpimg -compositingrule overlay
        } else {
            $image copy tmpimg -compositingrule set
        }
        if {[dict exists $metadata "delay time"]} {
            set time [expr {[dict get $metadata "delay time"]*10}]
        } else {
            set time 1
        }
    }
    after $time nextFrame $image $nextIndex
}

set img [image create photo -file [file join $dir animated.gif]]
# Create a helper image
image create photo tmpimg -file [$img cget -file]

label .w -image $img
pack .w

nextFrame $img
```

Now, the values for *delay time* and *disposal mehtod* (partly) are used instead of heuristic values.

# Implementation

The implementation is available in the given Tk branch.

# Discussion

Discussion took place at the RFE Tk ticket: <https://core.tcl-lang.org/tk/tktview?name=f285ddcd23>.

# Copyright

This document has been placed in the public domain.

Added tip/633.md.













































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 633: configure channel about channel encoding error reporting mode
	Author:		Harald Oehlmann <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	12-Aug-2022
	Tcl-Version:	8.7
	Tcl-Branch:	tip633-tcl9-fconfigure-strictencoding
	Keywords:	channel encoding
	Vote-Summary   Accepted 4/0/1
	Votes-For:     JN, KW, MC, SL
	Votes-Against: none
	Votes-Present: FV
-----

# Abstract

Allow to switch between channels in respect of data encoding issues to throw an error or recover by data manipulation.

# Rationale

In channel data read or write, encoding errors may arise.
There are two ways to handle encoding errors:

   *   Throw an error on the corresponding commands
   *   Modify the data to continue without error.

TCL until version 8.7 modified the data and did not throw any error.
TCL starting from version 9 will throw an error on encoding issues.

Both points have their use-cases.
The purpose of this TIP is to be able to switch between the possibilies.

This is in accordance with the changes of the *encoding convertto/from* extension by [TIP 601](https://core.tcl-lang.org/tips/doc/trunk/tip/601.md).
TIP 601 added an option *-nocomplain* to activate data modification mode.


## Error types

There are 3 types of possible errors, exercised in tests io-75.1 to io-75.6:

### Invalid multi byte sequence read

The example is to use an UTF-8 byte "0xC0" which announces a multi-byte sequence and requires a following byte > "0x80".
Test 75.1/75.6 uses the invalid sequence "\\xC0\\x40".
It is written in a file and read with utf-8 encoding.

When modified data mode is active (*-nocomplain*), the data is returned as byte data "\\xC0\\x40" (test 75.1).
When error throwing mode (default mode) is active, an error is thrown (test 75.6).

Test 75.4 and 75.9 also exercises this case with shiftjis encoding.

## Unrepresentable character write

A character unrepresentable by the current encoding is written to a file.
The example in test io-75.2/75.7 is to write "\\u2022" to an iso8859-1 encoded channel, which does not allow any unicode points above 0x255.

When modified data mode is active (*-nocomplain*), a question mark (*?*) is written.
When error throwing mode (default mode) is active, an error is thrown (test 75.7).

## Incomplete multi byte sequence read

The example is to use an UTF-8 byte "0xC0" which announces a multi byte sequence as last character.
Test 75.3/86.8 uses the sequence "\xC0" at file end and reads it with utf-8 encoding.

Tolerant encoding returns returns this data as byte data "\xC0".
Strict encoding should cause an error.
When modified data mode is active (*-nocomplain*), the data as byte data "\xC0" is returned.
When error throwing mode (default mode) is active, an error is thrown (test 75.8).

Test 75.5 and 75.10 also exercises this case with shiftjis encoding.

# Specification

Extend the channel configuration command *fconfigure* by the following item: *-nocomplaincoding bool*.
Bool is a boolean value which stands for *throw error mode* for value 0 and *modify data mode* for value 1.

The default value is "1" for TCL 8.7 and "0" for TCL 9.0.

The option is added to TCL 8.7 and TCL 9.0.
In TCL 8.7, it is an error to set the value to *false*.

# Example

    fconfigure $handle -encoding utf8 -nocomplainencoding 1

# Implementation

Implementations started for the two branches:

   *  TCL 8.7: [tip633-fconfigure-tolerantencoding](https://core.tcl-lang.org/tcl/timeline?r=tip633-fconfigure-tolerantencoding&c=2022-08-18+20%3A20%3A10)
   *   TCL 9.0: [tip633-tcl9-fconfigure-strictencoding](https://core.tcl-lang.org/tcl/timeline?r=tip633-tcl9-fconfigure-strictencoding&c=2022-09-11+08%3A24%3A21)

# Discussion

Discussion took place at the Vienna TCL meeting and at the August TCL conference call.
Four TCL wizards expressed the necessity of this functionality in those meetings.

The name "-nocomplainencoding" is taken from the *-nocomplain* option of *encoding convertfrom/to*.

## Alternate script-only solution

Jan wrote on the core list 2022-09-15 "Re:TIP#346 utf8-strict":

> Well, there is another way to get the 8.x behavior back in Tcl 9.0.

> Suppose we have a channel $f from which the byte \\x80 is available. Consider the following code:

>          fconfigure $f -encoding ascii
>          read $f

> this will result in '?' on Tcl 8.x, it will throw an exception in Tcl 9.0 using your proposal:

>           fconfigure $f -nocomplainencoding 0 -encoding ascii
>           read $f

> But there's another way, which already works now:

>           fconfigure $f -encoding binary
>           encoding convertfrom -nocomplain ascii [read $f]

> So, instead of adding "-nocomplainencoding" to the channel, just set the channel in binary mode and use the "-nocomplain" option from "encoding convertfrom".
> There is little added value, building "-nocomplainencoding" into the channel code, when there is an alternative.

(end of quote).

This is totally valuable.
But the TIP also has the value of symetry and ease of understanding to the script programmer.
And there are other use-cases like the fcopy command, where there is no easy replacement.
And there might be advantages in stacked channels, pipes or whatever application of the channel system.
IMHO, the TCT may decide, if this TIP should be implemented.

Ashok added the following remark by the core list on 2022-09-16:

> This might be fine when reading the entire channel content but is not convenient in streaming mode.

> A minor nit - something like -looseencoding might be a better name for -nocomplainencoding.

## TIP 346: Error on Failed String Encodings

[TIP 346](https://core.tcl-lang.org/tips/doc/trunk/tip/346.md) by Alexandre Ferrieux is (in its current modified form) independent on this TIP.

TIP 346 defines a strict mode, if some compatibility cases are treated as encoding errors or not.
This TIP tells what happens to encoding errors, a) error reporting or data modification.
I suppose, that TIP 346 strict mode does not make any sense in combination with no error reporting.
The strict mode is more a tool what may evolve in future.

# Copyright

This document has been placed in the public domain.

Added tip/634.md.



































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 634: Remove inconsistency in variable tracing of an array
	Author:		Schelte Bron <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	21-Aug-2022
	Tcl-Version:	9.0
	Tcl-Branch:	tip-634
	Keywords:	upvar,trace,array
	Vote-Results:   4/0/0 accepted
	Votes-For:      FV, KW, JN, SL
	Votes-Against:  none
	Votes-Present:  none
-----
# Abstract

This tip proposes to eliminate the "feature" that a variable trace set on an
array does not trigger when elements of the array are accessed through a
reference created via the \[upvar\] command.

# Rationale

Currently, when a link to an array element has been created using [upvar],
any variable traces set on the array as a whole will not be triggered when
the array element is accessed through the link. While this is documented in
the [upvar] manual page, it is not logical. Variable traces are generally
installed to be notified about access to a variable. If not all normal
methods to access the variable will trigger the trace, the feature cannot
really be relied upon.

# History

The reason for the current behavior seems to be that array elements have no
knowledge to which array they belong. Adding this information to each
element would have a significant memory impact. For this reason, the
decision was apparently made in the past to document the discrepancy, rather
than to fix it. This turned a bug into a feature, preventing it to be fixed
in a point load.

# Specification

Each array element has a pointer to the array's backing hashtable. Adding a
link that points to the parent array in this table will only require one
additional pointer per array. This can hopefully be considered an acceptable
expense.

With part 1 of the proposed change, a subsequent problem shows up: When the
accessed variable is a scalar, that is an alias for an array element, only
the name of the alias would currently be provided to the callback function.
In most scenarios with traces on an entire array, the callback function will
need to know the actual array element that was accessed to be able to do
something useful.

This problem is overcome by decoupling the 'name1' and 'name2' arguments
added to the callback. As before, 'name1' will still point to the variable
being accessed. But 'name2' provides the index into the array, if the
accessed variable ultimately refers to an array element.
The only noticeable difference happens in the mentioned scenario: 'name1' is
a scalar that refers to an array element. In that case 'name2' will no
longer be an empty string. Instead it provides valuable additional
information.

# Background

It is not possible to make an alias for an array index. If 'name1' refers to
an array, the index into that array has to be the same as the index into the
original array. It doesn't matter to which array the trace proc applies the
'name2' argument.

The trace proc should not attempt to determine whether 'name1' is an array
by checking if 'name2' is empty. But that was never a good strategy; the
empty string is a valid array index. The proper way has always been to use
\[array exists\]

# Reference Implementation

See branch [`tip-634`](https://core.tcl-lang.org/tcl/timeline?r=tip-634)

# Copyright

This document has been placed in the public domain.

Added tip/635.md.



































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 635: Introspection for 'upvar' and 'namespace upvar'
	Author:		Schelte Bron <[email protected]>
	State:		Withdrawn
	Type:		Project
	Vote:		Pending
	Created:	26-Aug-2022
	Tcl-Version:	9.0
	Tcl-Branch:	tip-635
	Keywords:	upvar,namespace upvar
-----
# Abstract

This tip proposes to provide script-level access to the way variables are
linked together via 'upvar' and 'namespace upvar'.

_Note: This TIP depends on functionality introduced by TIP 634, which is why
it cannot target Tcl 8.7._

# Rationale

The 'upvar' and 'namespace upvar' commands allow variables to be accessed
using different names.
In some circumstances it may be useful to be able to inquire about the
mapping of a variable alias to the original name. This is especially
relevant in callback handlers for variable traces on an entire array, after
TIP #634 gets implemented.

# Specification

A new info subcommand, 'info upvar' is implemented. It takes one argument:
The name of a scalar variable or array (array elements can't be an alias).
The command returns a list of variable length, depending on the situation:

* Empty list: The name is not a link to another variable.
* Two-element list: The name is a link to another scalar variable or array.
* Three-element list: The name is a link to an array element.

The array elements, if present, have the following meaning:

0. level: The absolute stack level of the target variable
1. target: The target scalar variable or array of the upvar
2. element: The subscript within the array of a target array element

If the name is not a scalar variable or array, the command throws an error.

If the target of the link is a namespace variable, the fully qualified name
of that variable is reported.

The resulting target may itself again be an alias. The command can be
invoked repeatedly until an empty list is returned to get the real variable.

    set rc [info upvar $name]
    while {[llength $rc]} {
        if {[llength $rc] > 2} {
            lassign $rc level target element
        } else {
            lassign $rc level target
        }
        set rc [uplevel #$level [list info upvar $target]]
    }

# Considerations

This TIP was supposed to address an issue that arrose after part 1 of TIP
634 would be implemented. However, after further thought, it seems the issue
can be solved more elegantly by an amendment to TIP 634. If TIP 634 is
accepted with the amendment, this TIP becomes effectively obsolete.

# Reference Implementation

See branch [`tip-635`](https://core.tcl-lang.org/tcl/timeline?r=tip-635)

# Withdrawal

The amendment to TIP 634 to always report the array index in the 'name2'
argument for any variable that ultimately refers to an array element has
made this TIP largely obsolete. For that reason, I withdraw this TIP.

# Copyright

This document has been placed in the public domain.

Added tip/636.md.





















































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
# TIP 636: Expand List Flexibility with Abstract List Tcl_Obj Type
	Author:         Brian Griffin <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Votes-Summary:  4/0/0
    Votes-For:      SL, DF, KW, BG
	Votes-Against:  none
	Votes-Present:  none
	Created:        1-Sep-2022
	Tcl-Version:    9.0
    Tcl-Branch:     tip-636-tcl9-644

-----
<!-- TOC BEGIN (auto generated with tiptoc) -->
* <a href='#Abstract'>Abstract</a>
* <a href='#Rationale'>Rationale</a>
* <a href='#Specification'>Specification</a>
* <a href='#ImplementationNoteOnTheTcl_ObjTypestruct'>Implementation Note On The Tcl_ObjType struct</a>
* <a href='#IncompatibleChanges'>Incompatible Changes</a>
* <a href='#RequirementsandCaveats'>Requirements and Caveats</a>
* <a href='#Examples'>Examples</a>
    * <a href='#OtherexamplesofpossibleAbstractLists'>Other examples of possible Abstract Lists</a>
* <a href='#Implementation'>Implementation</a>
* <a href='#Impact'>Impact</a>
* <a href='#Alternatives'>Alternatives</a>
* <a href='#Acknowledgment'>Acknowledgment</a>

<!-- TOC END -->

# <a id='Abstract'></a>Abstract

Extend Tcl\_ObjType to support native List
operation on non-List value types. Functions provided by a custom
ObjType will be use in place of the internal List operation, avoiding
runtime ObjType conversion.

# <a id='Rationale'></a>Rationale

The most frustrating part of implementing custom Tcl\_Obj types is
that they will be converted to a built-in Tcl type when performing
typical Tcl operations on the value. This removes the advantages of
having a custom type since the custom extension will have first
convert the value back to its original form before it can be
used. (This is referred to as "shimmering") The reason for having a
custom type is usually due to either computational advantage, space
advantage, or both. Maintaining this advantage is a worthy
goal. Having access to built-in Tcl list operations makes the custom
type even more worthwhile.


# <a id='Specification'></a>Specification

The Tcl\_Obj type will be extended by adding functions that implement
List operations on the given value.  The functions mimic the List
command behaviors without changing the Obj Type representation. By
providing these functions, some or all of the script level List
operations, such as `lindex`, `llength`, and `foreach`, would be
supported for a custom type without causing the obj value to shimmer
to the List type.

Here is a simple example of how this works. A simple scalar value,
like a double numeric has an internal representation of
"double". However, if the value is passed to `[llength]` command, the
type will change to a List type:

        % set n [expr {15.3}]
        15.3
        % representation $n
        value is a double with a refcount of 2, object pointer at
        0x7fa3b512adc0, internal representation 0x402e99999999999a:0x0,
        string representation "15.3"

        % llength $n
        1
        % representation $n
        value is a list with a refcount of 2, object pointer at
        0x7fa3b512adc0, internal representation 0x7fa3b5864a50:0x0, string
        representation "15.3"

If the "double" type adds a _lengthProc_ function to the type definition, then the
`[llength]` command will correctly return "1" without having to
shimmer the value to a "list".

This Tcl\_ObjType is extended with slots for the following function
pointers:

        /* Abstract List functions */
        Tcl_Size    (*lengthProc)(obj)
        int         (*indexProc)(interp, obj, index, elemObjPtr)
        int         (*sliceProc)(interp, obj, from, to, newObjPtr)
        int         (*reverseProc)(interp, obj, newObjPtr)
        int         (*getElementsProc)(interp, obj, start, count, objcPtr, objvPtr)
        int         (*replaceProc)(interp, obj, first, numToDelete, numToInsert, insertObjs)
        Tcl_Obj*    (*setElementProc)(interp, listPtr, indicies, valueObj)


These functions are optional and when absent, the List operation will
revert to the base List operation behavior. For example, if the
_reverseProc_ is NULL, the `[lreverse]` operation will first shimmer
the value to a List, then perform the operation.

The _lengthProc_ is necessary if any other List function is also
provided. The _indexProc_ function is also used in some fallback
operations.

Hopefully the definition of each of these functions is clear by their
respective names.

# <a id='ImplementationNoteOnTheTcl_ObjTypestruct'></a>Implementation Note On The Tcl_ObjType struct

TIP-644 added a version field to the `Tcl_ObjType` structure to allow
for extending the struct with new features. The implementation of
Abstract Lists makes use of this with the intent of making the interface
as simple to use and maintain as possible, both internally and
externally. The version field is defined as Tcl_Size which will be a
monotonically increasing integer, starting at 0, for each future
definition change.

The Seven function pointers added to the Tcl_ObjType give custom types
control over the set of script and C API level List operations. Macros
are provided for ease of use and backward compatibility.  Existing
custom ObjTypes can use the 'TCL_OBJTYPE_V0' macro for existing (pre 9.0)
definitions. Any type that is not intended to be treated as a list,
and wants to prevent converting to a list, e.g. Tcl_WideInt, can use the
'TCL_OBJTYPE_V1(a)' macro and provide an lengthProc that always returns
1. An Abstract List implementation uses the 'TCL_OBJTYPE_V2(...)' macro, and
defines at least 2 of the complete set of functions.

# <a id='IncompatibleChanges'></a>Incompatible Changes

One outcome of Abstract Lists is that an abstraction is no longer
required to retain a copy of a list element `Tcl_Obj`. This is a
significant change in that the current List type always retains a copy
of a list element `Tcl_Obj`, and consequently, most all calls to
retrieve an element fail to manage the reference count of the `Tcl_Obj`,
implicitly relying on the List to manage it. An abstract list, on the
other hand, can generate elements on-the-fly, and may not need to retain
the `Tcl_Obj`. This leaves the responsibility of `Tcl_Obj` memory
management up to the caller. To be fair, this is always the case for
reference counted managed memory.

Extensions for Tcl and applications that embed Tcl, will need to check
and add appropriate RefCount management to the implementation if
necessary. This has been done for the Tcl core tip branch.

Here is an example of a code snippet that illustrates the problem (randomly
chosen from the tcl core.) Take note of the treatment of `itemObj` below:

        Tcl_ListObjLength(NULL, zshPtr->outData, &listLen);
        if (count < 0) {
            count = 0;
            for (i=0; i<listLen; i++) {
                Tcl_ListObjIndex(NULL, zshPtr->outData, i, &itemObj);
                (void) Tcl_GetByteArrayFromObj(itemObj, &itemLen);
                if (i == 0) {
                    count += itemLen - zshPtr->outPos;
                } else {
                    count += itemLen;
                }
            }
        }

The above code inspects `itemObj`, but never checks or modifies the
refCount. This is ok for Lists prior to this TIP. For Abstract Lists,
`itemObj` could be newly created and have a refCount of 0. Completely safe
code should traditionally be written as:

        Tcl_ListObjLength(NULL, zshPtr->outData, &listLen);
        if (count < 0) {
            count = 0;
            for (i=0; i<listLen; i++) {
                Tcl_ListObjIndex(NULL, zshPtr->outData, i, &itemObj);

                Tcl_IncrRefCount(itemObj);

                (void) Tcl_GetByteArrayFromObj(itemObj, &itemLen);
                if (i == 0) {
                    count += itemLen - zshPtr->outPos;
                } else {
                    count += itemLen;
                }

                Tcl_DecrRefCount(itemObj);

            }
        }

For a traditional List, these 2 additional calls will not effect the
results. For an abstract list, a new Obj will be appropriately free'd.

The Incr/Decr calls in this example introduce an inefficiency that
justified making an implied assumption about List elements. Since
Abstract Lists changes the basis of this assumption, a different
approach to improve efficiency is needed. In these cases, deferring
reference count updates can be employed. It is for this reason that as
part of the Abstract List implementation, a new refCount function has
been added for this scenario:

        Tcl_BumpObj(objPtr)

It would be used like this:

        Tcl_ListObjLength(NULL, zshPtr->outData, &listLen);
            if (count < 0) {
            count = 0;
            for (i=0; i<listLen; i++) {
                Tcl_ListObjIndex(NULL, zshPtr->outData, i, &itemObj);
                (void) Tcl_GetByteArrayFromObj(itemObj, &itemLen);
                if (i == 0) {
                    count += itemLen - zshPtr->outPos;
                } else {
                    count += itemLen;
                }

                Tcl_BumpObj(itemObj); // Deferred refCount update

            }
        }

This function effectively executes:

        Tcl_IncrRefCount(objPtr);
        Tcl_DecrRefCount(objPtr);

But actually implemented as:

        if (objPtr) {
            if ((objPtr)->refCount == 0) {
                Tcl_DecrRefCount(objPtr);
            }
        }

For more information on List associated refCount issues, see related
[TIP-192](192.md).

And there is this _rabbit hole_: [minimizing reference count updates](https://dl.acm.org/doi/pdf/10.1145/185009.185016)
.

# <a id='RequirementsandCaveats'></a>Requirements and Caveats

In all cases, the string representation for an Abstract List value
must always be a valid List as defined by the Tcl language syntax and
the `[list]` command. An Abstract List will always successfully
"*SetListFromAny*" to a List type, memory limits aside.  It is not,
however, a requirement that a string representation of a list be
recognized by a particular Abstract List Type; there are some cases
where this is not reasonably possible.  For example, the ArithSeries,
used in the `lseq` command, has only `start`, `step`, and `count`
stored in the internal representation and uses math to compute indexed
values.  Taking a list of number and computing the start, step, and
count and then validate, although possible, may not be worth the
effort if vary large lists are involved.

# <a id='Examples'></a>Examples

An existing example of this concept is the new **lseq** command
([TIP-629](629.md)), which implements a custom
ArithSeries type that contains 4 values that represent a list. The
length and index values are computed on demand based on 3 of the 4
numeric values by simple arithmetic. It does not compute and fill a
complete list up front. Shimmering is thus prevented in many
cases. See branch
[tip-636-tcl9](https://core.tcl-lang.org/tcl/timeline?r=tip-636-tcl9) which
(re)implements the ArithSeries using AbstractLists. Branch
[tip-636-tcl9-644](https://core.tcl-lang.org/tcl/timeline?r=tip-636-tcl9-644)
implements the in-core approach.

## <a id='OtherexamplesofpossibleAbstractLists'></a>Other examples of possible Abstract Lists

It turns out that `[foreach]` command already implements special
treatment for the **dict** type in order to avoid shimmering of a
**dict** type value to a **list** type. It would be possible to avoid
many, if not all, **dict** to **list** shimmering by using the
Abstract List approach.

Other suggested examples:

- matrix values (there are several existing implementations)
  - VecTcl has been ported to an AbstractList. See
    [VecTcl9](https://github.com/bgriffinfortytwo/VecTcl9/tree/abstractlist) on GitHub.
- There are a number of simple examples in
  [abstractlist-toys](https://github.com/bgriffinfortytwo/abstractlist-toys)
  on GitHub:
  - lstring: each character is treated as a list element.
  - polynomial equations: `[lpoly 5 2 -3] -> y=c0*x^0+c1*x^1+c2*x^2`..., where `c0=5`,
`c1=2`, `c3=-3`, ...
  - readlines: reads in a file and splits into lines.
  - lgen: see [TIP-192](192.md) Although this example works in most
    cases, there is an issue with in-line string use of `[lgen]` that
    I have not yet tracked down.
- bit-field arrays
- ByteArray
- Typed List: all elements of the list are the same type,
  e.g. `linteger`, all elements are integers, with storage optimized
  for integers. The `lstring` example above is also an example of a
  Typed List.
- database: `foreach row [lselect $db {FROM * WHERE name LIKE "Griffin"}]` ...

# <a id='Implementation'></a>Implementation

See branch
[tip-636-tcl9-644](https://core.tcl-lang.org/tcl/timeline?r=tip-636-tcl9-644)

# <a id='Impact'></a>Impact

On entry to the various list operations, both in the command
implementation and in the bytecode engine, an initial test is made to
see if the Obj is an AbstractList.  A test is already made to see if
the Obj is a List before calling SetListFromAny. The impact should be
minimal.  Note also that a similar test already exists in some limited
cases for the Dict type.

It is conceivable that the traditional List implementation be
(re)implemented as an AbstractList as well, then the additional
overhead is simplified.

# <a id='Alternatives'></a>Alternatives

There is an "internal only" (partial) implementation on branch, and main (currently)
[internal-abstract-list](https://core.tcl-lang.org/tcl/timeline?r=internal-abstract-list)

There is also a work-in-progress with a variation of abstract lists
(or abstract types?) at [pyk-objinterface](https://core.tcl-lang.org/tcl/timeline?r=pyk-objinterface).

# <a id='Acknowledgment'></a>Acknowledgment

*Note: this is work that germinated from [TIP-225](225.md).  Salvatore
Sanfilippo and Miguel Sofer should be recognized for their
contribution.*

Added tip/637.md.





















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 637: Make [glob] always -nocomplain
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        17-Sep-2022
	Tcl-Version:    9.0
	Tcl-Branch:	novem
        Vote-Summary:   Accepted 6/0/0
        Votes-For:      DP, JN, SL, FV, KK, KW
        Votes-Against:  none
        Votes-Present:  none
-----

# Abstract

This TIP proposes revising the behavior of [glob] to return an
empty list without error when no matches are found.

# Background

When [glob] finds zero matching files, it raises an error.

	% glob noSuchFile
	no files matched glob pattern "noSuchFile"

This is unfortunate because when using [glob], finding zero matches
is no more an indication of error than finding one or finding 42.  Using
[catch] to deal with this misfeature was an annoying burden, and in the
days before [try] and a strong deployment of **--errorcode** values, it
was burdensome to distinguish the caught circumstance of zero matches
from true error conditions like a file system failure, or a syntax error
in argument substitution.

The **-nocomplain** option was added to [glob] long ago.  It was in place
at least by Tcl 8.0.  When present, this option disables the treatment of
any empty result as an error.

	% glob -nocomplain noSuchFile
	%

With this option, the [glob] command could be used more effectively and
robustly.

In hindsight, [glob -nocomplain] is the better primitive, and should have
been the original behavior of the command.  For a new major release, [glob]
can become what it should have been in the first place.

# Specification

Revise [glob] so that it does not raise an error when no matches are found.

Keep accepting **-nocomplain** as an option, but it has no effect.

# Compatibility

The only compatibility issue is with any programmer who wants [glob]
to raise an error when no matches are found.  It is believed this will
be a very uncommon desire.

Such a programmer can create a proc to post-process an empty list
returned by [glob] into an error.  Tcl namespaces then allow the programmer
to favor his proc over the built-in command, or even to replace the built-in
with it when circumstances make that sensible.

# Reference Implementation

This change has long been implemented in the
[novem](https://core.tcl-lang.org/tcl/timeline?t=novem)
branch, and should not be difficult to extract and apply.

# Copyright

This document has been placed in the public domain.

Added tip/638.md.











































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 638: New public routines Tcl_GetNumber(FromObj)
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        18-Sep-2022
	Tcl-Version:    8.7
	Tcl-Branch:	tip-getnumber
        Vote-Summary:   Accepted 6/0/0
        Votes-For:      DP, JN, SL, FV, KK, KW
        Votes-Against:  none
        Votes-Present:  none
-----

# Abstract

This TIP proposes new public routines **Tcl\_GetNumber**
and **Tcl\_GetNumberFromObj**.

# Background

Development of Tcl 8.5 included major reworkings of Tcl's handling
of numeric values, including TIPs [[237]](237.md), [[249]](249.md),
and more.  One routine that arose out of that development work was
the internal routine,

 > int **TclGetNumberFromObj**\(Tcl\_Interp\* _interp_,  Tcl\_Obj\* _objPtr_\, ClientData\* _clientDataPtr_, int\* _typePtr_) .

It is a utility routine that can pull any numeric value from a Tcl value,
following Tcl's own specifications for numeric formats.  It is useful when
a caller wants to accept multiple varieties of numeric values, so that a more
specific routine like **Tcl\_GetDoubleFromObj** is not sufficient.  It is
used effectively in many places within Tcl's own implementation.  It has
potential value for extensions and applications as well.

An examination of the Tk source code and other extensions reveals that
when they break the encapsulation of Tcl's built-in Tcl_ObjTypes, it
is often for the purpose of gaining access to numeric values.  A supported
public routine to achieve that aim will pave the way to eliminate
encapsulation breaking.

# Specification

Convert the exising internal routine **TclGetNumberFromObj** into its
public counterpart **Tcl\_GetNumberFromObj**.

Create the additional public routine,

 > int **Tcl\_GetNumber**\(Tcl\_Interp\* _interp_,  const char \* _bytes_, ptrdiff\_t _numBytes_, ClientData\* _clientDataPtr_, int\* _typePtr_) 

which has the same functionality, but presents the value to be examined
as a counted string (_bytes_, _numBytes_) instead of as _objPtr_.  This
alternative form is parallel to the alternative forms of routines like
**Tcl\_GetDouble** and **Tcl\_GetDoubleFromObj**.

# Usage

When internal routine **TclParseNumber** successfully parses a numeric
value, it stores the result in one of three forms of storage.  It can
be stored as a double, as a Tcl_WideInt, or as an mp_int.  The proposed
routines use integer values to represent these possibilities,
**TCL\_NUMBER\_DOUBLE**, **TCL\_NUMBER\_INT**, and **TCL\_NUMBER\_BIG**,
respectively.  The routines use an additional integer value,
**TCL\_NUMBER\_NAN** when the value is NaN stored in a double.  This
case is helpful because **Tcl\_GetDoubleFromObj** is defined to raise
an error on a NaN value.

The proposed routines examine the presented value, whether as
an _objPtr_ or as a counted string, to determine whether it matches
one of the numeric formats recognized by Tcl.  This recognition might have
already taken place and been recorded in the internal representation
of _objPtr_, or it might be discovered via a call to **TclParseNumber**.
If the presented value is not a numeric value at all, the proposed
routines return **TCL\_ERROR** and when _interp_ is not **NULL**, a
suitable error message and error code are recorded in it.

When the presented value is recognized as a numeric value, the proposed
routines return **TCL\_OK** and write to \*_typePtr_ the **TCL\_NUMBER\_\***
integer value indicating what kind of storage holds the value.  They also
write to \*_clientDataPtr_ a pointer to that storage in the memory managed
by and belonging to Tcl.  The caller can then use the value
of \*_typePtr_ to determine how to cast the pointer in \*_clientDataPtr_
properly to be able to read the stored value.

The pointer value recovered by the caller of **Tcl\_GetNumber** points
to memory belonging to Tcl, which may free it or overwrite it.  The caller
should read the value from this pointer before any more calls into Tcl
routines in the same thread.  Any long term need for this value will
require a copy.

# Compatibility

These are new public routines.  They should create no compatibility issues.

# Extensibility

If Tcl ever expands the set of numeric formats it recognizes in some way
that requires a new category of storage, these routines may be expanded
to return additional integer values indicating the new storage options.
Callers may wish to handle unrecognized type values as preparation for
that possibility.

# Addendum

After [TIP #660](660.md) was accepted, a lot of functions changed from
using size\_t to ptrdiff\_t parameters. In order to prevent confusion,
this change has been adapted in the TIP text above as well.

# Reference Implementation

Under development on the
[tip-getnumber](https://core.tcl-lang.org/tcl/timeline?t=tip-getnumber)
branch.

# Copyright

This document has been placed in the public domain.

Added tip/639.md.































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 639: Include the mac_styles features in Tk 8.7
	Author:         Marc Culler
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        18-Sep-2022
	Keywords:       Tk, Aqua
	Tcl-Version:    8.7
	Tk-Branch: mac_styles_87
	Vote-Summary   Accepted 4/0/0
	Votes-For:     FV, JN, KW, MC
	Votes-Against: none
	Votes-Present: none
-----

# Abstract

This TIP applies only to the Aqua port of Tk.  It proposes adding
several new values for the -style option of the ttk::button widget
and a new image type named nsimage.

# Background

Apple's Human Interface Guidelines list many types of buttons for
which there is no Tk equivalent.  Developers of Tk applications for
macOS would benefit from being able to use widgets in their Tk
applications that play prominent roles in the HIG.  These include
Disclosure Buttons, Disclosure Triangles, Help Buttons, Image Buttons,
Inline Buttons, Gradient Buttons, Rounded Rectangular Buttons, and
Recessed Buttons.

The model for the approach taken in this tip is the existing
Toolbutton value for the -style option of a ttk::button.  This TIP
adds additional values which modify the appearance of a ttk::button.
In order to support the Image Button, which is heavily used in the
macOS preferences app as well as in applications, this Tip also
adds a new Tk image type named nsimage which leverages the
capabilities of Apple's NSImage class.  The nsimage type includes
all of the features of the ::tk::mac::iconBitmap object and adds
more features.  But the resulting image name is an allowable value of
the -image option of objects such as ttk::button and ttk::label.
The name of a ::tk::mac::iconBitmap object is an allowable value
for the -bitmap option, but need not be a bitmap.  It can be a full
color image.  In the long run it would make more sense to either
eliminate the -bitmap option or make it refer specifically to black
and white images rather than allowing full color images to be treated
as bitmaps.  However, this TIP does not address this issue directly.
It just provides an image type with all of the features of the
::tk::mac::iconBitmap as well as other features needed to create a
Tk replica of Apple's Image Button.

# Specification

The proposed new values for the -style option of a ttk::button are:
DisclosureButton, DisclosureTriangle, HelpButton, ImageButton,
InlineButton, GradientButton, BRoundedRectButton, and RecessedButton.

# Usage

The nsimage image type accepts the following options:

+ *-source* (the value is an arbitrary string)
+ *-as* (the value is one of name, file, path, or filetype)
+ *-pressed* (the value is boolean)
+ *-template* (the value is boolean)

The -as option specifies how the value of the -source option should be
interpreted. The *name* value means that the source should be the name of a
named system image.  The *file* option means that the source is a path to an
image file with a format understood by the NSImage class.  The *path* value
means that the source is a path to an existing file and that the resulting image
should be the system icon for files of the same filetype as the file with the
given path.  Finally, the *filetype* value means that the image should be the
system icon for the filetype specified by the source, either as a filename
extension, or an Apple Uniform Type Identifier, or as a four character OSCode as
used in the now obsolete HFS filesystem to specify file types.

If -pressed is true the image is algorithmically modified so that it will be
darker then the original in light mode and lighter than the original in dark
mode.  This is meant to produce an alternate image to be used when a ttk::button
is in the pressed state.

If -template is true then the resulting image will be marked as a template
image.  Template images have all black pixels with alpha values.  The system
automatically changes the black to a light gray color when in dark mode.  (Any
NSImage can be marked as a template, but the algorithm does no work correctly
unless the image has only black and alpha channels.)

Here are some examples:

    image create nsimage bonjour -source NSBonjour -as name -width 48 -height 48

    image create nsimage bonjour -source NSBonjour -as name -width 48 -height 48 -pressed 1

    image create nsimage feather -source feather.png -as file -width 48 -height 48 

To create a ttk::button using one of the new styles, simply provide
the new style as the value of the -style option.  For example:

    ttk::button $w.imagebutton -style ImageButton -text Bonjour -image {bonjour pressed bonjour1}

# Compatibility

This tip proposes new allowed values for the -style option and a new
image type.  It does not change any existing syntax.  So it should not
create any compatibility issues.

# Extensibility

It might be useful to add even more of the button types listed in the
HIG, or to add new styles for other widgets, such as a circular
progress meter replicating the widget which is now heavily used by
Apple.  These extensions would follow the same paradigm.  Additional
values for the -style option of, say, a ttk::progressBar, could be
added to produce different variants of the widgets.

# Reference Implementation

These features are implemented in the
[mac\_styles\_87](https://core.tcl-lang.org/tk/timeline?t=mac_styles_87)
branch.  The branch is now 3 years old, has been synchronized with
Tk 8.7 regularly, and is currently being used in commercial products
based on Tk.

# Copyright

This document has been placed in the public domain.

Added tip/640.md.



















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 640: Remove Tcl_SaveResult
	Author:        Jan Nijtmans <[email protected]>
	State:         Final
	Type:          Project
	Vote:          Done
	Created:       21-09-2022
	Tcl-Version:   9.0
	Keywords:      Tcl
	Tcl-Branch:    tip-640
	Vote-Summary   Accepted 5/0/0
	Votes-For:     FV, JN, KW, MC, SL
	Votes-Against: none
	Votes-Present: none
-----

# Abstract

The `Tcl_SaveResult/Tcl_RestoreResult/Tcl_DiscardResult` functions are able to
save and restore the current interpreter result. This is not adequate in
the error-situation, that's why a new set of functions was developed
[TIP #226](226.md) doing a better job.

Since `Tcl_SaveResult/Tcl_RestoreResult/Tcl_DiscardResult` are deprecated
already a long time, it's time to remove them in Tcl 9.0.

# Potential incompatibility.

All extensions will need to be rewritten to use `Tcl_SaveInterpState/
Tcl_RestoreInterpState/Tcl_DiscardInterpState` in stead of
`Tcl_SaveResult/Tcl_RestoreResult/Tcl_DiscardResult`. Since those
functions are already available since Tcl 8.5, that shouldn't
be a problem: All extensions should have been rewritten already
a long time ago.

# Implementation

See branch [`tip-640`](https://core.tcl-lang.org/tcl/timeline?r=tip-640)

# Copyright

This document has been placed in the public domain.

Added tip/641.md.























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 641: Let Tcl_GetBoolean(FromObj) handle (C99) bool.
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        02-Oct-2022
	Tcl-Version:    8.7
	Tcl-Branch:	    tip-641
	Vote-Summary:  Accepted 3/0/0
	Votes-For:     JN, KBK SL
	Votes-Against: none
	Votes-Present: none
-----

# Abstract

This TIP proposes new behavior for public routines **Tcl\_GetBoolean**
and **Tcl\_GetBooleanFromObj**: It's `boolPtr` argument can now point
at a `bool` as well as an `int`.

# Specification

Since C99 (and also recent C++ compilers), there's a new `bool` type,
which can only have the values `true` or `false`. Tcl predates this,
therefore it doesn't have an API to handle this type directly: In
stead of `bool` the only portable way to use it, is use an `int`
temporary variable, and convert it manually to the desired type.
For example, see [here](https://core.tcl-lang.org/tcl/file?ln=1193-1201&ci=00b136d44a3e6499&name=win%2FtclWinSock.c)
(which uses the Microsoft-specific `BOOL`, but the idea is the same).

Some platforms use `sizeof(bool) == sizeof(char)`, other platforms use
`sizeof(bool) == sizeof(int)`. Therefore, we can implement this with
already existing functions (the `char` variant depends on TIP #618).
We just define 2 macro's `Tcl_GetBoolean/Tcl_GetBooleanFromObj`, which
map to the original functions if `sizeof(*(boolPtr)) == sizeof(int)`
and to `Tcl_GetBool/Tcl_GetBoolFromObj` when `sizeof(*(boolPtr)) == sizeof(char)`.
A panic will result it none of those two match (but that's actually impossible
when using `bool`).

# History

This implementation used to be part of TIP #618, but doing that led to a
lot of discussion. Since that TIP did multiple unrelated proposals,
it was decided to split it: TIP #618 introduces the new API which
makes this TIP possible at all. This TIP explains how the new API
can be used to handle the C99/C++ `bool` type, just be defining
two new macro's.

# Compatibility

This is 100% upwards compatible.

# Reference Implementation

Under development on the [tip-641](https://core.tcl-lang.org/tcl/timeline?t=tip-641) branch.

# Copyright

This document has been placed in the public domain.

Added tip/642.md.

































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 642: Let TK_OPTION_BOOL/TK_OPTION_STRING_TABLE handle (C99) bool/enum.
	Author:         Jan Nijtmans <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        05-Oct-2022
	Tcl-Version:    8.7
	Tk-Branch:      tip-642
	Vote-Summary:  Accepted 3/0/0
	Votes-For:     JN, KBK SL
	Votes-Against: none
	Votes-Present: none
-----

# Abstract

This TIP proposes new flags for Tk's configuration options
TK_OPTION_BOOL/TK_OPTION_STRING_TABLE.

The Tk_OptionSpec.internalOffset field describes the offset
of the variable being handled in the record. This variable
has to be of type `int`. This TIP expands this, such that
the variable pointed to by this internalOffset also can be
of another type, as long as `sizeof(var)` is 1, 2 or 4.
For example (C99) bool (useful for TK_OPTION_BOOLEAN) and
enum (useful for TK_OPTION_STRING_TABLE) can now be
used, even when sizeof(bool) resp. sizeof(enum) != sizeof(int).

# Specification

Two new macro's are defined:

<pre>
    #define TK_OPTION_VAR(type)		...
    #define TK_OPTION_ENUM_VAR		...
</pre>

Those macro's can be used in the Tk_OptionSpec.flags field,
indicating the size of the variable `internalOffset` points to.
It can be combined with any other flag, using the `|` operator.

For example:
<pre>
    TK_OPTION_VAR(bool)
</pre>
This will result in the value 64 if sizeof(bool) == 1, or 0 if sizeof(bool) == sizeof(int).

<pre>
    TK_OPTION_ENUM_VAR
</pre>

This will result in the value 64 if sizeof(enum) == 1, 128 if sizeof(enum) == 2, or 0
if sizeof(enum) == sizeof(int).

Those 2 flag values (64 and 128) are used in the option handling, indicating
that the variable pointed to by `internalOffset` is not an `int`, but a smaller type.
Those flag values don't conflict with any other flag value which can be used here.

The TK_OPTION_ENUM_VAR macro is already implemented, in `tkInt.h`, as part of bugfix
[eedd795d98](https://core.tcl-lang.org/tk/info/eedd795d98): It turned out that in
various places, enum variables were already used in Tk, which is not portable.
This TIP moves TK_OPTION_ENUM_VAR to the public header-file `tk.h`, so it can
officially be used in extensions as well.

Gcc has a compilation option `-fshort-enums`, which makes sizeof(enum) == sizeof(short).
Using this option, and without bug-fix [eedd795d98](https://core.tcl-lang.org/tk/info/eedd795d98),
the problem described in the bug-fix ticket can be demonstrated. Some (mostly embedded)
targets use `-fshort-enums` as default.

# Compatibility

This is 100% upwards compatible.

# Reference Implementation

Under development on the [tip-642](https://core.tcl-lang.org/tk/timeline?t=tip-642) branch.

# Copyright

This document has been placed in the public domain.

Added tip/643.md.





















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 643: Provide a public API to retrieve nul terminator length for an encoding
	Author:		Ashok P. Nadkarni <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	09-Oct-2022
	Tcl-Version:	8.7
	Tcl-Branch:	tip-643
	Keywords:	encoding
	Vote-Summary:  Accepted 3/0/0
	Votes-For:     JN, KBK SL
	Votes-Against: none
	Votes-Present: none
-----

# Abstract

Add a C API to allow extensions to retrieve the length of the nul terminator
for a specific encoding.

# Rationale

The `Tcl_UtfToExternal`, `Tcl_UtfToExternalDString` and related API's store
string in destination buffers in a specified encoding. While they append an
appropriate nul terminator to the destination, the returned length information
does not include the terminator. This is a problem when further copying the
encoded data to another buffer as might be required when interfacing to third
party API's.

This TIP proposes adding a `Tcl_GetEncodingNulLength` C API that will
return the number of nul bytes required for a specific encoding.

# Specification

The following function will be added along with an entry in the stubs table.

```
int Tcl_GetEncodingNulLength(Tcl_Encoding encoding);
```

The `encoding` parameter specifies the encoding for which the nul terminator
length is to be retrieved. If `encoding` is NULL, the current system encoding
is assumed.

The function returns the length of the nul terminator for the encoding.

# Discussion

One could also think of providing a `encoding nullength` command at the
script level as FFI extensions like CFFI and FFIDL would find it useful to
terminate binary strings produced by `encoding convertto` before passing
them to the FFI. However, this can also be achieved by converting `"\0"`
so such a command is not strictly necessary though it would be clearer
and more efficient. At the moment, this is not planned. Opinions invited.

# Copyright

This document has been placed in the public domain.

Added tip/644.md.





























































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 644: Make Tcl_ObjType extensible
	Author:		Ashok P. Nadkarni <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	10-Oct-2022
	Tcl-Version:	9.0
	Tcl-Branch:	tip-644
	Vote-Summary:	Accepted 3/0/0
	Votes-For:	BG JN SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

Add a version field to the `Tcl_ObjType` field of the `Tcl_ObjType`
structure to permit future expansion.

# Rationale

In Tcl 8.x, the `Tcl_ObjType` structure enables extension writers to
implement new `Tcl_Obj` value types by defining appropriate dispatch
functions. However, because the structure is of a fixed size and with no
versioning information, new dispatch functions cannot be added except
when accompanied by a Tcl major version change.

The `Tcl_ChannelType` structure includes a version field which has
allowed the channel subsystem to be enhanced with additional dispatch
functions without requiring a Tcl major version change. This TIP
proposes adding similar version information to the Tcl_ObjType field.

An example where versioning would be beneficial is TIP 636, which
implements abstract list functionality for 8.7. Because the `Tcl_ObjType`
structure could not be modified, this has been implemented through
essentially an additional level of indirection with an attendant cost
in performance and complexity. An ability to version `Tcl_ObjType` would
have permitted the list dispatch function to be directly added to
that structure even for 8.7.

This TIP only proposes the versioning capability be made possible, not
for any specific additional functions to be defined. TIP 636 would
however be a candidate to be adapted.

# Specification

The `Tcl_ObjType` structure will be defined as follows:

```
typedef struct Tcl_ObjType {
    const char *name;
    Tcl_FreeInternalRepProc *freeIntRepProc;
    Tcl_DupInternalRepProc *dupIntRepProc;
    Tcl_UpdateStringProc *updateStringProc;
    Tcl_SetFromAnyProc *setFromAnyProc;
    size_t version;
} Tcl_ObjType;
#define TCL_OBJTYPE_V0 0
#define TCL_OBJTYPE_CURRENT TCL_OBJTYPE_V0
```

The first five fields are in common with Tcl 8.6. Keeping the version
information at the end means existing `Tcl_ObjType` definitions that are
**statically** defined (as is usually the case) do not have to modified
as the compiler will auto-initialize the field to 0. Allocated
`Tcl_ObjType` structures that are explicitly initialized at runtime will
have to be modified to initialize the field to `TCL_OBJTYPE_V0`. This
is rare. (In fact, the comments in the code indicate the structure must
be statically allocated though the manpages do not mention this.**

**Note:** Gcc produces a *missing initializer for field* warning when
the version field is not explicitly initialized. This is due to the use of
`-Wextra` in the compile flags. This is completely bogus in the author's
opinion since implicit initialization for struct fields is well defined
C. The compiler might as well complain about uninitialized static variables.
In any case, the warning can be fixed by either explicitly initializing
or adding the `-Wno-missing-field-initializers` switch. Extensions
that compile against both Tcl 8 and 9 will have to either turn off the
warning or use ifdefs.

The structure can be extended for new functionality by adding fields at
the end of the structure with a corresponding bump in version.
`TCL_OBJTYPE_CURRENT` should be updated correspndingly. Access to the
new fields must be protected by a check for the appropriate version. **Note
that the new fields need not be restricted to function pointers.** See
example below.

The `Tcl_RegisterObjType` function will be unchanged and depend
on the caller to have correctly initialized the passed structure
as is the case today.

# Examples

TIP 636 is written under the assumption that the Tcl_ObjType is
unchanged from Tcl8. Abstract lists are implemented as an instance of
Tcl_ObjType whose intrep contains an additional function dispatch table
for list related methods. Thus there is an additional indirection and
level of indirection required.

With TIP 644, abstract lists could instead be implemented by extending
the `Tcl_ObjType` structure as follows

```
typedef struct Tcl_ObjType {
    const char *name;
    Tcl_FreeInternalRepProc *freeIntRepProc;
    Tcl_DupInternalRepProc *dupIntRepProc;
    Tcl_UpdateStringProc *updateStringProc;
    Tcl_SetFromAnyProc *setFromAnyProc;
    size_t version;
    int (*listLengthProc)(Tcl_Interp *interp, Tcl_Obj *objPtr);
    ...other list functions...
} Tcl_ObjType;
#define TCL_OBJTYPE_V0 0
#define TCL_OBJTYPE_V1 1
#define TCL_OBJTYPE_CURRENT TCL_OBJTYPE_V1
```

The `Tcl_ListObjLength` function would then look like

```
if (objPtr->typePtr &&
    objPtr->typePtr->version >= TCL_OBJTYPE_V1 &&
    objPtr->typePtr->listLengthProc != NULL
    ) {
    return objPtr->typePtr->listLengthProc(...);
} else {
    ...essentially existing code shimmering to a list...
}
```

The `ArithSeries` implementation would then define its `Tcl_ObjType`
definition as

```
const Tcl_ObjType tclArithSeriesType = {
    "arithseries",
    FreeArithSeriesInternalRep, /* freeIntRepProc */
    DupArithSeriesInternalRep,  /* dupIntRepProc */
    UpdateStringOfArithSeries,  /* updateStringProc */
    SetArithSeriesFromAny,      /* setFromAnyProc */
    TCL_OBJTYPE_V1,             /* version */
    ArithSeriesLen              /* listLengthProc */
    ...other list methods...
};
```

Further extensions in the future would proceed similarly by bumping
the version, adding new fields with appropriate checks when accessing.

The new fields added to the structure need not be restricted to function
pointers. Even when used purely for that purpose, it can make sense
to encapsulate the addition functions within another structure. This
can make initialization easier when those fields are not used. For
example, if the structure included both abstract lists and abstract
dictionaries, it might look like

```
typedef struct Tcl_AbstractListType {
    Tcl_ALLengthProc *lengthProc;
    Tcl_ALIndexProc *indexProc;
    ...additional functions...
} Tcl_AbstractListType;
typedef struct Tcl_AbstractDictType {
    Tcl_ADSizeProc *sizeProc;
    Tcl_ADLookupProc *lookupProc;
    ...additional functions...
} Tcl_AbstractDictType;
typedef struct Tcl_ObjType {
    const char *name;
    Tcl_FreeInternalRepProc *freeIntRepProc;
    Tcl_DupInternalRepProc *dupIntRepProc;
    Tcl_UpdateStringProc *updateStringProc;
    Tcl_SetFromAnyProc *setFromAnyProc;
    size_t version;
    Tcl_AbstractListType abstractListType;
    Tcl_AbstractDictType abstractDictType;
} Tcl_ObjType;
#define TCL_OBJTYPE_V0 0
#define TCL_OBJTYPE_V1 1
#define TCL_OBJTYPE_CURRENT TCL_OBJTYPE_V1
```

Initialization of an abstract dictionary concrete type is then a little
easier since the fields of `abstractListType` do not need to be
individually initialized.

# Copyright

This document has been placed in the public domain.

Added tip/645.md.

























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 645: ttk color palette support
	Author:		Patrick May <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	11-Oct-2022
	Tcl-Version:	8.7
	Tk-branch:	tip-645
        Vote-Summary:	Accepted 3/0/0
        Votes-For:	JN, KBK, KW, SL
        Votes-Against:	none
        Votes-Present:	none
-----

# Abstract

When the 'default' ttk theme is in use, allow the ttk widgets to follow the
user's chosen color scheme (set via X resources) and the script writer's choice
of color scheme (set via the command 'tk_setPalette')

# Background & Rationale

Tk currently gives users some limited customisation of the color palette by
setting X resources. Script writers can also specify a palette via the command
'tk_setPalette'.

This user/scripter specified palette is only applied to the original Tk widgets;
the ttk widgets use separate colors defined by the current ttk theme. In the
case of the 'default' ttk theme, it's a bright white and grey palette.

Users who want to use custom color palettes find this jarring and aesthetically
displeasing.

It's also a cause of usability issues; currently, attempting to set a 'night
mode' style color scheme (bright foreground, dark background) renders some parts
of Tk unusable where bright text is put on a bright background -- tk::IconList
(a component of the file chooser) uses the user's choice of foreground but the
background color is hardcoded 'white'.

# Specification

The 'default' ttk theme is initialised with the user's chosen color options. If
the user hasn't specified any color options, the 'default' theme's original
colors are used.

tk::IconList is adjusted so that it uses appropriate foreground and background
colors that match the current ttk theme.

A procedure ttk::theme::default::reconfigureDefaultTheme is added which is
called to initialise the 'default' theme, and is called by tk_setPalette to
update the colors of the ttk widgets as necessary, ensuring that the color
palette is always consistent when the 'default' ttk theme is in use.

# Implementation

Implementation is available in the [tip-645] (https://core.tcl-lang.org/tk/timeline?r=tip-645) branch of the Tk repository.

# Copyright

This document has been placed in the public domain.

Added tip/646.md.

























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 646: Change -eofchar handling
	Author:		Jan Nijtmans <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	17-Oct-2022
	Tcl-Version:	8.7
	Tcl-branch:	tip-646
        Vote-Summary:	Accepted 3/0/0
        Votes-For:	JN, KBK, KW, SL
        Votes-Against:	none
        Votes-Present:	none
-----

# Abstract

This TIP is inspired by [Bug #5bfe3de008](https://core.tcl-lang.org/tcl/tktview?name=5bfe3de008),
suggesting to remove the `-eofchar` handling for writable channels. So,
assuming $chan is a writable channel, so where a channel was previously
configured with an eof character,

<pre>
    fconfigure $chan -eofchar \\x1A
    close $chan
</pre>

, the eof character must now be explicitly written:

<pre>
    puts -nonewline $chan \\x1A
    close $chan
</pre>

In other words, the `close` command no longer any byte to the channel
when closing a channel.

Also, this TIP suggests to change the default `-eofchar` for channels on Windows
in Tcl 9.0 to be the same as on UNIX: `-eofchar {}`.

The only feature `-eofchar "\\x1A {}"` is currently used for is for starpacks, where
a script file and some archive is glue'd together in a single file, using `\\x1A` as
separation. That functionality will be kept as-is in Tcl 9.0.

# Background & Rationale

Tcl channels have the configuration option `-eofchar {$inChar $outChar}`. The current functionality
of `inChar` (for channels which are readable) is that - as soon as this character is encountered
in the input stream - it behaves as EOF. The current functionality of `outChar` is that - as soon
as the channel is closed - the character is written to the output stream. This last behavior is
problematic: We don't know where the cursor is when the file is closed, no check is done and no seek
to the end of the channel is done. For this reason, no extension or application is known using
this feature. Whenever `-eofchar` is set, it is usually either set to `{}` or to `"\\x1A {}"`.

The default for channels on Windows is `-eofchar "\\x1A {}"`, which is different from the default
on UNIX. This is causing problem with a lot of extensions, which need to set `-eofchar {}`
explicitly for channels, preventing that the character `\\x1A` somewhere in the input
stream causes the channel to be closed. The motivation for this was that old DOS files
sometimes have the `\x1A` character at the end, but this is highly unlikely now: Current
editors on Windows don't do that any more. Therefore, the default for channels on Windows
will be changed to `-eofchar {}` in Tcl 9.0.

# Specification

For Tcl 9.0, remove the `outChar` behavior of `-eofchar` completely. Any attempt to
set the `outChar` to something else than the empty string will result in an error-message.

For Tcl 9.0, change the default `-eofchar` value on Windows to be the same as it is on UNIX.

For Tcl 8.7, we can do a little bit to reduce the chance of errors. Currently,
setting a single character:
<pre>
    fconfigure $chan -eofchar \\x1A
</pre>
is equivalent to
<pre>
    fconfigure $chan -eofchar "\\x1A \\x1A"
</pre>
For Tcl 8.7, this will be changed to be equivalent to:
<pre>
    fconfigure $chan -eofchar "\\x1A {}"
</pre>
This prevents the - most likely unintended - behavior that a `\\x1A`
character is written to the channel (if it is writable) whenever
it is closed.

# Implementation

Implementation is available in the [tip-646] (https://core.tcl-lang.org/tcl/timeline?r=tip-646) branch of the Tcl repository.

# Copyright

This document has been placed in the public domain.

Added tip/647.md.

















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 647: Change Tk_ConfigureWidgets signature, abandon TK_CONFIG_OBJS
	Author:		Jan Nijtmans <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	04-11-2022
	Tcl-Version:	9.0
	Tk-branch:	tip-647
	Vote-Summary:	4 / 0 / 0
	Votes-For:	BG, DKF, JN, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

In december 1999, the TK_CONFIG_OBJS flag was introduced in Tk,
making it possible to use the Tcl_Obj-interface in a lot more
places than before (e.g. the canvas) . Since this was Tk 8.1,
the signature of the Tk_ConfigureWidgets() function could not
be changed, therefore it's 4th and 5th argument were kept as
argc/argv, although they could be objc/objv as well.

Now that Tk 9.0 is approaching, we can correct the Tk_ConfigureWidgets()
signature as it should have been from the beginning, and
also remove the possibility to use argc/argv any more.

# Background & Rationale

The function `Tk_ConfigureWidget` is typically used like this:
<pre>
    if (Tk_ConfigureWidget(interp, canvasPtr->tkwin, configSpecs,
	    objc, (const char **)objv, (char *)canvasPtr,
	    flags|TK_CONFIG_OBJS) != TCL_OK) {
	return TCL_ERROR;
    }
</pre>
The goal of this TIP is to allow to get rid of the type-casts and the `TK_CONFIG_OBJS` flag in Tk 9.0:
<pre>
    if (Tk_ConfigureWidget(interp, canvasPtr->tkwin, configSpecs,
	    objc, objv, canvasPtr, flags) != TCL_OK) {
	return TCL_ERROR;
    }
</pre>

This can be done by changing the 5th argument in the function signature from
`const char **` to `Tcl_Obj *const *` and the 6th argument to `void *`.

Of course it would be possible to keep the `TK_CONFIG_OBJS` flag. In my view
it's not really worth maintaining this for a long time more: the one-time
effort converting the extensions is fully worth the trouble. And after
the suggested conversion, everything still works with Tk 8.6 too.

# Specification

The signature of the function is modified from:
<pre>
    int Tk_ConfigureWidget(Tcl_Interp *interp,
	    Tk_Window tkwin, const Tk_ConfigSpec *specs,
	    Tcl_Size argc, const char **argv, char *widgRec,
	    int flags)
</pre>
to
<pre>
    int Tk_ConfigureWidget(Tcl_Interp *interp,
	    Tk_Window tkwin, const Tk_ConfigSpec *specs,
	    Tcl_Size objc, Tcl_Obj *const *objv, void *widgRec,
	    int flags)
</pre>

Also, all usages of the flag `TK_CONFIG_OBJS` in Tk are removed, assuming that the flag is set.

In addition, the `alwaysRedraw` field in `Tk_ItemType` will be renamed to `flags`. Currently
it can contains two different flags, `TK_ALWAYS_REDRAW` and `TK_MOVABLE_POINTS`. For
compatibility, `TK_ALWAYS_REDRAW` has the value `1`. This field also located the `TK_CONFIG_OBJS`
flag, but that flags becomes obsolete now. The flag `TK_MOVABLE_POINTS`
is not new, the `alwaysRedraw` field was where this flag had to be set (and exactly
this is the motivation for the suggestion to change the field name).

Since the `Tk_ItemType` is generally statically initialized, the field name change
doesn't need any user code modification: All extensions using it will work unmodified.

# Compatibility

For code which needs to work with both Tk 8.6 and 9.0, the following
construct can be used:
<pre>
    if (Tk_ConfigureWidget(interp, canvasPtr->tkwin, configSpecs,
	    objc, (void *)objv, (char *)canvasPtr,
	    flags|TK_CONFIG_OBJS) != TCL_OK) {
	return TCL_ERROR;
    }
</pre>
So just change the typecast for objv to `(void *)`, this way will
compile and run fine with both Tk 8.6 and 9.0.

Code which still is not using the `TK_CONFIG_OBJS` flag will need to be
modified: No longer use the `argv/argc` functions but switch to
using the `objc/objv` concept. This will become clear when compiling
such extensions with Tk 9 header files: The signature change will
cause a compiler warning if the conversion is not yet done.

`Tkimg` is already converted this way. It will still compile
fine after this TIP is accepted. The `Tkimg` conversion commit
can be found [here](https://sourceforge.net/p/tkimg/code/704/tree//trunk/pixmap/pixmap.c?diff=5031e6b7bfc09e3239440bdc:703)

Some extensions (like `vu Widget Set` and `tkzinc`) are
already modified to use the `TK_CONFIG_OBJS` flag, those are
quite easy to be ported to this signature change. Other extensions
(like `blt`, `snack`, `tkhtml`, `tkled`, `tknotebook`, `tkpath`
and `tktable`) will need more work, because the already-mentioned
`argc/argv`->`objc/objv` conversion needs to be done first.

# Implementation

Implementation is available in the [tip-647] (https://core.tcl-lang.org/tk/timeline?r=tip-647) branch of the Tk repository.

# Copyright

This document has been placed in the public domain.

Added tip/648.md.

















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 648: New functions Tcl_NewWideUIntObj()/Tcl_SetWideUIntObj()
	Author:		Jan Nijtmans <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	04-Nov-2022
	Tcl-Version:	8.7
	Tcl-branch:	tip-648
	Vote-Summary:   Accepted 6/0/0
	Votes-For:      AK, FV, JN, MC, KW, SL
	Votes-Against:  None
	Votes-Present:  None
-----

# Abstract

In Tcl core code, you will find a few instances of the following construct:
<pre>
    Tcl_WideUInt uint;
    Tcl_Obj obj = Tcl_NewWideObj((Tcl_WideInt)uint);
</pre>
This is done, because there is no function which can create a Tcl_Obj
with a value >= 2^63, the purpose of this TIP. As long as the value
is smaller than that, the above construct works as expected. If not,
the Tcl_Obj will be initialized with a negative value.

One clear example is [here](https://core.tcl-lang.org/tcl/file?udc=1&ln=625-630&ci=8c65a619ff5244ae&name=generic%2FtclLink.c),
even commented with a `FIXME: represent as a bignum`. The lack of a
`Tcl_NewWideUIntObj()` function in Tcl 8.6 means that whenever linking
a Tcl_WideUint C-variable to a Tcl variable, the Tcl variable
will have a negative value if the C-variable is > WIDE_MAX.
In Tcl 8.7 this is corrected already (part of the correction
came in with TIP #312, the remainder came with
[this commit](https://core.tcl-lang.org/tcl/info/8d0a21d00c416fdf)
as an internal `TclNewWideUIntObj` macro. This TIP makes this
functionality available for extensions too.

# Specification

New functions `Tcl_NewWideUIntObj()/Tcl_SetWideUIntObj()`, which are
almost the same as `Tcl_NewWideIntObj()/Tcl_SetWideIntObj()`, are
defined and implemented. The change is that the parameter is now unsigned.

If the value of the argument is <= WIDE_MAX, the result is the
same as `Tcl_NewWideIntObj()/Tcl_SetWideIntObj()`. The internal
representation of the Tcl_Obj will be a Tcl_WideInt. But
if the value is > WIDE_MAX, then a bignum Tcl_Obj will be created,
representing the given (positive) value.

# Implementation

Implementation is available in the [tip-648] (https://core.tcl-lang.org/tcl/timeline?r=tip-648) branch of the Tcl repository.

# Copyright

This document has been placed in the public domain.

Added tip/649.md.































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 649: Expose additional list functionality in the C API
	Author:		Ashok P. Nadkarni <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	14-Nov-2022
	Tcl-Version:	9.1
	Tcl-Branch:	tip-649
	Keywords:	list
-----
<!-- TOC BEGIN (auto generated with tiptoc) -->
* <a href='#Abstract'>Abstract</a>
* <a href='#Rationale'>Rationale</a>
    * <a href='#Efficiencyoflistmanipulation'>Efficiency of list manipulation</a>
    * <a href='#Efficiencyoflistaccess'>Efficiency of list access</a>
* <a href='#Specification'>Specification</a>
* <a href='#Discussion'>Discussion</a>
* <a href='#Implementation'>Implementation</a>
* <a href='#Copyright'>Copyright</a>

<!-- TOC END -->

# <a id='Abstract'></a>Abstract

**Although not directly dependent on it, this TIP is not being implemented
unless TIP 636 is passed.**

The list implementation has functionality that is available at the script
level but not in the C API. This TIP proposes to expose the same as a C
API as well. The benefits include

- convenience for extension and application writers that need to manipulate
lists at the C level by voiding the need to implement the same functionality
themselves
- significantly better performance as the currently defined list related C
API is implicitly built around the 8.6 list internal representation and does
not allow callers to benefit from implementation of more efficient higher
level operations.
- prevention of shimmering from the more efficient list representations made
possible by TIP 636 (for example, arithmetic series) to the memory intensive
8.6 implementation.

# <a id='Rationale'></a>Rationale

## <a id='Efficiencyoflistmanipulation'></a>Efficiency of list manipulation
Many applications and extensions for Tcl as well as Tk use Tcl's C API to
manipulate Tcl list values. For example, reversing or extracting a range of
elements is accomplished through a combination of
`Tcl_ListObjGetElements`/`Tcl_NewListObj` or a loop involving
`Tcl_ListObjIndex`/`Tcl_ListObjAppendElement`. Given the internal
representation of lists in Tcl 8.6, this was also how the Tcl core would
implement these operations and thus there were no significant efficiency
gains that would result from exposing the higher level operations as a C API.

This has changed with Tcl 9.0 where list internal representation may take
one of several forms (see TIP's 625, 629, 636). For many of these, some list
operations may be done more efficiently than allowed by the restrictive Tcl
8.6 list C API. For example, range and list reversal can now be faster and
more memory efficient by orders of magnitude for large lists.

The script level list commands benefit from these and it makes sense to
extend the same to C applications and extensions as well.

## <a id='Efficiencyoflistaccess'></a>Efficiency of list access

While the above pertain to list manipulation, the list accessor functions
`Tcl_ListObjGetElements` and `Tcl_ListObjIndex` also have their own issues
arising from an implicit assumption about the list internals.
`Tcl_ListObjGetElements` works well when the list internal representation
stores elements as an array of `Tcl_Obj *` pointer values.
`Tcl_ListObjIndex` assumes that the list implementation holds a reference to
the returned `Tcl_Obj *` element so the caller does not need to do any
explicit reference management with the returned pointer. Neither of these
assumptions necessarily hold true with newer list representations. For
example, the arithmetic series stores the list in compact (start, end, step)
form and generates a `Tcl_Obj` only when required. However, because of
`Tcl_ListObjIndex` semantics, the list implementation has to hold on to a
reference to the returned element `Tcl_Obj` essentially shimmering to the
equivalent `Tcl_Obj *` array at a cost in memory and efficiency.

For this reason, the TIP proposes an accessor function that is almost
identical to `Tcl_ListObjIndex` but requires the caller to release
the returned `Tcl_Obj` by calling `Tcl_DecrRefCount`. The list
implementation does not then need to artificially hold on to a reference
to the returned `Tcl_Obj** just in order to free it later.

**As an aside, note that the above drawbacks do not apply to the Tcl core
implementation itself, including implementation of script commands, as
Brian has already taken care to compensate appropriately. This is not
possible for extension writers as they do not have access to internal Tcl
list type information.**

# <a id='Specification'></a>Specification

The following functions will be added along with corresponding entries
in the stubs table. (Names all subject to change)

```
int Tcl_ListObjRange(
    Tcl_Interp *interp, /* Interpreter for error messages */
    Tcl_Obj *listPtr,   /* Unshared list object */
    Tcl_Size first,     /* Index of first element of range */
    Tcl_Size last);     /* Index of last element of range */
int Tcl_ListObjReverse(
    Tcl_Interp *interp, /* Interpreter for error messages */
    Tcl_Obj *listPtr);  /* Unshared list object */
int Tcl_ListObjRepeat(
    Tcl_Interp *interp, /* Interpreter for error messages */
    Tcl_Obj *srcListPtr,  /* List object containing elements to repeat */
    Tcl_Size repeatCount, /* Number of times to repeat */
    Tcl_Obj **newListPtr) /* Where to store the new list */
int Tcl_ListObjSort(
    Tcl_Interp *interp, /* Interpreter for error messages */
    Tcl_Obj *listPtr,   /* Unshared list object */
    TBD);
int Tcl_ListObjIndexWithRef(
    Tcl_Interp *interp, /* Interpreter for error messages */
    Tcl_Obj *listPtr,   /* Shared or unshared list object */
    Tcl_Size index,     /* Index of element to retrieve */
    Tcl_Obj **elementObjPtr) /* Where to store the element. Caller
                                needs to free it */
```

All functions return TCL_OK on success and TCL_ERROR on failure.
Functionality should be obvious.

# <a id='Discussion'></a>Discussion

The functions could be slightly altered to return a new `Tcl_Obj` and
allow `listPtr` to be a shared object. However, that would be inconsistent
with the current `Tcl_ListObjReplace` definition.

Applications should be encouraged to use `Tcl_ListObjIndexWithRef` to
avoid shimmering.

# <a id='Implementation'></a>Implementation

Pending until TIP 636 passes.

# <a id='Copyright'></a>Copyright

This document has been placed in the public domain.

Added tip/650.md.































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 650: New function Tcl_GetWideUIntFromObj()
	Author:		Jan Nijtmans <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	15-Nov-2022
	Tcl-Version:	8.7
	Tcl-branch:	tip-650
	Vote-Summary:	Accepted 2/0/0
	Votes-For:	BG, JN
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

TIP 648 proposes addition of new functions `Tcl_NewWideUIntObj` and
`Tcl_SetWideUIntObj` but missing the complementary function
`Tcl_GetWideUIntFromObj`. While strictly not necessary as
`Tcl_GetNumberFromObj` can be used for the purpose, that would require
the extension writer to be familiar with `mp_int` manipulation. A
`Tcl_GetWideUIntFromObj` would make extracting `Tcl_WideUInt` values
easier.

# Specification

The following function will be exported via the stubs table.

```
int Tcl_GetWideUIntFromObj(
    Tcl_Interp *interp,
    Tcl_Obj *objPtr,
    Tcl_WideUInt *uwidePtr);
```

If `objPtr` holds an non-negative integer value that fits in the domain of
`Tcl_WideUInt`, the function returns `TCL_OK` and stores the value in
`*uwidePtr`. Otherwise (non-integer or negative integer), the function returns
`TCL_ERROR` and stores an error message in `interp` if it is not NULL.

# Implementation

Implementation is available in the [tip-650] (https://core.tcl-lang.org/tcl/timeline?r=tip-650) branch of the Tcl repository.

# Copyright

This document has been placed in the public domain.

Added tip/651.md.



























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 651: Expose TclDStringToObj via stubs table
	Author:		Ashok P. Nadkarni <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	17-Nov-2022
	Tcl-Version:	8.7
	Tcl-branch:	tip-651
	Vote-Summary:	Accepted 3/0/0
	Votes-For:	BG, JN, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

The `Tcl_DString` abstraction is very useful in incrementally building
strings and binary data. In common usage in extensions, the resulting string
is used to initialize a `Tcl_Obj` and the source `Tcl_DString` freed. This
involves allocating new storage and a byte copy and is not efficient. Within
the core, the function `TclDStringToObj` provides a more efficient means
which moves the allocated storage to the `Tcl_Obj` and resets the
`Tcl_DString`. This TIP proposes making this function available to
extensions as `Tcl_DStringToObj`.

# Specification

The following function will be exported via the stubs table.

```
Tcl_Obj *Tcl_DStringToObj(Tcl_DString *dsPtr);
```

The function returns a `Tcl_Obj` initialized with the content of `dsPtr` which
is then reinitialized to an empty string.

# Implementation

Implementation is available in the
[tip-651](https://core.tcl-lang.org/tcl/timeline?r=tip-651) branch of the
Tcl repository.

# Copyright

This document has been placed in the public domain.

Added tip/652.md.



















































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 652:  Remove  "string is unicode" and Tcl_CharIsUnicode"
	Author:		Nathan Coulter <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	26-Dec-2022
	Tcl-Version:	8.7
	Vote-Summary:  6 / 0 / 0
	Votes-For:     BG, DP, JN, KW, MC, SL
	Votes-Against: none
	Votes-Present: none
-----

# Abstract and Specification

Remove `string is Unicode` and `Tcl_UniCharIsUnicode()`, introduced in [`TIP
597`](https://core.tcl-lang.org/tips/doc/trunk/tip/597.md).

# Rationale

The only use of `[string is unicode]` is to determine whether a string can be
encoded into a Unicode transformation format, either utf-8, utf-16, or utf-32.
Tcl has never needed a `[string is big5]`, `[string is shiftjs]` or any
other `[string is someencodinghere]`.
There is also no need for `[string is unicode]`.  To determine whether a
given string can be encoded into a given
encoding, it is sufficient to attempt to perform the encoding using the
"strict" profile.  A failure to encode provides the same answer that `[string
is unicode]` would have.

`[string is unicode]` fails in its stated purpose.  According to TIP 597,

> The string is unicode command can be used to check if the "utf-8"/"utf-16"
> encodings would deliver valid output, ...

This is not true:

<pre>
set text \U03fffe
string is unicode $text;# -> 0
binary scan [encoding convertto utf-16 $text] H* hex
set hex ;# -> fdff
</pre>

The problem is that according to TIP 597, in addition to the surrogate
characters,  the return value is also `0` for the  66 noncharacters, U+??FFFE -
U+??FFFF and U+FDD0 - U+FDEF.  This means that `string is unicode` and
`Tcl_UniCharIsUnicode()` can not be used to check whether the data could be
encoded into one of the Unicode encoding forms.

The Unicode specification makes it clear that noncharacters may be encoded into
an encoding form.  First, there is definition 79:

> A Unicode encoding form assigns each Unicode scalar value to a unique code unit
sequence.

The specification then declares:

> To ensure that the mapping for a Unicode encoding form is one-to-one, all
> Unicode scalar values, including those corresponding to noncharacter code
> points and unassigned code points, must be mapped to unique code unit
> sequences. Note that this requirement does not extend to high-surrogate and
> low-surrogate code points, which are excluded by definition from the set of
> Unicode scalar values.

The [Private-Use Characters, Noncharacters & Sentinels FAQ](https://www.unicode.org/faq/private_use.html#nonchar6)
states,

>Q: Are noncharacters invalid in Unicode strings and UTFs?

>Absolutely not. Noncharacters do not cause a Unicode string to be ill-formed in
>any UTF. This can be seen explicitly in the table above, where every
>noncharacter code point has a well-formed representation in UTF-32, in UTF-16,
>and in UTF-8. An implementation which converts noncharacter code points between
>one UTF representation and another must preserve these values correctly. The
>fact that they are called "noncharacters" and are not intended for open
>interchange does not mean that they are somehow illegal or invalid code points
>which make strings containing them invalid.

As a response to issue [Tcl 9: "illegal byte
sequence" ?!](https://core.tcl-lang.org/tcl/info/17a1cb8d6e2a51bd)
all checks for noncharacters were removed in [commit
cbaa5e70167db75b](https://core.tcl-lang.org/tcl/info/cbaa5e70167db75b).
Therefore, `[string is unicode]` is already  obsolete, having fallen behind the
reality of the implementation.  The only thing `string is unicode` now does is
check for surrogate code points.

`Tcl_UniCharIsUnicode()` is also not useful.  If some encoding functionality is
to be exposed at the C level, the equivalent of `encoding convertto` could be
provided.

# Implementation

An implementation is provided in the branch, "tip-652".

# Copyright

Copyright © 2023, Nathan Coulter.  All rights reserved.

# Support

The author of this TIP requests financial support for this and other free
software works.  Contact and payment information available at:

> https://wiki.tcl-lang.org/page/Poor+Yorick

Added tip/653.md.



























































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 653: Handle consumed data of channel commands in case of encoding errors
	Author:		Jan Nijtmans <[email protected]>
	Author:		Harald Oehlmann <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	08-Jan-2023
	Tcl-Version:	8.7
	Tcl-branch:	tip-653
	Vote-Summary:	3/0/0
	Votes-For:	AK, JN, SL
	Votes-Against:	none
	Votes-Present:	none
-----



# Abstract

With the introduction of the `strict` profile for channels it is
possible that `read` throws an exception and consumes correctly
decoded data from the channel.
Currently, that can only happen in blocking channels in `strict`
profile, when an encoding error occurs.
But in the future there might be more situations and more commands
(`gets`)  where this can happen.

In order to prevent data loss, this TIP proposes to return
this _consumed_ data in the return dictionary of the exception.


# Specification

Whenever a channel command throws an exception (EILSEQ) due to an
encoding error, the data successfully decoded up to the point of
the error may be lost, as the error case does not allow to return a
value.
In the case of this potential data loss, the so far decoded data
is made available in the error options dictionary under the key
`-data`.

The key `-data` is present and has an empty string as value, if the
encoding error happens at the beginning of the data.
The purpose of this rule is to make user scripts easier.

The key `-data`is not present, if the already decoded data is not consumed,
e.g. the next call to a function will consider it again.

# Rationale

The special point with encoding errors is, that they may be introspected
or corrected by choosing an encoding or encoding profile, which handles
the data correctly.

To enable this, the so far decoded data may be of value.

Here is an example reading the remaining data using the binary encoding:

## Create test file

The test file contains an encoding error in UTF-8 encoding at the 2nd byte.
It consists of the following bytes:

   *   A capital "A"
   *   "\\xC3" :this announces a multi-byte UTF-8 sequence
   *   A capital "B": the announced multi-byte sequence is not continued resulting in an UTF-8 encoding error at position 1.

<code>
% set f [open test_A_195_B.txt wb]; puts -nonewline $f A\\xC3B; close $f
</code>

## Read until encoding error

Now read the file using utf-8 encoding and get informed about the error by an error dictionary:

<code>
% set f [open test_A_195_B.txt r]
file35a65a0
% fconfigure $f -encoding utf-8 -profile strict -blocking 1
% catch {read $f} e d
1
% set d
-data A -code 1 -level 0
-errorstack {INNER {invokeStk1 read file35a65a0}}
-errorcode {POSIX EILSEQ {invalid or incomplete multibyte or wide character}}
-errorinfo {...} -errorline 1
% tell $f
1
</code>

The error code `POSIX EILSEQ` informs about an incoding error.

The proposed key `-data` is present and contains the file data until the encoding error.
This is a capital "A".

The call to `tell` informs about the encoding error position.
The file position was advanced just before the encoding error.
The data before it was consumed and will not be returned by a second call to `read`.

Note, that within a file, we may jump back and read again.
This is not possible for other channels like a socket.
We only know, that, after an encoding error, we are located at the
encoding error position and any so far decoded data is in the `-data` key value.

## Handle encoding error

To handle the encoding error, the remaining data is read by changing the encoding to
binary. The next `read` command reads the bytes with the encoding error in UTF-8 encoding.

<code>
% fconfigure $f -encoding binary -profile strict
% read $f
ÃB
</code>

The application may now decide any action by introspection of the data.


## Example for Gets

Gets does not advance the current file position on encoding errors.
In consequence, the already decoded data should not be returned and the key
`-data` should not exist.

Here is an example with the same file and the same error recovery:

<code>
% set f [open test_A_195_B.txt r]
file35a65a0
% fconfigure $f -encoding utf-8 -profile strict -blocking 1
% catch {gets $f} e d
1
% set d
-code 1 -level 0
-errorstack {INNER {invokeStk1 gets file384b6a8}}
-errorcode {POSIX EILSEQ {invalid or incomplete multibyte or wide character}}
-errorinfo {...} -errorline 1
% tell $f
0
% fconfigure $f -encoding binary -profile strict
% gets $f
AÃB
</code>

Note the differences to `read`:

   *   The current file position is not advanced just before the encoding error.
   *   The recovery `gets` returns the well encoded data "A" and the error data.

# Implementation

The tip-653 branch contains a complete implementation under which the
entire test suite passes.

# Copyright

This document has been placed in the public domain.

Added tip/654.md.



























































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 654: Profiles for character encoding/decoding behaviour
	Author:		Nathan Coulter <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	10-Jan-2023
	Tcl-Version:	8.7
	Obsoleted-By:   656
-----

# Abstract

Previous attempts to articulate the options for handling non-conforming data
for a character set encoding have resulted in a set of available options that
are not well defined.  This TIP articulates the fundamental optional behaviours
and proposes a new set of names for them.

# Definitions

**Non-conforming representation**

> One or more bytes that do not conform to the specification for the
> representation of code points in the encoding.

**Non-conforming code point**

> One or more bytes that conform to the specification for the representation of
> code points in the encoding, but whose represented code points do not conform
> to the rules for the encoding.

**Non-conforming data**

> Both non-conforming repesentations and non-conforming code points.

# Specification

`-nocomplain` is no longer an option.

The "encoding" value of **encoding converfrom**, **encoding
convertto**, and **chan configure -encoding**, is a dictionary (or at
least conceptually one). The first key in the dictionary is optional,
and if ommitted, it is "**name**".  The "**name**" key provides the
name of the encoding.  Examples:

```
    chan configure $chan -encoding utf-8
    chan configure $chan -encoding {name utf-8}
    chan configure $chan -encoding {utf-8 profile strict}
    chan configure $chan -encoding {name utf-8 profile strict}
```

`chan configure $chan -encoding` returns the name of the encoding for the
channel, as it always has.

`chan configure $chan -encoding*` returns a dictionary describing the
configuration of the encoder for the channel.


The "**profile**" key provides the encoding profile.  Each profile is
independent of the other, and activating one profile cancels any
previous active profile.  The profiles are identified below by the
options that activate them.  For each option there is a corresponding
channel configuration option prefixed with the word "encoding".

The profiles are:

**discard**

> Not strict.  Discards non-conforming data by omitting them from the output.

**surrogate**

> Not strict.  Each byte of non-conforming data is transformed into a single
> low surrogate code point that can be transformed back to the original byte,
> as described in [Unicode Security
> Considerations](https://www.unicode.org/reports/tr36/#SecureEncodingConversion)
> This accomplishes the same purpose as `tag`, but requires only one character
> per byte instead of two.

**pass**

> Not strict. Each non-conforming byte becomes the character having the
> Unicode code-point represented by that single byte.

**replace**

> Not strict. When converting an encoded byte sequence to a Tcl string, invalid
> byte sequences are replaced by the U+FFFD REPLACEMENT CHARACTER code point.

> When encoding a Tcl string, characters that cannot be represented in the
> target encoding are transformed to an encoding-specific fallback character,
> U+FFFD REPLACEMENT CHARACTER for UTF targets and generally `?` for other
> encodings.

**report**

> Not strict.  Like `pass`, but `result errors` in the return options is a
> dictionary where each key is the starting index in the result of
> noncomforming substring and each value is the corresponding ending index.

**strict**

> Strictly conform to the specification for the encoding.  It is an error for
> non-conforming data to occur.

**tag**

> Not strict. Like `pass`, but tags each non-conforming byte by prefixing it
> with a replacement character, which is normally the standard replacement
> character for the encoding.  Each occurrence of the replacement character
> itself is also  prefixed with the replacement character.

**tcl8**

> The same as `pass`, but may in the future diverge if it is discovered that
> Tcl 8 behaviour does not mirror that described for `pass`.

# Rationale

`-strict` was introduced in [TIP
346](https://core.tcl-lang.org/tips/doc/trunk/tip/346.md), which
focused narrowly on issues surrounding byte arrays and non-mappable
characters.  It should instead have focused on conformance to the
chosen encoding, which is more fundamental.  `-nocomplain`, was
subsequenctly introduced in [TIP
601](https://core.tcl-lang.org/tips/doc/trunk/tip/601.md), but did not
describe its relationship to `-strict`, turned out to be nothing more
than the inverse of `-strict`, and has already been eliminated in the
implementation of Tcl's internal encoding/decoding functions.

Under this proposal, the syntax for specifying an encoding and its options
is the same for both `encoding convertto/from` and `chan configure -encoding`,
which simplifies the interface.

# Implementation

Implementation is in progress.

# Copyright

This document has been placed in the public domain.

Added tip/655.md.

































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 655: Support the styleMask property for NSWindow and NSPanel in Aqua
	Author:         Marc Culler
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        28-Jan-2023
	Keywords:       Tk, Aqua
	Tcl-Version:    8.7
	Tk-Branch: 655
	Vote-Summary:	Accepted 5/0/0
	Votes-For:	FV, JN, KW, MC, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

This TIP applies only to the Aqua port of Tk.  It proposes adding several new
platform-specific options to the wm attributes command for the Aqua window
manager.

# Rationale

The Aqua window manager used by macOS provides a number of different styles for
the frame and titlebar of a window.  For example, the system color and font
selection dialogs use the NSPanel subclass of NSWindow which has a narrower
title bar and exhibits different behaviors - an NSPanel floats above all other
windows, including windows belonging to other applications, and clicking on the
panel when the app is inactive does not activate it.  As another example, modal
dialogs windows associated with a normal document window often have no title bar
and feature rounded corners.

Many of these styles existed in the Carbon API and Tk has provided access to
some of these Carbon features for a long time via the
*::tk::unsupported::MacWindowStyle* command.  Many of the Carbon API calls
continue to work, to some extent, within the current Cocoa API that replaced
Carbon for OSX.  This part of the Carbon API was extremely ornate and complex,
so full access from Tk was not practical.  In Cocoa the API was simplified
considerably.  Objects in the NSWindow class (as well as its NSPanel subclass)
have an integer-valued styleMask property whose bits control the various style
choices for window frames and title bars.  The core goal of this TIP is to
provide direct control over the styleMask bits with a command in the main tk
namespace rather than in *::tk::unsupported*.  This is handled by giving a Tk
name to each bit and by adding a new *-stylemask* option to the *wm attributes*
command which can be used to set the values of the bits.  Changing a bit causes
an instant change to the window decorations.

On the other hand, the choice of whether the underlying Aqua window for a Tk
Window should be in the NSWindow class or the NSPanel class must be made before
the NSWindow or NSPanel is instantiated and cannot be changed.  The way that
this is handled by *::tk::unsupported::MacWindowStyle* is unfortunate.  The
implementation essentially creates an intentional race condition.  The toplevel
must be created first.  Then the user must call
*::tk::unsupported::MacWindowStyle style* to specify the style.  And that must
be done in the brief moment after the toplevel command has created a *TkWindow*
with the specified pathname and before that *TkWindow* has actually been mapped.
The user is left to handle this squeeze play on her own.  In the interpreter it
is necessary to put both commands on the same line separated by a semicolon.

This tip does away with the race condition.  The choice of which window to use
is made with the new *wm attributes* -class option, which can take two possible
values: *nswindow* and *nspanel*.  The implementation of the option allows the
-type option to be specified for a pathname that does not identify a window.  In
that case the value of the option is cached in a Tcl hash table and looked up
when the Aqua window is created in the course of mapping a Tk window with that
pathname.  It is an error to change the type of a window for which the
underlying Aqua window already exists.

A different, logically independent, aspect of this tip is to expose the NSWindow
attributes tabbingIdentifier and tabbingMode as wm attributes.  This allows
using tabbed windows in a Tk application.  A partial implementation of this,
which did not provide enough control to make it practical to use tabs in Tk
applications, has been removed from the *::tk::unsupported::MacWindowStyle*
command.

# Specification

Six new options are added to the wm attributes command for macOS.
These are:

`wm attributes` *window* `-appearance` ?*auto*\|*aqua*\|darkaqua*?

`wm attributes` *window* `-class` ?*nswindow*\|*nspanel*?

`wm attributes` *window* `-isdark`

`wm attributes` *window* `-stylemask` ?*bitnamelist*?

`wm attributes` *window* `-tabbingid` ?*string*?

`wm attributes` *window* `-tabbingmode` ?*auto*\|*preferred*\|*disallowed*?

When using the options -class, -tabbingid, or -tabbingmode it is allowed for the
pathname to not be associated to an existing window.  In that case the option
value is cached, and is used when a window with that pathname is created later.
It is an error to modify the class after the underlying macOS window for a
toplevel has been instantiated.

The allowed bit names for the bitnamelist are: **titled**,
**closable**, **miniaturizable**, **resizable**,
**fullsizecontentview**, **docmodal**, **utility**,
**nonactivatingpanel**, and **HUDwindow**.  Each named bit is set to 1
in the stylemask, and all other bits are set to 0.

When the fullsizecontentview bit is set to 1 it also causes the macOS window to
be modified so its title bar is transparent.  (Otherwise, drawing in the
titlebar area would not be visible.)

The -tabbingid and -tabbingmode options are used to control how toplevel windows
are displayed as tabs in a tab group.  They set the value of the NSWindow
propertied named tabbingIdentifier and tabbingMode. Tabs in the same group must
have the same tabbingid, and a toplevel can only be displayed as a tab if either
its tabbingmode is *preferred* or if its tabbingMode is *auto* and the user has
specified in the System Settings that tabs are preferred when opening documents.

# Usage

For example, to create a resizeable NSPanel with red and yellow
buttons in its (narrow) titlebar:

`wm attributes .t -class nspanel`

`toplevel .t`

`wm attributes .t -stylemask {titled closable miniaturizable resizable}`

# Compatibility

This TIP proposes new options for the wm attributes command on Aqua.  The effect
of some of these can also be acheived by using options available in the
tk::unsupported::MacWindowStyle command.  The tip does not propose changing that
command since it is used, for example, in the Python tkinter module as well as
in some standard Tk packages.
.

# Reference Implementation

These features are implemented in the
[655](https://core.tcl-lang.org/tk/timeline?t=655)
branch. 

# Copyright

This document has been placed in the public domain.

Added tip/656.md.

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
# TIP 656: A revised proposal for encodings
	Author:		Ashok P. Nadkarni <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	2023-02-13
	Tcl-Version:	8.7
	Tcl-branch:	tip-656
	Vote-Summary:	Accepted 6/0/0
	Votes-For:	AK, JD, JN, KW, MC, SL
	Votes-Against:	none
	Votes-Present:	none
-----
<!-- TOC BEGIN (auto generated with tiptoc) -->
* <a href='#Abstract'>Abstract</a>
* <a href='#Rationale'>Rationale</a>
* <a href='#Specification'>Specification</a>
    * <a href='#Profiles'>Profiles</a>
        * <a href='#Thetcl8profile'>The `tcl8` profile</a>
        * <a href='#Thestrictprofile'>The `strict` profile</a>
        * <a href='#Thereplaceprofile'>The `replace` profile</a>
        * <a href='#Thedefaultprofile'>The default profile</a>
    * <a href='#Theencodingprofilescommand'>The `encoding profiles` command</a>
    * <a href='#Changestoencodingconvertfromandencodingconvertto'>Changes to `encoding convertfrom` and `encoding convertto`</a>
    * <a href='#Newoption-profileforfconfigureandchanconfigure'>New option `-profile` for `fconfigure` and `chan configure`</a>
    * <a href='#ChangestotheCAPIs'>Changes to the C API's</a>
        * <a href='#Differencesfromthecurrent87API'>Differences from the current 8.7 API</a>
* <a href='#Implementation'>Implementation</a>
    * <a href='#Alternativeproposals'>Alternative proposals</a>
            * <a href='#Finergranularityoferrorclassselection'>Finer granularity of error class selection</a>
            * <a href='#Includetheprofilewithintheencodingparameter'>Include the profile within the encoding parameter</a>
        * <a href='#Alternativefconfigureoptionname'>Alternative fconfigure option name</a>
* <a href='#Copyright'>Copyright</a>

<!-- TOC END -->

# <a id='Abstract'></a>Abstract

This TIP proposes enhancements to the character encoding commands and public C
API's present in Tcl 8.6 based on based on the *profile* concept of TIP 654. It
differs in terms of syntax, C API and semantics related to other options. It
supplants previously accepted TIP's 346, 601 and 633 that targeted the same
functionality.

The TIP also defines fconfigure options to associate profiles with channels to
control their encoding behavior.

# <a id='Rationale'></a>Rationale

Operations involving encoding transforms may encounter multiple types of
errors such as invalid sequences in the source, characters that
cannot be encoded in the target encoding etc. Tcl 8.6 dealt with these
errors by "wishing them away", either by substituting a `?` character
or (effectively) assuming the offending byte was in CP1252 encoding.

TIP's [346](https://core.tcl-lang.org/tips/doc/trunk/tip/346.md),
[601](https://core.tcl-lang.org/tips/doc/trunk/tip/601.md) and
[607](https://core.tcl-lang.org/tips/doc/trunk/tip/607.md) proposed options
to the `encoding` command that allowed applications to detect and handle
encoding transform errors. Further,
[633](https://core.tcl-lang.org/tips/doc/trunk/tip/633.md) added
corresponding options to `fconfigure` for the same purpose.

There are however inadequacies in these options as described in
a separate [write-up](https://www.magicsplat.com/tcl9/tcl9unicode.html) and
[mailing list](https://sourceforge.net/p/tcl/mailman/message/37772114/)
and summarized below.

- The options `-strict` and `-nocomplain` are added to increase or
decrease the "level of strictness" relative to the default. These do not
cover the conformant behaviors specified by the Unicode standard.

- At the C API level, these translate to the flags `TCL_ENCODING_STRICT` and
`TCL_ENCODING_NOCOMPLAIN` with an additional flag `TCL_ENCODING_STOPONERROR`
that was already present in 8.6 The use of multiple options (plus the default)
is confusing in terms of their interaction and combined behavior. This is
exacerbated by the difference in their treatment between Tcl 8 and Tcl 9.

- <span style="border-left: 4px red solid; padding-left: 2px; margin-left:-2px;">
There is no provision for the standard conformant behavior that uses the
`U+FFFD` replacement character. **This means it is actually not possible to
write a [W3C conformant](https://encoding.spec.whatwg.org/#utf-8) browser (or
other Web content processor) without implementing your own encoders.**</span>

- Adding further error handling behaviors in the future would require
additional mutually exclusive switches and flags which further complicate
the interface.

This proposal based on TIP 654's profile model, is intended to address
the above shortcomings.

# <a id='Specification'></a>Specification

## <a id='Profiles'></a>Profiles

The following types of errors may be encountered when converting
an encoded byte sequence into Tcl's internal form:

- Case 1. The byte value may be one that should never appear in the specified
encoding or at a particular position in a multibyte encoding. For example,
the values `\xC0` and `\xC1` should never appear at any point in a UTF-8
encoded byte sequence. As an example of the latter, the byte `\xE0` (amongst
others) should never appear as the lead byte in ShiftJIS.

- Case 2. The rules for the encoding do not permit the value to have been
encoded in the first place. For example, surrogate Unicode code points
should never be encoded and thus should be treated as an error when
encountered during a decoding operation. (Note the surrogate could appear in
the UTF-16 encoded byte sequence. But the **decoded** value should never be
a surrogate code point.)

- Case 3. A byte subsequence within a byte sequence that is encoded with a
multibyte encoding terminates prematurely. This may or may not be an error
depending whether the subsequence is in the middle of the containing byte
sequence or at the end. In the latter case, it may just mean more bytes are
needed as may happen when data is read over a streaming interface. For
example, the UTF-8 sequence `\xC2\x41` is a hard error as there is no
trailing byte succeeding the lead byte `\xC2` (`\x41` cannot be a trailing
byte). On the other hand, the sequence `\x41\xC2` may not be an error
because additional data may arrive containing a valid trailing byte to
complete the `\xC2`.

- Case 4. The decoded values may lie outside the range of Unicode code points.
For example the UTF-32 encoded sequence `\x7F\xFF\xFF\x7F` trivially
transates to the integer value U+7FFFFF7F which is greater than the largest
valid code point U+10FFFF. This is distinguished from Case 2 because it is
treated differently by Tcl in the **current** implementation.

Similarly, the following types of errors may be encountered when converting
in the other direction:

- Case 1. The encoding does not support the Unicode code point. For examples,
code points higher than U+007F are not supported in the ASCII encoding.

- Case 2. The encoding may be able to encode a Unicode code point but the
rules for the encoding do not allow it. For example, the Unicode standard
for UTF-8 encoding prohibits encoding of surrogate code points. So although
the surrogate U+DC00 can be encoded as the byte sequence `\xED\xB0\x80`, it
is prohibited by the standard.

- Case 3: The value of the code point lies outside the valid code point range.

A *profile* defines the handling of each of the above error cases by either

1. Terminating further processing of the source data. The profile does **not**
determine how this premature termination is conveyed to the caller. By default,
this is signalled by raising an exception. The `-failindex` option as
described in TIP 607 may be used instead.

2. Using a fallback strategy for the offending bytes and continuing processing
the rest of the data. This may be use of a replacement character (either fixed
or dependent on the invalid byte), discarding the invalid bytes etc. as
defined by the profile.

Note that none of the currently defined profiles distinguish between errors
cases but there is no reason preventing a profile defined in the future to
do so. For example, a `allowsurrogates` profile may pass through
surrogate code points (illegal in UTF-8) but stop processing on other error
cases.

This TIP defines three profiles, `tcl8`, `strict` and `replace`.

### <a id='Thetcl8profile'></a>The `tcl8` profile

The `tcl8` profile corresponds to the implementation of encoders in Tcl 8.6.

When converting to Tcl's string form, with the exception of the special case
noted below, each byte of an illegal byte sequence is mapped to its numerically
equivalent code point. In effect, it treats the byte as being in ISO8859-1
encoding even though the transform may have specified a different encoding.

As an special case, for the UTF-8 encoding the illegal sequence `\xC0\x80`
is mapped to U+000000.

When converting a Tcl string to an encoded byte sequence, values that cannot
be encoded in the target encoding are mapped to an encoding-specific
fallback character, usually `?`. For UTF encodings, this case cannot arise
as they can represent all code points. Additionally, for the error case
where the code point being encoded is prohibited from appearing in
encoded form (surrogates for example), the `tcl8` profile ignores the
mandate and encodes the code point anyways.

The `tcl8` profile is not conformant with the Unicode standard. Moreover,
it leaves room for silent misinterpretation of data.

With respect to the current implementation, the `tcl8` profile
replaces the `-nocomplain` option of TIP 601.

### <a id='Thestrictprofile'></a>The `strict` profile

The `strict` profile implements strictly conformant behavior as defined
in the Unicode standard. All error cases result in the error being signalled.

With respect to the current implementation, the `strict` profile
replaces the `-strict` option of TIP 346.


### <a id='Thereplaceprofile'></a>The `replace` profile

The `replace` profile implements an alternate conformant behaviour defined
in the Unicode standard.

When converting an encoded byte sequence to a Tcl string, invalid byte
sequences are replaced by the U+FFFD REPLACEMENT CHARACTER code point.

When encoding a Tcl string, characters that cannot be represented in the
target encoding are transformed to an encoding-specific fallback character,
U+FFFD REPLACEMENT CHARACTER for UTF targets and generally `?` for other
encodings.

When multiple successive invalid bytes are encountered, the Unicode standard
allows for their substitution with a single or multiple replacement characters.
The `replace` profile conforms to this.

There is no equivalent to the `replace` profile in the current TIP 346/601
based 8.7 implementation.

### <a id='Thedefaultprofile'></a>The default profile

This TIP does not specify the default profile to be used. That is the subject
of a separate TIP.

## <a id='Theencodingprofilescommand'></a>The `encoding profiles` command

A new command is added that will return the names of implemented profiles.

```
encoding profiles
```

## <a id='Changestoencodingconvertfromandencodingconvertto'></a>Changes to `encoding convertfrom` and `encoding convertto`

The commands `encoding convertfrom` and `encoding convertto` support
a new option `profile` that takes a profile name as value. The `-strict`
and `-nocomplain` options are no longer supported. The commands take
the form

```
encoding convertfrom DATA
encoding convertfrom ?-profile PROFILE? ?-failindex VAR? ENCODING DATA

encoding convertto DATA
encoding convertto ?-profile PROFILE? ?-failindex VAR? ENCODING DATA
```

The syntax is backward compatible with 8.6. However, it differs from the
current 8.7/9.0 implementation in that there is no ambiguity.
In the current implementation, when two arguments are supplied,
it tries to guess whether the first is an option or an encoding name.
With the above syntax, if any options are specified, the encoding
must be explicitly specified as well. Note it is possible to relax this
based on odd/evenness of the argument count but that would make it
trickier to add options in the future that do not take an argument.

The `-profile` option specifies the profile to be used to be used
for the conversion as described earlier. If multiple `-profile` options are
passed, the last one will be used.

The `-failindex` option behaves as defined in TIP 607. However, **although
not specified in that TIP**, in the current 8.7/9.0 implementation the
`-failindex` option also enables the `-strict` option. **This TIP specifically
proposes that the option not make any implicit selection of profiles.**
In addition to the author's opinion that options should be as orthogonal to
each other as possible, the current implied behavior makes it awkward
to write (for example) a proc that takes a profile and returns as much
data as can be read without raising an error. The `-failindex` option now
only determines whether an exception is raised or decoded data is returned
with error location in the passed variable when processing of the input data
is stopped as determined by the profile.

## <a id='Newoption-profileforfconfigureandchanconfigure'></a>New option `-profile` for `fconfigure` and `chan configure`

A new option `-profile` has been added to the `fconfigure` command.
The option's value must be a profile name. The encoding transforms in use
for the channel's input and output will then be subject to the rules of that
profile. Any failures will result in a channel error. The mode of reporting
channel error is a function of the channel subsystem and not defined by this
TIP.

The `-strictencoding` and `-nocomplainencoding` options that were
defined by the earlier TIP's and currently implemented in 8.7 and 9.0
alphas are supplanted by `-profile` and removed.

## <a id='ChangestotheCAPIs'></a>Changes to the C API's

Two new functions, `Tcl_ExternalToUtfDStringEx` and `Tcl_UtfToExternalDString`,
related to encoding transforms were added by TIP 601 for 8.7. These had the signatures

```
Tcl_Size Tcl_ExternalToUtfDStringEx(Tcl_Encoding encoding, const char *src, int srcLen, int flags, Tcl_DString *dsPtr);
Tcl_Size Tcl_UtfToExternalDStringEx(Tcl_Encoding encoding, const char *src, int srcLen, int flags, Tcl_DString *dsPtr);
```


This TIP changes the signatures of these functions to the following:

```
int
Tcl_ExternalToUtfDStringEx(
    Tcl_Interp *interp,     /* For error messages. May be NULL. */
    Tcl_Encoding encoding,  /* The encoding for the source string, or NULL
                             * for the default system encoding. */
    const char *src,        /* Source string in specified encoding. */
    Tcl_Size srcLen,        /* Source string length in bytes, or < 0 for
                             * encoding-specific string length. */
    int flags,              /* Conversion control flags. */
    Tcl_DString *dstPtr,    /* Uninitialized or free DString in which the
                             * converted string is stored. Must be freed
                             * after return irrespective of return value */
    Tcl_Size *errorLocPtr); /* Where to store the error location
                               (or TCL_INDEX_NONE if no error). May be NULL. */
int
Tcl_UtfToExternalDStringEx(
    Tcl_Interp *interp,     /* For error messages. May be NULL. */
    Tcl_Encoding encoding,  /* The encoding for the converted string, or
                             * NULL for the default system encoding. */
    const char *src,        /* Source string in UTF-8. */
    Tcl_Size srcLen,        /* Source string length in bytes, or < 0 for
                             * strlen(). */
    int flags,              /* Conversion control flags. */
    Tcl_DString *dstPtr,    /* Uninitialized or free DString in which the
                             * converted string is stored Must be freed
                             * after return irrespective of return value */
    Tcl_Size *errorLocPtr); /* Where to store the error location
                              (or TCL_INDEX_NONE if no error). May be NULL. */

```

The `Tcl_ExternalToUtfDStringEx` function converts a source buffer from the
specified encoding into UTF-8. The `Tcl_UtfToExternalDStringEx` function does
the converse, converting a source buffer from UTF-8 to the specified encoding.

The flags parameter may be composed from OR-ing the following values:

- At most one of `TCL_ENCODING_PROFILE_DEFAULT`, `TCL_ENCODING_PROFILE_TCL8`,
`TCL_ENCODING_PROFILE_STRICT` and `TCL_ENCODING_PROFILE_REPLACE`.
If none are specified, a version-dependent default profile is used.

- For reasons of backward compatibility and consistency with 8.6 functions,
the `TCL_ENCODING_STOPONERROR` flag remains. It has the same effect
as specifying the `TCL_ENCODING_PROFILE_STRICT` overriding any other
profile flags that might have been specified.

For preserving future compatibility, any other bits will result in an error being
returned. In particular, callers should not set the `TCL_ENCODING_START` and
`TCL_ENCODING_STOP` flags as those are not supported by the above functions
(even in the current pre-profile implementation) as they do not implement
streaming operation.

Both functions have the same set of return values:

- `TCL_OK`: success. Converted string in *dstPtr and NUL terminated in an encoding
specific manner.

- `TCL_ERROR`: Error other than conversion error, e.g. invalid parameter
values. Error message is stored in the interpreter.

- `TCL_CONVERT_MULTIBYTE`: Indicates that the source ends in truncated multibyte
sequence.

- `TCL_CONVERT_SYNTAX`: The source is not conformant to encoding definition

- `TCL_CONVERT_UNKNOWN`: The source contained a character that could not be
represented in target encoding.

In the case of the `TCL_CONVERT_*` return codes,

- If errorLocPtr is NULL, an error message is stored in the interpreter if
it is not NULL.

- If errorLocPtr is not NULL, no error message is stored as it is
expected the caller is interested in whatever is decoded so far and not treating
this as an error condition.

### <a id='Differencesfromthecurrent87API'></a>Differences from the current 8.7 API

As stated above, the signatures of the functions differ from the currently
implemented 8.7 and 9.0 API's. The new signatures are motivated by:

- The older signatures had no mechanism to signal an error other than
encoding errors in the data stream. In particular, there was no way to signal
errors in parameter values. Examples would be invalid profiles, conflicting
flags, flags not applicable to the given encoding etc.

- Callers had to generate error messages themselves based on error codes,
including computing the error offset, offending character etc. This is
both inconvenient and avoidable duplication. Passing the interpreter for
the purposes of retrieving error messages is a common convention in the Tcl
core.

In addition to the change in signatures,
the `TCL_ENCODING_NOCOMPLAIN`, `TCL_ENCODING_STRICT` and
`TCL_ENCODING_MODIFIED` bit flags have been removed. These were
not present in Tcl 8.6 so there is no backward compatibility issue.

The first two have been supplanted by the profile related flags. The
`TCL_ENCODING_MODIFIED` bit was intended to be used to specify a variant of
UTF-8 or CESU-8 for encoding nul bytes as `\xC0\x80`. This is never set
internally within the Tcl core and not accessible at the script level either.
The motivation of eliminating it arises from the belief that this is actually an
encoding and best modeled as such instead of through flags. If encoding variants
are enabled through flags, then why not CESU-8 as as variant of UTF-8, or
UTF-16LE/UTF-16BE as variants of UTF-16? As an aside, other languages also treat
this "modified" UTF-8 as a separate selectable encoding. A separate encoding
would also make it usable from the script level if so desired without
changing the API.

# <a id='Implementation'></a>Implementation

Implementation and tests for Tcl 8.7 and 9.0 are available in the
[tip-656](https://core.tcl-lang.org/tcl/timeline?r=tip-656) and
[tip-656-tcl9](https://core.tcl-lang.org/tcl/timeline?r=tip-656) branches
respectively. Currently these still use the `-encodingprofile`
option name and will be changed to `-profile` dependent
on TIP approval. Manpages have not been updated.

## <a id='Alternativeproposals'></a>Alternative proposals

There have been a couple of alternatives proposed on the mailing list.

#### <a id='Finergranularityoferrorclassselection'></a>Finer granularity of error class selection

The [first](https://sourceforge.net/p/tcl/mailman/message/37770900/) is an
`-onerror` option which is similar to the `-profile` option but allows for
finer granularity.

```
encoding convertfrom -onerror {surrogates invalid wrongcode} ....
encoding convertfrom -handle {SURROGATE error INVALID replace INCOMPLETE ignore ...}
```

The author is not in favor of this as I expect it to add considerable complexity
to implementation and test suites while being minimally useful to the end user.
(It feels like over generalization to me. How often would a user want to
distinguish between invalid cases?).

#### <a id='Includetheprofilewithintheencodingparameter'></a>Include the profile within the encoding parameter

Another syntactic alternative proposed was to embed the error handling options
into the encoding argument.

```
encoding convertfrom {utf-8 strict}
fconfigure CHANNEL -encoding {utf-8 strict}
```

Since the difference is primarily in command option processing, implementation
changes are not many. I prefer the first form from a stylistic perspective. For
example, the latter makes it a little more awkard to request a profile using the
default encoding.

### <a id='Alternativefconfigureoptionname'></a>Alternative fconfigure option name

The original option to `fconfigure` proposed by this TIP was `-encodingprofile`.
That has been renamed to `-profile` as per Jan's suggestion. This is both
less wordy and does not conflict with `-encoding` when used in shorter forms.

# <a id='Copyright'></a>Copyright

This document has been placed in the public domain.
















Added tip/657.md.







































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 657: Make "-profile strict" the default in Tcl 9.0
	Author:         Jan Nijtmans <[email protected]>
	Author:         Nathan Coulter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Tcl-Version:    9.0
	Tcl-Branch:     tip-657
	Vote-Summary:	Accepted 6/0/1
	Votes-For:	AF, AK, JN, KW, MC, SL
	Votes-Against:	none
	Votes-Present:	DKF
-----
# Abstract

This TIP proposes to make "-profile strict" the default. This TIP is
intended as replacement for TIP #601, but builds on top of
[TIP #656](656.md) ("A revised proposal for encodings")

# Rationale

The `tcl8` profile is a legacy profile, which doesn't conform
to any recommended behavior, the two other profiles `strict` and
`replace` do.

Since `strict` is the recommended profile in most situations, it becomes
the default in Tcl 9.0, with a few exceptions. That has some implications
at the script level.

Many scripts will have to be adapted, either expecting exceptions
for encoding errors or setting the channel profile to "tcl8" or
"replace". And functions like "fcopy", "read" and "gets" now
will throw an exception when encountering encoding-errors,
which might not be expected by external applications/extensions.

# Specification

New channels are by default assigned the `strict` profile, and both
`encoding convertfrom` and `encoding convertto` use the `strict` profile
by default. The exception for this is the `stderr` channel, which
will default to the `replace` profile.

`Tcl_FSEvalFileEx()` uses the `strict` profile, and therefore `source` uses
the strict profile. All commands except `glob` use the `strict` profile.

`Tcl_ExternalToUtfDStringEx()`, `Tcl_UtfToExternalDStringEx()`,
`Tcl_ExternalToUtf()` and `Tcl_UtfToExternal()`, support operation in a mode
where any encoding error that occurs results in an `EILSEQ` POSIX error.  That
mode is now the default.  Other modes can be explicitly configured by the
caller ([TIP #656](656.md)) to specify how these functions behave when invalid data are encountered.

Handling of environment variables (syncing between the ::env array and the
native environment) is still using the `tcl8` profile, as well as the
`glob` command. The reason for this is that in those situations many
applications won't expect exceptions when illegal byte-sequences
happen in (disk-)filenames or in environment variables. That's why
it's out-of-scope for this TIP. [TIP #671](671.md) is an attempt
to solve this problem with environment variables and the `glob` command.

# Compatibility

Since this is an incompatible change whenever channels/files/sockets
are used, it has a potential big effect on extensions. All extensions
which could be confronted with encoding errors now have to handle
the possibility of exceptions to be thrown in the case of encoding
errors.

Also, when trying to open a file, when the filename has surrogate
characters in it (or .. any code-point missing from the system encoding),
opening such file will fail in Tcl 9.0, while it might have succeeded in Tcl 8.x.
e.g.:
<pre>
    set f [open \\U1F91D w]
    close $f
    set f [open \\uD83E\\uDD1D r]
</pre>
This will succeed in Tcl 8.7, but fail in Tcl 9.0, because surrogate
pairs are not equal to the combined character any more.

The 'http' package is modified because of this change: Since the 'http' package is
not prepared to handle exceptions, it can easily be left in an inconsistent state,
as shown by test-case errors when the default profile was changed to 'strict'.
Therefore, the 'http' package, when run in Tcl 9.0, will use the 'replace'
profile. This makes the package conformant to the W3C recommendations.

The 'tcltest' package is modified to use the 'tcl8' profile for its internal
channels. For this package, we don't want exceptions to disturb test-outputs.
If a test-case wants to handle a surrogate, so be it, this should not
disturb the testcase.

# Implementation

Implementation is available in the
[tip-657](https://core.tcl-lang.org/tcl/timeline?r=tip-657) branch of the Tcl
repository.

# Copyright

This document has been placed in the public domain.

Added tip/658.md.

























































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 658: Attach identifiers to Tk menu entries
	Author:		Schelte Bron <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Vote-Summary:	Accepted 4/0/0
	Votes-For:	BG, SL, FV, KW
	Votes-Present:	none
	Votes-Against:	none
	Created:	16-Mar-2023
	Tcl-Version:	8.7
	Tk-Branch:	tip-658
	Keywords:	tk menu
-----

# Abstract

This tip proposes to enhance the Tk menu widget by attaching an identifier
to each menu entry.


# Rationale

The Tk menu system currently provides a few methods to refer to a menu
entry. To reconfigure an entry after creation, scripts generally use one of
two methods. Both of which have their pitfalls:

**Index numbers**  
Index numbers change when entries are added or deleted, and even
when the -tearoff option of the menu is changed.

**Patterns**  
The wording or formatting of a menu entry label may change during the
lifetime of an application. The developer then has to go through the code to
find all references and change them too. Labels may also change during the
runtime of an application, for example in a bookmarks menu. Problems also
arise when an application uses internationalization. While using the
localized string as the pattern will work most of the time, not every string
matches itself as a string match pattern. And updating a label when the
locale changes is very cumbersome.

Addressing menu entries would be much easier if they can be referenced using
a fixed identifier. This would also benefit the tooltip package from tklib.

# Specification

Similar to canvas items and ttk::treeview items, whenever a menu entry is
created, a unique id is assigned to it. If no id is specified by the
developer, an id is automatically generated. This id stays with the entry
until it is deleted. The id may be used as the index for all widget
commands that take an *index* argument.

The following widget commands have gained an optional *id* argument:

* *pathName* **add** *type* ?*id*? ?*option* *value* *option* *value* ...?
* *pathName* **insert** *index* *type* ?*id*? ?*option* *value* *option*
*value* ...?

Both of these commands now return the id assigned to the entry. If an id is
specified that already exists, the command throws an error. If one of the
reserved indices (active, end, last, or none) is specified as the id, or an
id of the form *number* or @*number* is used, no error is thrown. But the
entry will not be accessible by that id, because the special meaning of
such indexes will take precedence.

A new widget command is introduced to obtain the id of a menu entry:

* *pathName* **id** *index*

The ids of entries are mirrored in cloned menus.

# Alternative consideration
The presence of the id argument is being detected based on the fact that
option value pairs always have to be given using an even number of arguments.
This is similar to how an optional name is passed to the image create photo
command.
An alternative method would be what ttk::treeview does: Via a read-only -id
option. This would avoid the need for the id widget command. However, the
use of read-only options is uncommon in plain Tk widgets. Making the -id
option writable would unnecessarily complicate the implementation.
Either way, the **add** and especially the **insert** method will have to
return the assigned id. It would be hard to reliably obtain it otherwise.

The use of tags instead of, or in addition to ids could also be a
possibility. This would allow multiple entries with the same tag to be
addressed together. A use case would be the Cut, Copy, and Delete entries in
an Edit menu, which would all have to be enabled or disabled based on whether
something is selected. The few situations where this could be useful don't
justify the complexity and memory overhead of implementing such a feature.

User provided ids are not checked against the list of reserved indices
(active, end, last, none), or if they match any of the other forms for
specifying an entry index (*number*, @*number*).
Assigning the ids will be accepted, but the special meaning of these strings
when used as index will take precedence. This means that entries with such
ids will just not be addressable by their id.
An exception can be implemented, if deemed desirable.

After an index is compared against the special forms mentioned above without
finding a match, a check is made to see if the index equals the id of any
entry. Only if all of that fails, a pattern match against the labels is done.
This order was chosen because doing a pattern match is slow. The id check is
a quick hash table lookup. The situation that an index would match the id of
one entry and the label of a different entry is expected to be extremely
rare to merely hypothetical in a real-life application. New applications are
most likely to start using the id, rather than pattern matching, which is
another reason to favor the id over a pattern.

In the current implementation, specifying an id that is already used throws
an error. Another option would be to remove the id from the old entry and
assign it to the new entry. This makes ids less reliable, in my opinion. The
whole point of this tip is to have a fixed reference to a menu entry.
Allowing ids to be moved defeats that purpose. Throwing an error is also how
ttk::treeview deals with duplicate ids.

# Implementation

Implementation is available in the
[tip-658](https://core.tcl-lang.org/tk/timeline?r=tip-658) branch of the Tk
repository.

# Copyright

This document has been placed in the public domain.

Added tip/659.md.







































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 659: Allow other default profiles than "strict"
	Author:         Jan Nijtmans <[email protected]>
	State:          Withdrawn
	Type:           Project
	Vote:           Pending
	Tcl-Version:    9.0
	Tcl-Branch:     tip-659
-----
# Abstract

This TIP proposes a new `interp profile` command, and a new
environment variable `TCL_PROFILE_DEFAULT`, which allows
the default profile to be different from "strict". This
only makes sense in combination with TIP #657.

# Rationale

The idea is that every interpreter has a default profile. It is
set at creation time, using the environment variable `TCL_PROFILE_DEFAULT`.
If this environment variable has the value `tcl8` or `replace`,
the default profile of the interpreter will be as specified. If
the environment variable is missing, or has any other value,
then the default profile will be `strict`

Also there will be a new command `interp profile` which can set
and get the current default profile of the interpreter. e.g:

<pre>
% interp profile
strict
% interp profile tcl8
tcl8
% interp profile
tcl8
</pre>

# Implementation

Implementation is available in the
[tip-659](https://core.tcl-lang.org/tcl/timeline?r=tip-659) branch of the Tcl
repository.


# Compatibility

This is 100% upwards compatible. As long as the environment variable
is not set, everything is as before.

# Copyright

This document has been placed in the public domain.

Added tip/660.md.





























































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
# TIP 660: Use signed types for lengths and indices
	Author:		Ashok P. Nadkarni <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	30-03-2023
	Tcl-Version:	8.7
	Tcl-Branch:	tip-660
	Vote-Summary:	Accepted 9/0/0
	Votes-For:	SL, BG, DF, KK, MC, KW, JD, FV, AK
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

Tcl 8.x used the signed `int` type for indexing and lengths both internally as
well as in the public API. This was changed for 9.0, primarily via
[TIP 494](https://core.tcl-lang.org/tips/doc/trunk/tip/494.md), to the unsigned
integer type `size_t`, typedef'ed as `Tcl_Size`.

This TIP proposes changing the `Tcl_Size` type to `ptrdiff_t` for Tcl 9. For
practical purposes, this provides the same width but as a **signed** integer type.
<span style="border-left: 4px red solid; padding-left: 2px; margin-left:-2px;">
For Tcl 8.7, where `Tcl_Size` is already typedef'ed as `int`, there is
no change. It is targeted in this TIP only because of the addition of a new
exported stubs function `Tcl_GetSizeIntFromObj` and a #define `TCL_SIZE_MAX`.
</span>

# Rationale

**TL;DR** Changing signed types to unsigned will impose a significant burden on
extension writers porting extensions to 9.0 **for no tangible benefit**. This
additional work is independent of the changes required for 32->64 bit migration.
Furthermore, adopting unsigned integers for indices in the Tcl core necessitates
some "unusual" coding patterns that are susceptible to errors and will be a
continuous source of bugs even within the Tcl core.

Given that TIP 494 has already been passed, there need to be significant reasons
for reverting to the use of a signed type. These are summarized here with
detailed examples given in the **Discussions** section.

First, from a C language perspective, (paraphrasing Nathan from the chat)
indexing into arrays is tightly coupled to pointer arithmetic which in turn
requires the integer type representing pointer differences to follow the
semantics of the `ptrdiff_t` type. The `size_t` type, being unsigned, does not
meet this criteria. Further, compilers do not guarantee correct operation of
pointer arithmetic on allocations greater than `PTRDIFF_MAX` bytes.
See [C++ standard](https://timsong-cpp.github.io/cppwp/n4861/expr.add),
[C standard](https://port70.net/~nsz/c/c11/n1570.html#6.5.6p9),
[this blog](https://trust-in-soft.com/blog/2016/05/20/objects-larger-than-ptrdiff_max-bytes/),
[gcc ticket](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63303#c8) for more. So
in a nutshell, proper handling of allocations that do not fit in `ptrdiff_t` is
problematic.

Second, even if the above were not the case, changing a variable's type from
signed to unsigned in any code base requires careful inspection of not just the
variable's use in the Tcl API but practically **every single location** where
the variable is referenced. This includes arithmetic operations, comparisons,
iterations, and even I/O. Concrete examples are given in a later section. Even
worse, the compiler will not warn about most of these. The Tcl core itself is an
example of the extent of changes required and manifested bugs point to the ease
with which these can be overlooked despite the utmost discipline and care that
has been taken. As an extension, the changes made to Tk are further evidence of
the porting effort entailed by the use of unsigned indices in Tcl 9.

The question also has to be asked as to what one might lose by reverting from
`size_t` back to a signed type like `ptrdiff_t`. The change to the use of
`size_t` in lieu of `int` was made to permit indices and lengths beyond the
`int` range, particularly on 64-bit platforms. However, TIP 494 does not state
the motivation for change from a **signed** type to an **unsigned** type. Based
on discussion, it appears that it was at least partly motivated that an unsigned
type expands the possible range from `2**31` to `2**32` or `2**63` to `2**64`.

This is a false benefit for multiple reasons:

- As noted earlier, pointer arithmetic on objects that do not fit within the
`PTRDIFF_MAX` range is undefined behavior and compilers cannot be relied on to
correctly handle the larger allocations that `size_t` would purportedly permit.

- Even if compilers were to generate code correctly, most 32-bit operating
systems do not allow allocations of more than the half the address space without
special kernel configuration. Anyone desiring larger allocations will generally
be using 64-bit systems in any case. And in the case of 64-bit systems, `2**63`
should really suffice forevermore. (Unlimited range indices into virtual lists
have been brought up as a possible use. These are completely unworkable across
the board in the current Tcl implementation without major incompatible changes.)

- Even if compilers and operating systems support the unsigned range, the
current Tcl implementation of indices does not! In particular, the encoding of
indices internally into a `Tcl_WideInt` value supports both numeric and `end-N`
type of indices. This means the largest index value supported is half the range
of `Tcl_WideInt` (roughly speaking, the positive values are numeric indices and
the negative values `end-N` format indices). Thus a 64-bit *unsigned* `size_t`
is not workable without significant additional work on the internals.

Any single one of the above reasons precludes any potential benefit of the
expanded range of `size_t` compared to `ptrdiff_t`. We thus have a situation
where significant effort has to be expended, now and in the future, dealing with
unsigned index values for no concrete benefit whatsoever.

This TIP is intended to remedy this situation.

# Specification

The `Tcl_Size` typedef will be changed from `size_t` to `ptrdiff_t`.

The `TCL_SIZE_MAX` preprocessor constant is defined to hold the maximum
value for a `Tcl_Size`.

The `TCL_SIZE_MODIFIER` preprocessor constant is defined to hold the
printf family width specifier appropriate for values of type `Tcl_Size`.
(This is similar to existing `TCL_LL_MODIFIER`, `TCL_Z_MODIFIER` etc.)

All parameters to public API's that pertain to indices and lengths will be
changed to `Tcl_Size` if they are not so already (most are). Internal API's are
not generally specified in TIP's but as a point of information, the same applies
there.

As an exception to the above, any parameters that were specified as `size_t`
in Tcl 8.x API's will remain so.

Functions that accepted negative lengths or indices (for example to indicate nul
termination) will revert to their 8.x compatible behavior instead of only
accepting -1 as a special value.

<div style="border-left: 4px red solid; padding-left: 2px; margin-left:-2px;">
A new function is exported with the following signature

```
int Tcl_GetSizeIntFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Size *sizePtr);
```

to extract a `Tcl_Size` value from a `Tc_Obj`. This is analogous to the
`Tcl_GetIntFromObj` and `Tcl_GetWideIntFromObj`.
</div>

# Implementation

Implementation for Tcl 9 is in branch
[tip-660](https://core.tcl-lang.org/tcl/timeline?r=tip-660)
and builds with no errors or test failures. Implementation for Tcl 8.7 is branch
[tip-660-tcl8](https://core.tcl-lang.org/tcl/timeline?r=tip-660-tcl8) which
simply exports `Tcl_GetSizeIntFromObj`.


# Discussion

ChatGPT says

*Overall, changing a signed type to unsigned in C can have significant
ramifications for your program, and it's important to carefully consider the
implications before making the change.*

Surely no one needs further convincing having heard from ChatGPT :-) but
nevertheless below are specific examples of the kind of additional burden on
developers precipitated by the change to unsigned types.

**Note with respect to the examples that the issue is not that individual
changes are major. Rather, it is (a) the number of such occurences, (b) the fact
that the every use of indices and lengths has to be examined with no compiler
diagnostics to help and (c) the atypical usage patterns required are not natural
in C programming leading to subtle bugs in further development.**

### Looping

Consider the following simplistic but plausible 8.6 extension to reverse a list.

```
static int
Sandbox_Cmd(
    ClientData dummy,	/* Not used. */
    Tcl_Interp *interp,		/* Current interpreter */
    int objc,			/* Number of arguments */
    Tcl_Obj *const objv[]	/* Argument strings */
    )
{
    int i, len;
    Tcl_Obj *listObj, *objPtr;

    Tcl_ListObjLength(interp, objv[1], &len);
    listObj = Tcl_NewListObj(len, NULL);
    for (i = len-1; i >= 0; --i) {
        Tcl_ListObjIndex(interp, objv[1], i, &objPtr);
        Tcl_ListObjAppendElement(interp, listObj, objPtr);
    }
    Tcl_SetObjResult(interp, listObj);
    return TCL_OK;
}

```

Porting this extension to TIP 660 with `Tcl_Size` defined as `ptrdiff_t` would
simply require changing the `int` declaration to `Tcl_Size`. No other changes
are needed and the code would run correctly as before. With TIP 494 (current 9.0
implementation) on the other hand, changing the variable type to `Tcl_Size`
defined as `size_t` results in a crash (loop never terminates) requiring the
loop condition to be rewritten.

This required condition rewrite is not even the real problem. The real problem
is that every line of code using variables `i` or `len` has to be **manually**
examined to determine if it need to be adapted to the change to unsigned types.
Compilers do not always warn and unlike the above example, which results in a
crash, other cases may silently corrupt data or produce invalid results.

These issues arise from the differences between signed and unsigned types in
comparisons, arithmetic and type promotion. Here is another innocuous
command implementation just to illustrate the problem.

```
static int
Sandbox_Cmd(
    ClientData dummy,	/* Not used. */
    Tcl_Interp *interp,		/* Current interpreter */
    int objc,			/* Number of arguments */
    Tcl_Obj *const objv[]	/* Argument strings */
    )
{
    int i, len;
    const char *s = Tcl_GetStringFromObj(objv[1], &len);
    for (i = 0; i < len-1; ++i) {
        printf("%c", s[i]);
    }
    return TCL_OK;
}
```

This prints all but the last character of a string in Tcl 8.6. Changing the
`int` declaration to `size_t` for Tcl9, results in uninitialized memory being
accessed and junk printed **but only when an empty string is passed making the
problem easy to miss**. A `ptrdiff_t` type on the other hand continues to work
correctly in all cases. No source code change is required other than the
type declaration.

### Expressions

The problems caused by the switch to an unsigned type are further exacerbated by
the fact that the value `-1` is used as an index in several contexts in the Tcl
core such as an index indicating "before the first element", length indicator
for nul terminated strings, etc. To deal with this, the macro `TCL_INDEX_NONE`
is #defined as (effectively) `(size_t) -1`.

The following pattern that is pervasive in the Tcl core

```
    if (len < 0) {
        len = {strlen, Tcl_GetCharLen etc.}(...)
    }
```

has then to be replaced by the pattern

```
    if (len == TCL_INDEX_NONE) {
        len = ....
    }
```

So an extension writer has to look for these cases and fix them. For an idea of
the pervasiveness of this idiom and number of changes required, between Tcl and
Tk, there are close to a couple of hundred such instances.

There is a bigger issue though which is that the **semantics** are now changed.
While previously an extension could call `Tcl_NewStringObj` (for example) with
any negative value (which can happen for computed values) for the length
parameter to indicate nul terminated arguments, this is no longer the case. An
incompatibility between 8.x and 9.0 is acceptable but not one that offers no
benefit in return.

Along similar lines, simple comparisons of the type

```
if (idx < 0)...
if (last < first)...
if (last + 1 < stringPtr->numChars)
```

where `a` and `b` are of type `size_t` have to be rewritten as

```
if (idx + 1 < 1)
if (last + 1 < first + 1)
if (last + 2 < stringPtr->numChars + 1)
```

and so on. The reason is left as an exercise for the reader. If not obvious,
that should itself indicate the "unnaturalness" of this idiom. And again, as an
indication of the amount of work required on the part of developers porting
extensions, Tk has around a hundred occurences that needed such modification.

### Additional casts

Some cases are even more subtle in that they need an additional cast to work
correctly when the type widths differ. For instance, when `objc` is an `int` as
is common for function implementing Tcl commands, a cast is first necessary
where it was not previously required.

```
toIdx + 1 >= (size_t)objc + 1
```

or [this](https://core.tcl-lang.org/tcl/file?ci=d89991c58b49eccd&name=generic/tclIOCmd.c&ln=333)
line

```
Tcl_SetObjResult(interp, Tcl_NewWideIntObj((Tcl_WideInt)((Tcl_WideUInt)(lineLen + 1U)) - 1));
```

where with a signed type, a simple `Tcl_NewWideIntObj(lineLen)` would suffice.

### Generating Tcl_Objs containing indices

For extensions that implement collections (VecTcl, tarray, BLT, RBC etc.)
returning a `Tcl_Obj *` containing a index resulting from a search can use a
simple `Tcl_NewWideIntObj` call when indices are signed. With unsigned `size_t`
indices, this no longer suffices. The extension has to deal with `mp_int` internal
representation as seen in the [this](https://core.tcl-lang.org/tcl/file?ci=64479ca6e457f48a&name=generic/tclInt.h&ln=4852-4873)
internal use macro.

Although an extension may copy and adapt this internal macro or perhaps it could be
exported as a stubs function, it illustrates the additional complexities wrought
by unsigned indices.

### I/O and formatting

Even I/O or string formatting statements (as in error messages) are not exempt
from needing examination. Specifiers like "%d" now have to be changed to "%u".

All the issues above disappear if the `Tcl_Size` type is reverted back to
a signed integer type of the appropriate width such as `ptrdiff_t`.

# Copyright

This document has been placed in the public domain.

Added tip/661.md.

















































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 661: Disable the Tcl 8 compatibility macros in Tcl 9 by default
	Author:		Rolf Ade <[email protected]>
    Author:     Harald Oehlmann <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	25-04-2023
	Tcl-Version:	9.0
	Tcl-Branch:	disabletcl8api
	Vote-Summary:	3 / 0 / 0
	Votes-For:	SL, AK, KW
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

The TIPs [481](https://core.tcl-lang.org/tips/doc/trunk/tip/481.md)
and [616](https://core.tcl-lang.org/tips/doc/trunk/tip/616.md)
introduced macro constructs which hide the C API changes from Tcl 8.6
to Tcl 9. This tip proposes to disabling these macros by default.

# Specification

The compile time define `TCL_8_API` activates the compatibility macro layer.
The compatibility macro layer is switched off, if not given.

The compatibility macros are off by default if this TIP is accepted.
They are on by default if this TIP is not accepted.

If the compatibility macros are switched off, a compile attempt with
an `int *` (instead a `Tcl_Size *`) argument should give the usual
compile error (or warning) for this case, like "wrong pointer type
'int' instead 'Tcl_Size'".

# Rationale

## Practical impact of compatibility macros

The compatibility macros serve to compile with 32 and 64 bit type with the same function call:

~~~
int len;
Tcl_Size biglen;
char *string;
string = Tcl_GetStringFromObj(ObjPtr,&len);
string = Tcl_GetStringFromObj(ObjPtr,&biglen);
~~~

This will work and has a compiler warning in the 3rd line that the compatibility layer was used.

The drawbacks of the macros are:

   *   Any `NULL` Argument must be changed to `(Tcl_Size *)NULL` on Windows compilers, as `sizeof(NULL)` triggers a compile failure with miss-leading information "error C2100: illegal indirection". The following very common code will not compile any more.
   
~~~
char *string;
string = Tcl_GetStringFromObj(ObjPtr,NULL);
~~~

   *   A full type checking of the arguments are not possible any more. Real program errors may be hidden. Ashok has passed a struct pointer instead of a pointer to a struct element. This error was not found.
   *   Users may not understand the magic behind, as the user code is changed, which may not be correctly reflected in eventual error messages. The called functions are not in the source code.
   *   Typically macro side effects may lead to obscure issues, like double increment when `++` is used. This is a theoretical concern about macros, not special to this implementation.
   *   If the string has more than 31 bit in length, a runtime panic
       of TCL happens. This is called "late failure". Without
       compatibility macros, the compilation show a correct and real
       warning. It is much more probably to see this failure "early"
       in tests.

A compile run without macros should throw an error or warning (depends on used compiler and its settings), like this code snippet:

~~~
void test(Tcl_Size *len);

void fun() {
    int len;
    test(&len);
}
~~~

If a compiler or settings are used which allow to ignore this warning,
this leads to potential memory corruption, as a 64 bit value is written
to a 32 bit int value. This is normal C behaviour and is intentional.

### With compatibility macros (current main branch)

Using gcc, the following warnings are thrown.
Using MS-VC the behaviour is similar.

```
../generic/tclsample.c:344:39: warning: passing argument 2 of ‘tclStubsPtr->tcl_GetStringFromObj’ from incompatible pointer type [-Wincompatible-pointer-types]
  344 |     p = Tcl_GetStringFromObj(objv[1], &len);
/home/username/tcl/main/include/tclDecls.h:4278:48: note: in definition of macro ‘Tcl_GetStringFromObj’
 4278 |   tclStubsPtr->tcl_GetStringFromObj((objPtr), (sizePtr)))
      |                                                ^~~~~~~
../generic/tclsample.c:344:39: note: expected ‘Tcl_Size *’ {aka ‘long int *’} but argument is of type ‘int *’
  344 |     p = Tcl_GetStringFromObj(objv[1], &len);
/home/username/tcl/main/include/tclDecls.h:4278:48: note: in definition of macro ‘Tcl_GetStringFromObj’
 4278 |   tclStubsPtr->tcl_GetStringFromObj((objPtr), (sizePtr)))
      |                                                ^~~~~~~
```

### Without compatibility macros (current TIP661 branch)

Using gcc, only warnings are thrown, no errors.
Using MS-VC the behaviour is similar.
The warnings are as follows:

```
../generic/tclsample.c:344:39: warning: passing argument 2 of ‘tclStubsPtr->tcl_GetStringFromObj’ from incompatible pointer type [-Wincompatible-pointer-types]
  344 |     p = Tcl_GetStringFromObj(objv[1], &len);
      |                                       ^~~~
      |                                       |
      |                                       int *
../generic/tclsample.c:344:39: note: expected ‘Tcl_Size *’ {aka ‘long int *’} but argument is of type ‘int *’
```

Remark, that (at least), the warnings are clearer, as the expected type "Tcl_Size *" is mentioned.

## Verbose description

All the functions named in the TIPs
[481](https://core.tcl-lang.org/tips/doc/trunk/tip/481.md) and
[616](https://core.tcl-lang.org/tips/doc/trunk/tip/616.md) changed
their prototype from Tcl 8.6 to Tcl 9. This includes often used
functions like `Tcl_GetStringFromObj`. Typically a pointer changed
from `int` to `Tcl_Size` (a signed 64-bit type).

Those TIPs include a macro compatibility layer.
This layer observes the size of the target of the passed pointer and
finally call a function with an `int`argument or a 64 bit type.

TIP [664](https://core.tcl-lang.org/tips/doc/trunk/tip/664.md) 
changed the macros to trigger warnings, when no 64 bit type is used.
This allows extension authors to be aware of any errors or porting issues.
In addition, it introduces the extension configure flag `-Wno-incompatible-pointer-types`.

Extension writer should be aware, that action is required.
With Tcl 9 it is possible to have
`Tcl_Obj`s with a string representation greater 2 GByte and lists up
to 2^31 elements. If an unchanged extension call one of these
functions with such a `Tcl_Obj`, the application will abort.

Without the compatibility macros in place the compiler warning is
about a real thing: a 32-bit pointer may be written with a 64-bit
value, overwriting memory. This means: much earlier fail than with the
compatibility macros.

Ideally the compatibility macros- which had his role in migrating the
Tcl core to Tcl 9 - could be removed completely. But there are reports
that some parties have binary extensions in the million lines of code
size. To adapt such amount of code to the Tcl 9 API may be a bigger
task.

Since Tcl 9 has some not backward compatible changes also on script
level such parties may have a legitimate interest to see, what that
script level changes mean for their test suite. Therefor if build with
the compiler flag `-DTCL_8_API` the compatibility macros are activated
to relieve such educational tests.

# Implementation

Implementation started in [Tcl branch "disabletcl8api"](https://core.tcl-lang.org/tcl/timeline?r=disabletcl8api).

# Copyright

This document has been placed in the public domain.

Added tip/662.md.















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 662: Un-deprecate Tcl_VarEval
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        26-Apr-2023
	Tcl-Version:    8.6
	Tcl-branch:     tip-662
	Vote-Summary:	Accepted 5/0/0
	Votes-For:	AK, BG, DGP, JN, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

This TIP proposes removal of deprecated status from public routine
**Tcl\_VarEval**.

# Background

Since the release of Tcl 8.1, the documentation of **Tcl\_VarEval**
has included the sentence:

 > **Tcl\_VarEval** is now deprecated.

This deprecation arose in the context of ending public access to
the *result* field of the **Tcl\_Interp** struct.  The documentation
of **Tcl\_VarEval** at the time described the way it would manipulate
that field of the interpreter.  It must have seemed natural to think
both items needed to disappear together.

On the trunk of Tcl development, **Tcl\_VarEval** is still described
as deprecated, but the documentation of its function has been revised
to stop speaking of access to forbidden fields of a struct.  It is
described completely functionally, and that function has utility in
the right circumstances.

There does not appear to be any compelling need to remove **Tcl_VarEval**
from the public interface.  Indeed when a sweeping effort to complete
deprecations of public routines was undertaken
in TIP [485](485.md), that routine was not included.

# Specification

Remove classification of **Tcl_VarEval** as deprecated in the
documentation and anywhere else.

# Compatibility

No issues.

# Copyright

This document has been placed in the public domain.

Added tip/663.md.

































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 663: Cease distribution of the ChangeLog files
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        26-Apr-2023
	Tcl-Version:    8.7
	Tcl-Branch:	tip-663
	Vote-Summary	Accepted 9/0/0
	Votes-For:	DP, BG, KW, AK, FV, JN, JD, MC, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

This TIP proposes we stop distributing the ChangeLog files in the
Tcl and Tk releases.

# Background

The source code history of Tcl and Tk goes back to 1998, roughly
corresponding to the 8.0p2 releases.  Both projects were in development
many years before that, but our fossil repositories do not record
that work.

In all our releases of Tcl and Tk since then, we have included files
in the distribution root directory with names matching `ChangeLog*`.
These files recorded the commit logs from source code management
that went into the source code in the release.  There are multiple
files with suffixes like `ChangeLog.2004`, because some editors on
some systems at the time could not act on large text files with
adequate performance.  When Tcl was developed with SCM systems
based on a central server with limited access, this was a reasonable
way to export development history information to the users of Tcl and Tk.

Source code management for Tcl and Tk moved to fossil in 2011.
The commit log messages became available publicly to anyone. After
two years, the non-value of continuing to grow the `ChangeLog*` files
became clear.  They have been unmaintained since 2013.  Everything
in them is now a historic record of events a decade or more in the past,
and available to be searched and discovered online.

# Rationale

The value of the contents of the `Changelog*` files no longer reasonably
outweighs the cost of cluttering the root directory.

# Specification

End the distribution of the `ChangeLog*` files in all Tcl and Tk source code
releases 8.7 and later.

# Compatibility

No issues expected.

# Implementation

See the branch [tip-663](https://core.tcl-lang.org/tcl/timeline?r=tip-663) .

# Copyright

This document has been placed in the public domain.

Added tip/664.md.































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 664: Enable compiler warnings for missing int → Tcl_Size conversions
	Author:		Jan Nijtmans <[email protected]>
	State:		Withdrawn
	Type:		Project
	Vote:		Done
	Created:	02-05-2023
	Tcl-Version:	9.0
	Tcl-Branch:	tip-664
	Vote-Summary:	Accepted 7/0/0
	Votes-For:	AF, AK, DKF, JN, KW, MC, SL
	Votes-Against:	none
	Votes-Present:	none
	Obsoleted-By:	661
-----

# Abstract

The TIPs [481](https://core.tcl-lang.org/tips/doc/trunk/tip/481.md)
and [616](https://core.tcl-lang.org/tips/doc/trunk/tip/616.md)
introduced macro constructs which hide the C API changes from Tcl 8.6
to Tcl 9 and disable compiler warnings. This tip proposes to enable
those compiler warnings, as a help for people who want to make their
extension fully capable of handling strings > 2^31.

If users want to disable this warning they can do that by using
their normal compiler options, e.g. (for clang/gcc):
<pre>
    configure CFLAGS=-Wno-incompatible-pointer-types
</pre>
Users disabling/ignoring this warning are not harmed in any way,
although it is not recommended. This should encourage, rather
than force, extension writers to update their code.

All _battery-included_ extensions (`Itcl`, `tdbc*`, `thread`) are
already converted to use `Tcl_Size` everywhere necessary.

# Rationale

When TIPs [481](https://core.tcl-lang.org/tips/doc/trunk/tip/481.md)
and [616](https://core.tcl-lang.org/tips/doc/trunk/tip/616.md) were
implemented/proposed, the `Tcl_Size` type didn't exist yet. The
main goal for Tcl 9.0 was - at that time - to keep everything
source-compatible as much as possible.
That means that extensions using `Tcl_GetStringFromObj(obj, &len)`
- where `len` points to an `int` variable - should keep working as-is.

Currently, extension-writers are starting to make their extensions
Tcl-9-ready, which means that they are able to use string/list lengths
> 2^31. That means the `int len` variable has to be replaced
by a `Tcl_Size len` variable. But Tcl doesn't provide any
help finding those instances. This TIP makes it much easier
for extension-writers to find those places in their code,
without any functional disadvantage: If the compiler warning
is ignored, still the extension will work as expected as
long as no strings/lists exceed the 2^31 limit.

# Implementation

Implementation is in [Tcl branch "tip-664"](https://core.tcl-lang.org/tcl/timeline?r=tip-664).

It only removes a lot of type-casts from `tclDecls.h`, which were
originally put there just to prevent this compiler-warning. There
is no change in implementation of any functions, so the only
effect of this proposal is to enable compiler-warnings for this
specific case, nothing else.

# Compatibility

If an extension which is originally written for Tcl 8.6 is built
with Tcl 9 and the compiler warnings are ignored by the developer,
and no strings or lists are used larger than 2^31 in size,
everything will function as before. Any use of strings or lists
larger then that in the extension will result in an error-message,
wherever possible. Only  `Tcl_GetStringFromObj()` and `Tcl_GetUnicodeFromObj()`
are not capable of returning an error-message, they will panic (as they do now).

# Copyright

This document has been placed in the public domain.

Added tip/665.md.

















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 665: Remove support for internal utf-16 for Tcl 8.7 (and 9.0)
	Author:		Jan Nijtmans <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	02-05-2023
	Tcl-Version:	8.7
	Tcl-Branch:	tip-665
	Vote-Summary:	Accepted 4/0/1
	Votes-For:	AK, JN, KW, SL
	Votes-Against:	none
	Votes-Present:	BG
-----

# Abstract

This TIP proposes to remove support for building
the Tcl 8.7 and 9.0 core with -DTCL_UTF_MAX=3,
more specifically: any value other than 4.

Extensions (like Tk) can still use -DTCL_UTF_MAX=3.

# Rationale

The TIPs [542](https://core.tcl-lang.org/tips/doc/trunk/tip/542.md)
and [622](https://core.tcl-lang.org/tips/doc/trunk/tip/622.md)
prepared Tcl 8.7 (and 9.0) to use utf-32 internally for all
operations, while - still - being able to use utf-16 internally.
This was used mainly for regression-testing. The "utf.test"
suite carefully compared the result of all utf-related
functions between the 8.6 result and the 8.7 result, making
sure that extensions won't be effected.

Now that the internal utf-32 handling has stabilized,
this "utf16" mode hinders further development more than that
it helps. Therefore this TIP proposes to remove it
as far as possible. The utf-16 compatibility layer,
which allows extensions (such as Tk) still being
compiled with -DTCL_UTF_MAX=3 is still kept. And
also the file tclUniData.c (which is generated from
the Unicode official data-tables, and kept equal in
Tcl 8.6/8.7/9.0) is left as-is.

# Implementation

Implementation is in [Tcl branch "tip-665"](https://core.tcl-lang.org/tcl/timeline?r=tip-665).

# Compatibility

Since the compatibility layer is kept as-is for extensions, this change
is fully upwards compatible with 8.6.

# Copyright

This document has been placed in the public domain.

Added tip/666.md.









































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 666: Change ptrdiff_t → Tcl_Size in Tcl 8.7 (and 9.0)
	Author:		Jan Nijtmans <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	03-05-2023
	Tcl-Version:	8.7
	Tcl-Branch:	tip-666
	Vote-Summary:	Accepted 5/0/0
	Votes-For:	AK, BG, JN, KW, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

The TIPs [627](https://core.tcl-lang.org/tips/doc/trunk/tip/627.md)
and [630](https://core.tcl-lang.org/tips/doc/trunk/tip/630.md)
prepared the Tcl 8.7 (and 9.0) API to be able to use more than 2**31
arguments in all commands, even though that wasn't possible
internally yet. This TIP proposes to use `Tcl_Size` in stead
of `ptrdiff_t` for all functions mentioned in those 2 TIP's.

In this way, most of the TIP [#627](https://core.tcl-lang.org/tips/doc/trunk/tip/627.md)/[#630](https://core.tcl-lang.org/tips/doc/trunk/tip/630.md)
implementations vanishes in Tcl 8.7 (but not in 9.0).

# Rationale

When TIPs [627](https://core.tcl-lang.org/tips/doc/trunk/tip/627.md)
and [630](https://core.tcl-lang.org/tips/doc/trunk/tip/630.md)
were implemented, the `Tcl_Size` type didn't exist yet. Therefore,
the extension to 64-bit was targeted (but not really functional)
to 8.7, and forwarded to 9.0. Now that `Tcl_Size` exists, it makes
more sense to remove those 64-bit functions from 8.7, so target
those 2 TIP's to 9.0 in stead of 8.7.

# Implementation

Implementation is in [Tcl branch "tip-666"](https://core.tcl-lang.org/tcl/timeline?r=tip-666) for Tcl 8.7.

Part of the implementation for Tcl 9.0 is already committed to [trunk](https://core.tcl-lang.org/tcl/info/cd426d20a9327f49),
ignoring the requirement that Tcl 9.0 should be as much as possible source-compatible 8.7.

# Compatibility

This change is 100% upwards compatible for 9.0, but not for 8.7. It will no longer
be possible to use `ptrdiff_t` for the functions mentioned in TIP #627 and TIP #630,
extensions will have to use `Tcl_Size` in stead.

# Copyright

This document has been placed in the public domain.

Added tip/667.md.



































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 667: Make "strict" the default encoding profile.
	Author:         Nathan Coulter <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Tcl-Version:    9.0
	Tcl-Branch:     tip-667
	Obsoleted-By:   657
-----
# Abstract

Although [TIP #657](657.md) purported to be about making the strict profile the
default, it also specified other things that were out of scope, specified
unnecessary implementation details, and included a partial alternative to
[TIP #653](653.md) in its *Compatibility* section (those changes have since
been incorporated into [TIP #653](653.md).  This TIP proposes that "strict"
become the default encoding profile for all operations.

# Rationale

The `tcl8` profile was until recently the only option for handling
encoding errors in channel content.  Now there are two additional profiles
available, `strict` and `replace`.

The most common use case for encoded data is to expect that if the operation
completed without error,  the data were correctly encoded and that no data were
lost in the result.  This corresponds to the `strict` encoding profile, so it
makes sense to make this profile the default.  Where it is not the default,
data may be silently corrupted, with the corruption being discovered only at
some later date after collateral damage, possibly including exploitation by bad
actors, has been discovered.

It is expected that scripts that must be adapted due to this change in default
behaviour will fail early and before real damage is done, making it easy to
detect where change is necessary and leading to a more secure and correct
scripting environment overall.  Functions like `fcopy`, `read` and `gets` throw
exceptions as soon as bad data is detected.  Where this is not desired it is
easy to remedy through trivial mechanical changes to existing scripts.

# Specification

New channels are by default assigned the `strict` profile, and both
`encoding convertfrom` and `encoding convertto` use the `strict` profile
by default.

`Tcl_FSEvalFileEx()` uses the `strict` profile, and therefore `source` uses
the strict profile.  The http package leaves any channels it opens in their
default strict configuration, so it too uses the `strict` profile.

`Tcl_ExternalToUtfDStringEx()`, `Tcl_UtfToExternalDStringEx()`,
`Tcl_ExternalToUtf()` and `Tcl_UtfToExternal()`, support operation in a mode
where any encoding error that occurs results in an `EILSEQ` POSIX error.  That
mode is now the default.  Other modes can be explicitly configured by the
caller to specify how these functions behave when invalid data are encountered.

Any test that in the Tcl test suite that requires a channel that is not
configured for strict encoding explicitly configures the channel according to
its needs.

# Further explanation


# Compatibility

This is an incompatible change for `Tcl_ExternalToUtf()`/`Tcl_UtfToExternal()`,
but since those functions are often called to operate in strict mode, it will
have little effect.

This is an incompatible change for `Tcl_Read()`, `Tcl_Write()`, `Tcl_Gets()`.
See TIP [653](https://core.tcl-lang.org/tips/doc/trunk/tip/653.md) for details.

# Implementation

The branch
[trunk-encodingdefaultstrict](https://core.tcl-lang.org/tcl/timeline?r=trunk-encodingdefaultstrict)
implements this TIP.


# Copyright

This document has been placed in the public domain.

Added tip/668.md.



















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 668: Consolidate all Tcl_Attempt* functions.
	Author:		Jan Nijtmans <[email protected]>
	State:		Draft
	Type:		Project
	Created:	11-05-2023
	Tcl-Version:	9.1
	Tcl-Branch:	tip-668
-----

# Abstract

The normal functions `Tcl_Alloc()`, `Tcl_Realloc()` (and a few more)
result in a Panic when the memory allocation fails. There are
alternative functions `Tcl_AtteptAlloc()`/`Tcl_AttemptRealloc()`
which return a NULL-pointer in this case. The advantage of the
*Attempt* form of those functions is that we no longer have to
check _before_  the function-call whether the `size` parameter
isn't too big, we can just make the call and check afterwards
whether it was possible or not. This TIP proposes to make this
behavior available to the normal `Tcl_Alloc()`/`Tcl_Realloc()`

# Rationale

TODO

# Implementation

The functions `Tcl_Alloc()`, `Tcl_Realloc()` have been removed,
and `Tcl_AtteptAlloc()`/`Tcl_AttemptRealloc()` renamed to
`Tcl_Alloc()`, `Tcl_Realloc()`. This means that everything will
keep functioning as before. The only visible change is that
instead of panicing, those functions might unexpectedly
return a NULL-pointer. Most likely, those null-pointers
eventually result in a null-pointer-exception, which is
just as bad as panicing.

Implementation is in [Tcl branch "tip-668"](https://core.tcl-lang.org/tcl/timeline?r=tip-668).

Eventually all `Tcl_Alloc()`, `Tcl_Realloc()` calls should
check their result, and handle a clean recovery when
allocation fails. Some newer code (like the improved _list_
implementation) already does that by using the Attempt*
functions. This change eliminates the need for special
Attempt*-functions, it just provides this for all
normal functions. This makes `Tcl_Alloc()`/`Tcl_Realloc()`
behave the same as the standard C `malloc()`, `realloc()`,
which also return a null-pointer on failure.

TODO

# Compatibility

TODO

# Copyright

This document has been placed in the public domain.

Added tip/669.md.









































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 669: Pipe PIDs as Channel Property
	Author:		Donal Fellows <[email protected]>
	State:		Draft
	Type:		Project
	Created:	24-05-2023
	Tcl-Version:	9.1
	Tcl-Branch:	tip-669
-----

# Abstract

This TIP is about making the information about pipes more regular in
line with the general model of channels. It adds an option, **-pid**,
to the pipe channel type.

# Outline

The mechanism behind **chan configure** allows for all sorts of
general concepts to be handled, depending on the channel type. This
TIP makes the information currently available via the **pid** command
also available via a **chan configure*** option for pipe channels,
**-pid**. This option will be read-only. When a pipe channel does not
know what process ID (or IDs) is on the other end, the value of the
option will be empty; this is expected to be the case for pipes made
with **chan pipe**.

Safe interpreters, in the event that they get a pipe channel, will not
see that the option exists.

# Implementation

To do.

# Copyright

This document has been placed in the public domain.

Added tip/670.md.































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# TIP 670: Simple Extra Procedures for File Access
	Author:		Donal Fellows <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	29-05-2023
	Tcl-Version:	8.7
	Tcl-Branch:	tip-670
-----

# Abstract

This TIP adds some simple procedures for common types of basic file access.

# Outline

I've been doing user support for a while and there are a few basic questions
that come up relatively frequently, such as "How do I read a file?" and "How
do I write a file?" Naturally, there common patterns for this. Let's make a
few of these be procedures in Tcl itself (much like **parray** for printing
arrays). These will be _explicitly_ procedures and they will be made available
for autoloading so they will be less likely to conflict with existing user
code.

The procedures will be **readFile**, **writeFile** and **foreachLine**.

Part of the purpose of these procedures is to act as samples of how to do
these sorts of tasks. They are not intended to handle all edge cases. They
are intended to be read by users of Tcl.

# Description of Procedures

## readFile

The **readFile** procedure will take one or two arguments. The first argument
shall be the name of an existing file, and the second argument, if provided
shall be either **text** or **binary** (or any unambiguous prefix thereof) to
indicate which mode to read the file in. The default mode shall be **text**.

In text mode, the successful result of **readFile** shall be the whole contents
of the file (up to whatever default EOF character Tcl uses), assuming it is
using the system encoding, including any trailing newlines. CRLF sequences and
so on will be normalized.

In binary mode, the successful result of **readFile** shall be the whole exact
byte content of the file without further interpretation.

Text mode will be much like this:

    proc readFile {filename} {
        set f [open $filename "r"]
        set data [read $f]
        close $f
        return $data
    }

Binary mode will be much like this:

    proc readFile {filename binary} {
        set f [open $filename "rb"]
        set data [read $f]
        close $f
        return $data
    }

The actual implementation will be more complex because of argument parsing
and ensuring that resources are managed correctly.

    proc readFile {filename {mode text}} {
        # Parse the arguments
        set MODES {binary text}
        set ERR [list -level 1 -errorcode [list TCL LOOKUP MODE $mode]]
        set mode [tcl::prefix match -message "mode" -error $ERR $MODES $mode]

        # Read the file
        set f [open $filename [dict get {text r binary rb} $mode]]
        try {
            return [read $f]
        } finally {
            close $f
        }
    }

## writeFile

The **writeFile** procedure will take two or three arguments. The first
argument shall be the name of a file to write. The final argument shall be the
contents to write to the file (_overwriting_ any existing file with that name;
the code will not be careful in this regard). If there are three arguments, the
second argument will be either **text** or **binary** (or any unambiguous
prefix thereof) to indicate the mode of operation. The default mode shall be
**text**. The successful result of **writeFile** shall be the empty string.

In text mode, the file will have the text written to it as provided, without
extra newlines (that is, we will uphold the expectation that using
**writeFile** with the result of **readFile** shall produce an equivalent
file). The platform default encoding and line mode shall be used. It is up to
the caller to provide any trailing newline if one is desired.

In binary mode, the file will have the binary data written to it exactly as
provided.

Text mode will be much like this:

    proc writeFile {filename data} {
        set f [open $filename "w"]
        puts -nonewline $f $data
        close $f
    }

Binary mode will be much like this:

    proc writeFile {filename binary data} {
        set f [open $filename "wb"]
        puts -nonewline $f $data
        close $f
    }

The actual implementation will be more complex because of argument parsing
and ensuring that resources are managed correctly.

    proc writeFile {args} {
        # Parse the arguments
        switch [llength $args] {
            2 {
                lassign $args filename data
                set mode text
            }
            3 {
                lassign $args filename mode data
                set MODES {binary text}
                set ERR [list -level 1 -errorcode [list TCL LOOKUP MODE $mode]]
                set mode [tcl::prefix match -message "mode" -error $ERR $MODES $mode]
            }
            default {
                set COMMAND [lindex [info level 0] 0]
                return -code error -errorcode {TCL WRONGARGS} \
                    "wrong # args: should be \"$COMMAND filename ?mode? data\""
            }
        }

        # Write the file
        set f [open $filename [dict get {text w binary wb} $mode]]
        try {
            puts -nonewline $f $data
        } finally {
            close $f
        }
    }

## foreachLine

The **foreachLine** procedure will take three arguments. The first shall be
the name of a variable in the calling scope, the second shall be the name of a
text file to read, and the third shall be a string containing Tcl code (that
will be evaluated in the caller's context). The platform default encoding will
be used.

A simplified version of the procedure will be as below:

    proc foreachLine {varName filename body} {
        upvar 1 $varName line
        set f [open $filename "r"]
        while {[gets $f line] >= 0} {
            uplevel 1 $body
        }
        close $f
    }

The full version will be more complex in order to do correct handling. In
particular, errors will leave the file closed, and **return**, **break** and
**continue** will be supported (with normal semantics) within the _body_.

The more complete version is this:

    proc foreachLine {varName filename body} {
        upvar 1 $varName line
        set f [open $filename "r"]
        try {
            while {[gets $f line] >= 0} {
                uplevel 1 $body
            }
        } on return {msg opt} {
            dict incr opt -level
            return -options $opt $msg
        } finally {
            close $f
        }
    }

The extra complexity with **try** handles getting **return** correct and
ensures that we always **close** the channel.

Another part of the purpose of **foreachLine** is to provide an example of
how to do the "I'm making a custom looping construct in Tcl code" pattern.
Having such things is good, very good, and part of what we encourage users to
write (because they understand what the things are to iterate over, and we'll
never manage to make all the base iterators in the core) but needs slight
tweaking to make work perfectly; the **foreachLine** source shows how to do
that including handling the tricky edge case that is **return** with a level
specified.

TIPs [#636](636.md) and [#644](644.md) may cause how the inner loop of
**foreachLine** is implemented. That's fine with me, but doesn't seem to be
particularly necessary here; the code will not get shorter.

Explicitly omitted are things like filtering of the lines to remove, say,
empty lines and comment lines; that's the sort of thing I put in my own file
iterators, but they're not general enough. And they can be done easily in user
code:

    foreachLine line filename.txt {
        set line [string trim $line]
        if {$line eq "" || [string match #* $line]} {
            continue
        }
        # Example of normalization
        processWordsOfLine [split [regsub -all {\s+} $line " "]]
    }

# Copyright

This document has been placed in the public domain.

Added tip/671.md.























































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
# TIP 671: New encoding profile - lossless
	Author:		Ashok P. Nadkarni <[email protected]>
	State:		Draft
	Type:		Project
	Created:	2023-06-04
	Tcl-Version:	9.1
	Tcl-branch:	tip-671
-----
<!-- TOC BEGIN (auto generated with tiptoc) -->
* <a href='#Abstract'>Abstract</a>
* <a href='#Rationale'>Rationale</a>
* <a href='#RelationtootherTIPs'>Relation to other TIP's</a>
* <a href='#Specification'>Specification</a>
    * <a href='#Thelosslessprofile'>The **lossless** profile</a>
    * <a href='#Encodingstrings'>Encoding strings</a>
    * <a href='#Channelconfiguration'>Channel configuration</a>
    * <a href='#Implicituseoflosslessprofiles'>Implicit use of lossless profiles</a>
        * <a href='#Affectedfilesystems'>Affected file systems</a>
        * <a href='#Filepaths'>File paths</a>
        * <a href='#Globalvariables'>Global variables</a>
        * <a href='#Internalstringrepresentation'>Internal string representation</a>
    * <a href='#Errorexceptions'>Error exceptions</a>
* <a href='#Discussion'>Discussion</a>
    * <a href='#Securityissues'>Security issues</a>
    * <a href='#Alternativemappings'>Alternative mappings</a>
    * <a href='#Tkcompatibility'>Tk compatibility</a>
* <a href='#Implementation'>Implementation</a>
* <a href='#References'>References</a>
* <a href='#Copyright'>Copyright</a>

<!-- TOC END -->

<div style='max-width: 50em;'>

# <a id='Abstract'></a>Abstract

This TIP proposes

* a new encoding profile, **lossless**, that will preserve roundtripping in the
presence of invalid byte sequences, and

* use of this new profile in various system interfaces such as those related
to file names, environment etc.

*Note: Round tripping is not always possible for some encoding even in the
absence of invalid bytes. This is because the mapping between Unicode and
those encodings is one->many. Examples are shiftjis and big5.*

# <a id='Rationale'></a>Rationale

The following examples provide the motivation for this TIP.

Unix file systems treat file paths as simple byte sequences while Tcl expects
them to be in the encoding returned by the `encoding system` command. Further,
the encoding in effect at the time a file is created by an application may
differ from that when the file is later accessed (different user, mounted file
systems etc.) which may result in the latter interpreting the file name as
containing invalid bytes for the encoding. This results in anomalous behavior as
illustrated by the following sequence wherein the `file exists` command claims a
file returned by `glob` does not exist. Other commands like `open`,
`file rename` etc. will also show analogous behavior.

```
% mkdir tmp
% encoding system iso8859-1
% cd tmp
% close [open \xe9 w]
% exec ls -b
\351
% file exists [lindex [glob *] 0]
1
% encoding system utf-8
% file exists [lindex [glob *] 0]
0
```

Similar issues exist with environment variables. For example, when passed down
to child processes two environment variables compare equal when they should not.

```
apnadkarni@IO$ export X=$'\351'
apnadkarni@IO$ export Y=$'\303\251'
apnadkarni@IO$ if [ "$X" = "$Y" ]; then echo Equal; else echo Unequal; fi
Unequal
apnadkarni@IO$ ./tclsh
% string equal $env(X) $env(Y)
1
```

Misinterpretation of environment variables can affect searches along `PATH` etc.

And in command line arguments:

```
apnadkarni@IO$ echo 'puts [string equal {*}$argv]' > x.tcl
apnadkarni@IO$ tclsh x.tcl $'\351' $'\303\251'
1
```

So for example, a file name passed down to `tclsh` from the `find` program
will not target the correct file (most likely failing).

**Note the TIP is not a panacea for all the problems related to encodings in
system interfaces. No general solution is possible and this TIP only addresses
certain common situations.**

# <a id='RelationtootherTIPs'></a>Relation to other TIP's

This TIP is orthogonal to
[657](https://core.tcl-lang.org/tips/doc/trunk/tip/657.md) and
[667](https://core.tcl-lang.org/tips/doc/trunk/tip/667.md) which propose
changing the default encoding profile to **strict**. Neither of those TIP's
currently specify the encoding profiles implicitly used by commands like `glob`,
`open` etc. that interface to system API's so the assumption is behavior will
remain as in the examples above. If those TIP's are updated to mandate the
`strict` profile for those commands, the problems are only exacerbated. For
example, the `glob` command in the example above will raise an error exception
making those directories completely unreadable.

# <a id='Specification'></a>Specification

This specification is based on the approach described in
[Unicode TR #36 Section 3.7 Enabling Lossless Conversion](https://www.unicode.org/reports/tr36/#EnablingLosslessConversion)
and Python's [PEP 383](https://peps.python.org/pep-0383/).

## <a id='Thelosslessprofile'></a>The **lossless** profile

A new encoding profile, named **lossless**, is defined which can be specified
anywhere that encoding profiles are accepted. When this profile is in effect
**for ASCII-compatible** encodings (those matching ASCII in the range 0:127),

* *Passthrough decoding transform* When converting an encoded byte stream to a Tcl
string (Unicode code point sequence), invalid bytes in the range 0x80-0xFF are
mapped to Unicode code points U+DC80-U+DCFF. In ASCII-compatible encodings
invalid bytes can only lie in this range.

* *Passthrough encoding transform* When converting a Tcl string to an encoded byte
stream, code points in the range U+DC80-U+DCFF are mapped to bytes values
0x80-0xFF. Code points not supported by the encoding are replaced with
a encoding-specific fallback character as for the `tcl8` and `replace`
profiles.

For encodings that are **not ASCII-compatible**,

* When converting an encoded byte stream to a Tcl string, invalid bytes
are mapped to the Unicode REPLACEMENT CHAR U+FFFD.

* When converting a Tcl string to an encoded byte stream, code points in the
range U+DC80-U+DCFF or not supported by the encodings are mapped to the encoding
dependent fallback character.

The rationale for the distinction between ASCII-compatible encodings and those
that are not is detailed in the [Discussion](#Discussion) section.

Lossless roundtripping using the `lossless` is only guaranteed when the same
encoding is used for input and output. Writing using a different encoding from
the one used for reading will naturally not be lossless as the invalid byte in
the input encoding that was "passed through" may very well be a valid byte in
the output encoding. In practice, this is not likely as the `lossless` profile is
generally in effect in the system commands which implicitly use the system
encoding for both encoding and decoding.

For illustrative purposes, the table below shows how the different profiles
behave in their treatment of invalid bytes in an encoded UTF-8 stream.

```
Profile   Encoded input   Tcl string             Encoded output
                   decoding->               encoding->
tcl8      \x41\xe1\x42    U+0041,U+00E1,U+0042   \x41\xc3\xa1\x42
strict    \x41\xe1\x42    * raises error *
replace   \x41\xe1\x42    U+0041,U+FFFD,U+0042   \x41\xef\xbf\xbd\x42
lossless  \x41\xe1\x42    U+0041,U+DCE1,U+0042   \x41\xe1\x42
```

Only the **lossless** profile preserves the original byte sequence after
roundtripping.

## <a id='Encodingstrings'></a>Encoding strings

The `encoding convertfrom` and `encoding convertto` commands will accept
`lossless` as a `-profile` option value and implement the appropriate behavior
described earlier depending on direction of conversion.

Analogously, the `lossless` profile can be effected in public C encoding
API's that accept profiles via their `flags` parameter by specifying the
`TCL_ENCODING_PROFILE_LOSSLESS` flag. These functions are `Tcl_ExternalToUtf`,
`Tcl_UtfToExternal`, `Tcl_ExternalToUtfDStringEx`, `Tcl_UtfToExternalDStringEx`.

## <a id='Channelconfiguration'></a>Channel configuration

Likewise, channels configured with `-profile lossless` via `fconfigure` or
`chan configure` commands will perform lossless encoding transforms on data
passed through the channel.

## <a id='Implicituseoflosslessprofiles'></a>Implicit use of lossless profiles

### <a id='Affectedfilesystems'></a>Affected file systems

The changes to encoding transforms implicitly used in commands that call
system API's only affects platforms that use the Unix/POSIX API's.
In particular,

* Windows is not impacted as its system API's use wide characters
strings natively and are not byte streams.

* The zipfs file system uses its own fallback strategy and will not be
changed under the presumption that the fallbacks implemented there have
been tuned to common usage in the zip world.

### <a id='Filepaths'></a>File paths

Commands that transfer file paths to or from the system will implicitly use the
system encoding with the `lossless` profile. These include `open`, `cd`, `pwd`,
`open`, `exec` `load`, `info nameofexecutable` as well as the `file` and
`chan` ensembles where applicable.

Note in the case of `exec` and the pipe version of `open`, passed arguments are
also encoded with the `lossless` profile.

The equivalent C API's for file access will also use `lossless` profiles when
translating file names into native form. This includes the internal
`ProcessGlobalValue` API's that are used to share native strings across threads
(executable name, encoding and library paths, host names).

### <a id='Globalvariables'></a>Global variables

Values read from the environment and stored in `env` at program start up will be
transformed using the system encoding and the `lossless` profile. Writes to the
`env` will also use the same combination when storing into the native environment.

Command line arguments stored to `argv` at program start up will be transformed
using the system encoding and `lossless` profile.

As for file paths, this only affects platforms that use the Unix/POSIX API's.

### <a id='Internalstringrepresentation'></a>Internal string representation

The conversions between the different Tcl's internal string representations
would need to allow for isolated low surrogates. This is already the case but
would need to continue to be so even if TIP 657 (which is silent on the matter)
passes.

## <a id='Errorexceptions'></a>Error exceptions

There are code paths within the Tcl core where there is no mechanism for
reporting or handling errors. With exception of memory allocation failures
(which result in a panic) encoding operations are always expected to succeed
which was true with the existing `tcl8` profile. The current `lossless`
profile implementation also adheres to this.

# <a id='Discussion'></a>Discussion

## <a id='Securityissues'></a>Security issues

The ability to smuggle invalid byte encodings to and from Unicode can lead to
security issues when a Tcl string that was decoded from a byte sequence using
encoding A is then encoded using encoding B. The byte that was invalid in
encoding A might be valid in encoding B and with special security implications
(path separator etc.). **This is a programming error as roundtripping should
always be done using the same encoding.** Nevertheless, to mitigate this, this
specification (following PEP 383** will not map byte values < 128 into the
U+DC00 surrogate space. Instead they are mapped to the encoding specific
replacement character.

Since values < 128 are valid for all ASCII compatible encodings, there is no
need to map them and thus this is generally not an issue. For encodings that are
not ASCII compatible, such as EBCIDIC, UTF-16 and UTF-32 roundtripping is thus
not possible as they will contain invalid bytes with values < 128 which will be
replaced by a fallback character.

**In practice, this limitation is of little consequence because the primary use of
the profile is across system interfaces and encodings not compatible with ASCII
are highly discouraged in the POSIX environments this TIP targets.** To quote
from [here](https://www.cl.cam.ac.uk/~mgk25/ucs/iso2022-wc.html)

*There are only 19 encodings currently used worldwide as legitimate POSIX
multi-byte locale encodings UTF-8, ISO-8859-1, ISO-8859-2, ISO-8859-3,
ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-13,
ISO-8859-15, EUC-JP, EUC-KR, GB2312/EUC-CN, KOI8-R, KOI8-U, VISCII,
WINDOWS-1251, WINDOWS-1256.*

## <a id='Alternativemappings'></a>Alternative mappings

There are other code point ranges that could have been used to map invalid
bytes such as code points above U+10FFFF, private use code points, private
use high surrogates etc. The primary reason for choosing U+DC00-U+DCFF was
that private use code points may conflict with some *application* that uses
private use code points for their own purpose. At the end of the day, it was
felt safer to stick to the PEP 383 choice as that has been around for many
years and (presumably) survived conflicts in real world use.

## <a id='Tkcompatibility'></a>Tk compatibility

If file names containing "wrapped" invalid bytes are displayed in a widget,
the bytes will be displayed using the replacement character glyph.

# <a id='Implementation'></a>Implementation

Implementation is in progress in the
[tip-671](https://core.tcl-lang.org/tcl/timeline?r=tip-671) branch.

# <a id='References'></a>References

1. [Unicode TR #36 Section 3.7 Enabling Lossless Conversion](https://www.unicode.org/reports/tr36/#EnablingLosslessConversion)

2. [PEP 383](https://peps.python.org/pep-0383/).

# <a id='Copyright'></a>Copyright

This document has been placed in the public domain.

</div>



Added tip/672.md.













































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 672: Extend $ substitution to include expressions as $(expression)

	Author:		Eric Taylor
	State:		Draft
	Type:		Project
	Created:	2023-06-06
	Tcl-Version:	9.1
	Tcl-Branch:	tip-672
-----

# Abstract

This TIP extends the $ substitution to include expressions as
$(expression).

# Rationale and Discussion

The current method for expressions using the `[expr]` command has 2
problems. First, it is difficult to BOTH read and write. Some, as in
TIP 282, go so far as to say it is ugly.

Secondly, as indicated in TIP 526, expressions should be braced, or
there can be problems with both security and performance.

Consider the following computation (from TIP 282):
```
  set x [expr {5*$y + 6*$z}]
  set w [expr {$x**2 + $y**2}]
  set v [expr {$w**2 + $y**2}]
```
The `[expr {...}]` constructs make the code considerably harder to
read. This TIP would propose that there be a shorthand as such:
```
  set x $(5*$y + 6*$z)
  set w $($x**2 + $y**2)
  set v $($w**2 + $y**2)
```
The implementation of this should also eliminate the requirement for
the braces from above, as braces would be assumed and code would be
compiled as though the parentheses were braces.

Since this is a `$` substitution, it would continue to work inside
double quotes with the expected result.

There would also be an advantage in some text editors, which already have 
parenthesis balancing and syntax coloring features.

Another Tcl implementation, JimTcl uses this `$(...)` substitution and it 
seems to work without problems.

# Version and Incompatibility

This TIP would apply to version 9. of Tcl. Since 9.* would be a major
release, it should allow for some incompatibilities.

One incompatibility is that it would require that the use of the null string `""` 
or `{}` as an array name would require a change from using $ substituion to using 
the 2 argument form of the set command.

Thus, to assign the variable `""` to a value, would still work for both scalars 
and array variables, as in:
```
  set {} foobar             ;# scalar variable
  set (index) "array value" ;# array variable
```
But the use of `$(index)` would have to change by using the set command:

```
  set var [set (index)]
```

One other possible incompatibility would be with the use of the subst command.
The issue here is whether `$(...)` would be a command or variable substitution
that subst has options to suppress.

# Examples

```
  % lassign {3.0 4.0} a b
  % set c $( sqrt($a**2 + $b**2) ) ;# 3 4 5 triangle
  5.0

  % lassign {1000 3} total number
  % puts "ave = $( double($total)/$number )" ;# demo usage inside quotes
  ave = 333.333333333

  .canvas addtag enclosed $($x - 20)  $($x + 20)  $($y - 20)  $($y + 20) 

```

# Specification

TBD

# Implementation

TBD

# Copyright

This document has been placed in the public domain.

Added tip/673.md.































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 673: Remove deprecated [trace] subcommands
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        07-Jun-2023
	Tcl-Version:    9.0
	Tcl-Branch:     tip-673
	Vote-Summary:	Accepted 5/0/0
	Votes-For:	AK, BG, DGP, JN, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

This TIP proposes removal of [trace] subcommands deprecated since the
release of Tcl 8.4.

# Background

The built-in command [trace] originally empowered Tcl programmers
to manage traces on Tcl variables.  Starting in Tcl 8.4, a new
capability was introduced to manage traces on the renaming or
deletion of commands in an interpreter.  The [trace] command was
re-architected to be able to manage both kinds of traces, and
was structured to be extensible to other types of traces.  This
extensibility was used again before release of Tcl 8.4.0 to introduce
execution traces [62](62.md).

The original subcommands used to manage variable traces were left in
place, but documentation in all releases Tcl 8.4.0 and later has declared
them to be deprecated and expected to be removed in a future release.

# Rationale

A new major release with an interface declared deprecated on day one
is an odd thing.  While there might be rare circumstances where a
compelling need can justify it, the usual practice should be that
if an interface is to be removed, the removal should be accomplished
no later than the next major release.  In the alternative, if the need for
continuity is so strong as to compel preservation of a deprecated interface
into a new major release, the decision to deprecate needs reconsideration.

# Specification

Remove the subcommands **variable**, **vdelete**, and **vinfo** from
the [**trace**] command implementation and documentation.

# Compatibility

Any scripts using the removed subcommands will need converting to use
the **trace ... variable** equivalents available in Tcl 8.4.0 and later.

# Alternatives

If this TIP fails a TYANNOTT vote, that outcome will be taken as a decision
to take these subcommands out of deprecated status, with appropriate
updates to comments and documentation.

# Copyright

This document has been placed in the public domain.

Added tip/674.md.

















































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 674: a new multiple expression command
	Author:         René Zaumseil <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Tcl-Version:    9.1
-----

# Abstract

This TIP tries to address some of the `[expr]` command shortcomings.
It was inspired by discussion on [tip-672] and the syntax of the `switch` command.

# Rationale

Tcl has already a `expr` command with a special syntax to do mathematical calculations.
Due to the choosen syntax the usage is sometimes cumbersome and it is not possible to change this.
The new command tries to fill this gap.

# Specification

The `let` command has the following syntax:

~~~tcl
	let ?-local? { var expr ?var expr? .. }
~~~

The command will sucessively set the `var` to the value of the next `expr`.
If `var` is equal `=` then the value of the expr will be appended to the return value of the `let` command.
If the `-local` switch is given then all used `var` are local to the `let` command.

# Options

* Allow multiple arguments instead of a single list of 
* Use another name instead of `let`.

* Define some special variable names (p.e. starting with "@") to define internal variables used in later `expr` without polluting the current namespace.

* Extend, reduce, change or use a totally different syntax to calculate the given `expr` value.

* Add syntax to deal with vectors, matrix, etc.

# Discussion

* aspect@tkchat:

Multi arg version:

	let a {$x + 20} b {$x - 20}

Single arg version is fragile because of mistakes with whitespaces:

	let {a $x + 20}
	
Only single var on start of version:

	let var expr ?expr?

* yorick@tcl-core:

~~~
I still prefer two separate commands, and names separate from expressions:
	let a {$x + 20} b {$x - 20}
	.canvas enclosed {*}[calc {$x + 20} {$x - 20} {$y + 20} {$y - 20}]
If the number of arguments supplied to [let] are odd, the last argument could be the unnamed procedure body to evaluate:
	set result [let a {$x + 20} b {$x - 20} {
		# do stuff with $a and $b
		set c something
		return {some result}
	}]
	# a b and c does not exist at this point
~~~

* Steve Landers@tcl-core: I don´t like either of them. Why not enhance canvas...

	.canvas enclosed {$x + 20} {$x - 20} {$y + 20} {$y - 20}


	
# Examples

* set variable simple case

~~~tcl
    # expr
	set x [expr {1+2}]
    set y [expr {3*4}]
    set z [expr {$x+$y}]
    # let
	let {x 1+2 y 3*4 z $x+$y}
~~~

* use values

~~~tcl
	canvas .c
	set x 10
	set y 10
	# = x,y coord
	# expr
	.c create text [expr {$x+1}] [expr {$y+1}] -text a
	# let
	.c create text {*}[let {= $x+1 = $y+1}] -a
	# = coord list
	# expr
	.c create text [list [expr {$x+1}] [expr {$y+1}]] -text b
	# let
	.c create text [let {= $x+1 = $y+1}] -b
~~~

* calculations

~~~tcl
	set i 0.5;
	# expr
	set x [expr {sin($i)}]
	set y [expr {cos($i)+$x}]
	set z [expr {$x+$y}]
	# let
	let {x sin($i) y cos($i)+$x z $x+$y}
	let {
	  x sin($i)
	  y cos($i)+$y
	  z $x+$y
	}
~~~

# Implementation

The real implementation should be done in C.
The following implementation can be seen as proof of concept.
Especially a proper error handling is missing.

~~~tcl
	proc let {args} {
      if {[llength $args] == 2} {
        lassign $args mySwitch myList
        if {$mySwitch ne {-local}} {
          error "wrong switch: $mySwitch"
        }
      } elseif {[llength $args] == 1} {
        lassign $args myList mySwitch
      } else {
        error {wrong #args, should be: let ?-local? "var expr .."}
      }
	  set myRet {}
      set myVars {}
	  foreach {var exp} $myList {
        if {$var eq {=}} {
	      lappend myRet [uplevel 1 expr [list $exp]]
        } else {
	      uplevel 1 set $var \[expr [list $exp]\]
          lappend myVars $var
        }
        if {$mySwitch eq {-local}} {
          uplevel 1 unset -nocomplain {*}$myVars
        }
	  }
	  return $myRet
	}
~~~

# Discussion

# Copyright

This document has been placed in the public domain.

Added tip/675.md.































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 675: Control cursor blinking cycle in Ttk widgets.
        Author:        Francois Vogel <[email protected]>
        State:         Final
        Type:          Project
        Vote:          Done
        Vote-Summary:  4/0/0
        Votes-For:     BG, SL, FV, KW
        Votes-Against: none
        Votes-Present: none
        Created:       13-Jun-2023
        Tcl-Version:   8.7
        Keywords:      Tk, Ttk, cursor, blink
        Tk-Branch:     tip-675
-----

# Abstract

This TIP adds script-level control on the on and off times of the insertion cursor of Ttk widgets.

# Rationale

From time to time people have been requesting control on the blink cycle of the insertion cursor displayed by certain widgets (entry, spinbox, combobox). Tk provides this feature for a very long time, but Ttk currently doesn't.

See for instance tickets [3531366fff](https://core.tcl-lang.org/tk/tktview/3531366fffffffffffffffffffffffffffffffff) and [c7046ba187](https://core.tcl-lang.org/tk/info/c7046ba187), and in the newsgroup [here](https://groups.google.com/g/comp.lang.tcl/c/Gc75MZiocaY/m/6bR_FUpvAgAJ) and [there](https://groups.google.com/g/comp.lang.tcl/c/1pjqbtcWRnM/m/gZekObTh5fwJ).

The most wanted feature is to have a mean to switch cursor blinking entirely off, because some people cannot work with blinking cursors.

# Specification

New style defaults "-insertontime" and "-insertofftime" can be set, controlling application-wide cursor blinking times in all Ttk widgets. Values are in milliseconds.

Setting "-insertofftime" to 0 switches blinking off.

# Example

<pre style="padding-left:10pt">
package require Tk
pack [ttk::entry .ee]    ; # cursor blinks
focus -force .ee         ; # see cursor blinking
ttk::style configure . -insertofftime 0  ; # stop cursor blinking
</pre>

# Alternatives

## A - Instead of style defaults, get the values from the user preferences

In ticket [3531366fff](https://core.tcl-lang.org/tk/tktview/3531366fffffffffffffffffffffffffffffffff), and also in [1dc430ad59](https://core.tcl-lang.org/tk/tktview/1dc430ad598bd5bedc8d8c82478ff5c8c8991e8c), it has been proposed to get the on/off times from the platform environment settings (in the window manager). While respecting user's preferences sounds like a good idea, I believe it sets too high a bar. Retrieving the values from Linux environments is not trivial (see the patches in the first mentioned ticket), and I'm afraid maintenance of such code would be cumbersome. Tk doesn't do that either. As a first step at least, I propose not to bother with the platform settings and let users and script programmers to set their values through:

<pre style="padding-left:10pt">
ttk::style configure . -insertofftime myOFFtime -insertontime myONtime
</pre>

## B - Create a new command instead of using a style default

For instance one could imagine a new subcommand in the "tk" command:

<pre style="padding-left:10pt">
tk ttkinserttimes ?value value?
</pre>

or a new "ttk" command mimicking the behaviour of the "tk" command:

<pre style="padding-left:10pt">
ttk inserttimes ?value value?
</pre>

but I felt more natural to go for a style default just like all of the other defaults Ttk uses.

# Implementation

See branch [`tip-675`](https://core.tcl-lang.org/tk/timeline?r=tip-675)

# Post-vote note

Following discussion on the [Tcl Core](https://sourceforge.net/p/tcl/mailman/message/37866508/) mailing list, the possibility of overriding the on and off default times with values obtained from the option database (if such values are specified) has been added after the TIP was voted YES.

# Copyright

This document has been placed in the public domain.

Added tip/676.md.

































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 676: An "expr" alternative - "calc" command aliased to "="
	Author:         Colin Macleod <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Tcl-Version:    9.1
	Created:	23-Jun-2023
-----

# Abstract

This TIP proposes adding a new command **calc** which will allow numeric and
boolean calculations to be written in a more compact form than with **expr**.
The `calc` command will evaluate expressions compatibly with `expr` but in
unbraced, presubstituted form.

It also proposes to make a standard predefined alias of **=** to **calc**
which will permit numeric computations to be written within other
commands in a more compact and natural form than at present, with no
modification to Tcl's parsing rules.

# Rationale

Most newcomers to Tcl, and some oldies, find **expr** awkward. The requirement
to brace expressions for safety and performance leads to e.g. a canvas command
with computed coordinates looking like:

    .canvas addtag enclosed [expr {$x - 20}] [expr {$x + 20}] \
            [expr {$y - 20}] [expr {$y + 20}]

The wiki page <https://wiki.tcl-lang.org/page/expr+shorthand+for+Tcl9>
records many suggestions for a more compact syntax, one of
which has also been proposed in TIP 672.  This shows that the issue has been a
concern for many years.  However all of these proposals involve changing the
basic Tcl parsing rules (the *dodekalogue*), which has a major impact in terms
of extra complexity and backward compatibility.  This TIP aims to allow such
inline expressions to be as concise as possible *without* changing Tcl's
parsing rules.  The effect will be to allow the canvas command above to be
written as:

    .canvas addtag enclosed [= $x - 20] [= $x + 20] [= $y - 20] [= $y + 20]

Note that the values of variables (x and y in the example above) will have
been substituted into the expression *before* `calc` is invoked,
`calc` itself does no further substitutions of any kind.

There are some downsides to this method:

* String and list arguments and operations cannot be supported, as arbitrary
  strings could have values which cause them to be misinterpreted as
  operators, parentheses or numbers - 
  since the quoting around them would be stripped off before `calc` saw them.

* Lazy evaluation of `&&`, `||` and `?:` would not be possible.

* The tokens of the expression must all be passed as separate arguments,
  e.g. `[= $x - 20]` not `[= $x-20]`. This is necessary to avoid variable
  substitutions introducing new syntax elements, and also to avoid shimmering
  of numerical values.

But many uses of `expr` are for simple numeric calculations where these
restrictions do not matter, but brevity is desirable.  The standard `expr`
would still be available for use in the more demanding cases.

An alternative which already exists for inline calculations is to use
operations from the `mathop` namespace in prefix form.  However this is rather
obscure to people who are not Tcl experts, and becomes awkward if several
different operators need to be combined.

# Specification

The `calc` command will have syntax:

 * ***calc*** **arg** ?**arg arg ...**?

It will evaluate expressions in a way which is compatible with `expr` with the
following differences:

* Only numerical and boolean values and operations are supported.

* No substitutions (variable, command, backslash) will be performed by the
  `calc` command.  Any variable or other substitutions which are desired
  should be done by the usual Tcl means *before* the `calc` command is
  invoked, therefore the arguments to `calc` should *not* be braced.

* Each syntactic token of the expression must be passed as a separate
  argument to `calc`, i.e. each numeric or boolean value, each operator
  or parenthesis must be separated by spaces.

The following alias will be predefined:

    interp alias {} = {} calc

Defining this as an alias will allow any existing code which defines an "="
command to continue working.  However new code can use `[= <expr>]` as a
compact way to make a calculation.

# Options

* Concerns were raised on tcl-core that not being able to support lazy
  evaluation of `&&`, `||` and `?:` in `calc` could cause confusion.
  If this is felt to be a problem, these operators could be excluded from
  `calc` altogether, just as they are not included in the `tcl::mathop`
  namespace.

# Discussion

The first draft of this TIP proposed implementing this functionality as an
option on the `expr` command so that the arguments would be concatenated and
then tokenised as `expr` does.  Peter Da Silva pointed out that this would
allow arguments intended as single values to introduce new syntactic elements,
potentially changing the entire meaning of an expression.  E.g.

    set b 3/0
    ...
    calc $a - $b
    => divide by zero!

To avoid this I decided to require the arguments to be separate tokens, so
that no substitution of values can introduce new syntactic elements.
At the time I thought this might also enable supporting string and list
values, but later realised that it's not that simple.  E.g. if the parser sees
"(" it has no way of telling whether this is the start of a parenthesised
subexpression or just a string value that happens to contain "(".

So it then became clear that this functionality was sufficiently different
from `expr` to make it a separate command.  Also when I looked into the `expr`
parsing code I realised that a separate implementation would be more practical.

At one stage I considered making invoking `calc` with a single argument a
special case, just returning that argument with no parsing or processing.
However this would prevent detecting what could be a common error case -
passing the expression without spaces as can be done with `expr` - so I
concluded it would be unwise.

# Examples

Setting a variable:

        set bright [= $red * 0.3 + $green * 0.59 + $blue * 0.11]
        set x [= $radius * cos( $angle )]

Use with an image command:

        my_img put $shade -to [= $left + $i] $top [= $left + $i + 1] $bottom

# Implementation

I have written a prototype of this functionality in Tcl, the code is at
<http://www.cmacleod.plus.com/tcl/calc.tcl>.  This code uses a simple
"Pratt" parser and generates bytecode which is then run by
tcl::unsupported::assemble .  For the real implementation my intention
would be to translate the same code into C.

I think byte-compilation of `calc` should be possible and worthwhile.
For the normal case where all operators and parentheses are written as
literals and only numeric or boolean values will be substituted at run-time,
it should be possible to do the parsing at compile-time and generate reusable
bytecode.  However there would need to be a run-time check that the
substituted values are actually numeric or boolean.  E.g. the command

    calc $a - 2

would be compiled assuming that $a has a numeric value and therefore the "-"
is a infix subtraction.  But if $a should have the value "-" we need to
reparse this as two unary minus operators.  Such cases can be expected to be
rare, but do need to be handled.  So the compiled bytecode needs to check that
all substituted values are numeric or boolean and fall back to the uncompiled
implementation if this does not hold.  I'm not sure how to write this yet but
think it should be possible.  Perhaps it would be enough to just run the
bytecode and if it returns an error then somehow fall back to the uncompiled
implementation?

# Copyright

This document has been placed in the public domain.

Added tip/677.md.

























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 677: Constant Variables
	Author:         Donal Fellows <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        29-Jun-2023
	Tcl-Version:    9.0
	Tcl-Branch:     tip-677
	Vote-Summary:	4/0/2
	Votes-For:	DKF, BG, MC, KW
	Votes-Against:	
	Votes-Present:	SL, DGP
-----

# Abstract

This TIP proposes a way to define variables as if they were named constants
in Tcl code.

# Rationale

While Tcl doesn't need that many constants by comparison with many other
languages, as we can use symbolic names directly (witness how we handle
flags to `open`), there are still the occasional thing where we want to
have a value in a variable that isn't written to again.

An example of such is where you store a complex regular expression in a
variable in order to give it a more mnemonic name. Rewriting such is going
to be an infrequent action, as it will require reworking all the code that
uses it as well; for the duration of the execution of a procedure or
existence of a namespace, the variable is not to be changed.

It's possible to effectively make such variables by using a trace to set a
variable back, but that's quite messy.

The advantage of having a special mechanism for this is that it is much
easier to see the intention on the part of the author of the code that
the value in a variable not be ever modified during the running of the
code. This will also permit more efficient code generation at some point;
a _known_ constant is much more likely to be analysable during the
generation of bytecode (or during any other possible future execution
strategy).

# Specification

This TIP proposes a new command, **const** that defines a "constant"
variable in the current scope. It may be used either in a procedure (or
method or lambda) to define a constant variable with local scope, or in a
namespace (or at the top level) to define a constant variable with scope
to that namespace (according to usual variable scoping rules).

 * **const** _varName value_

The _varName_ may be a qualified name. If **const** is used with a qualified
name in a procedure, it does not make a local alias to that name. (That is,
**const** does not duplicate **namespace upvar**.)

The _varName_ must *not* be the name of an array element, even via 
**upvar**. Arrays may not contain constant variables by any means.
The result of the **const** command will be the empty string.
The _varName_ may be an alias (**upvar**, **global**, etc) to a variable
in another scope; it is the target of that alias that will become the
constant.

A constant variable may be read like any other variable (but the bytecode
compiler _may_ replace its use in code with something more efficient).

A constant variable may not be written to or unset, except if the local
scope or namespace is being deleted.

Write and unset traces will not fire on failed writes to or unsets of a
constant variable, except (for unset traces only) when the containing scope
is being deleted. The call to **const** on an existing constant will not
fire a write trace, but a call when the variable is not defined will fire a 
write trace on the variable if one is defined.

The variable must not exist prior to **const** creating a constant variable
(unless it is a constant variable; in that case, **const** silently does
nothing). That is, `$varName` must be in a state where it will fail unless it
is a constant.

## Introspection

Two **info** subcommands are provided for working with constants:

* **info consts** ?_pattern_?

  Returns a lists of constants in the current scope, optionally matching 
  against _pattern_. (It's **info vars** with additional filtering by 
  whether the variable is a constant.)

* **info constant** _varName_

  Returns a boolean value indicating whether the _varName_ resolves to a 
  variable that is a constant.

# Known Consequence

If a constant variable is created in the global namespace, it necessarily
will endure with that value until the interpreter terminates.

# Implementation

See the [`tip-677`](tcl/timeline?r=tip-677) branch.

# Copyright

This document has been placed in the public domain.

Added tip/678.md.



































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 678: Better API for Detached Treeview Items
	Author:         Donal Fellows <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        07-Sep-2023
	Tcl-Version:    9.0
	Keywords:       Tk, Ttk
	Tk-Branch:      treeview-list-detached
-----

# Abstract

This TIP proposes a method for **treeview** widgets for better working
with detached items.

# Rationale

One of the features of the **treeview** is that it allows an item to be
_detached_ and then reattached elsewhere, providing a means where chunks of
the tree can be moved around cheaply. However, as
[this Stack Overflow question](https://stackoverflow.com/q/77036665/301832)
hints at, if you lose the IDs of the detached items, there's no way to get
them back. This is at odds with Tk's general principles of discoverability.

# Specification

This TIP proposes a new subcommand for **treeview** widgets,
**detached**, for discovering detached items and querying the detached status
of an item. It can be used in two ways:

 1. _widget_ **detached**

    Returns a list of all detached items of the treeview widget in an arbitrary
    order. (The implementation uses the natural iteration order of the internal
    hash table mapping from item names to item records.)

 2. _widget_ **detached** _item_

    Returns a boolean value that is true when the given _item_ is detached.

Items are considered to be detached when they have no parent or siblings
_and are not the root item_. (Note that the root item cannot be detached;
this is enforced by existing code.) Items with a detached parent are not
themselves considered to be detached.

# Copyright

This document has been placed in the public domain.

Added tip/679.md.























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 679: General access to X window properties
	Author:		Schelte Bron <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	22-Sep-2023
	Tcl-Version:	8.7
	Tk-Branch:	tip-679
	Keywords:       tk, window manager
-----

# Abstract

This TIP proposes to add a method to the **wm** command to provide general
access to the X properties of a Tk toplevel window.

# Rationale

The **wm** command currently provides the possibility to manipulate a
selected set of X window properties through various subcommands. It may be
useful in some situations to be able to set and retreive other properties as
well. For example, to use a global menu (MAC style common menu bar at the
top of the screen) on KDE, it is necessary to set the
\_KDE\_NET\_WM_APPMENU\_SERVICE\_NAME and
\_KDE\_NET\_WM\_APPMENU\_OBJECT\_PATH properties. Currently you would have
to call out to the external **xprop** command to do that. An additional
complication is that these properties must be set on the wrapper window,
that holds the toplevel and the menubar. There is currently no method to
obtain the id of that window from a script. The information can be extracted
from the output of the external **xwininfo** command. But that is fragile;
the output format may change in future versions. It is also inconvenient to
have to instruct users to install the two packages that provide these
external commands.

# Specification

This TIP proposes a new subcommand for the **wm** command, **property**.
This subcommand is only available on the x11 windowing system. The new
subcommand is defined as:

 > **wm** **property** _window_ ?_name_? ?_value_? ?_type_? ?_width_?

When all arguments are provided, the named property will be set to the
specified _value_ of _type_ and _width_. The _type_ argument defaults to
**STRING**. A property can be deleted by specifying a _type_ of **None**.  
Valid values for _width_ are 8, 16, and 32. Some types may place further
restrictions on the set of valid widths. When omitted, _width_ defaults to 8
for the **STRING** and **UTF8_STRING** types, and 32 otherwise.  
The form of the _value_ argument depends on the _width_: When _width_ is 8,
the value should be a byte array, as produced by the _binary encode_ or
_encoding convertto_ commands, for example. For a _width_ of 16, it must be
a list of integers. For a _width_ of 32, _value_ is treated as a list of
integers and/or atom names.  
When only the _window_ and _name_ arguments are provided, the value of the
property is returned, if set. For 8-bit values, the result is a byte array.
For other values, a list of integers is returned. The **-propertytype** and
**-propertyformat** return options contain the type and width of the
property.  
Finally, when just the _window_ argument is present, the command returns the
names of all properties that have been set for the toplevel window.  

# Implementation

Implementation is available in the
[tip-679](https://core.tcl-lang.org/tk/timeline?r=tip-679) branch of the Tk
repository.

# Open Questions

 * The format of the value argument and the return value of queries
   currently only depend on the width. Should special treatment be aplied
   for certain types: ASCII encoding/decoding of **STRING** types, UTF-8 
   encoding/decoding of **UTF8_STRING** types, and integer to atom name
   conversion when querying **ATOM** types?    

 * To prevent corrupting properties that are manupilated using other wm
   commands, the command does not allow modifying properties with names
   starting with WM\_ or \_NET\_WM\_. Does that perhaps cast too wide a net?

 * Are return options an acceptable method for returning the type and format
   of a queried property? An alternative would be to return a list of value,
   type, and format. But then the caller would have to extract the value
   from that list in the common case where they are just interested in the
   value.

 * Should (parts of) the property subcommand be simulated on windowing
   systems other than x11? 

# Copyright

This document has been placed in the public domain.

Added tip/680.md.







































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 680: Enhance definition of a "number" in Tcl
	Author:         Brian Griffin
	State:          Withdrawn
	Type:           Project
	Vote:           Pending
	Tcl-Version:    9.1
-----

# Abstract

Enhance the core GetInt, GetDouble, GetBoolean implementations to
accept valid `[expr]` expressions, computing and returning the resulting
value on each invocation.

# Rationale

In cases where arguments to commands are expected to be numbers,
integer or real, it is not uncommon to have some calculations required
to predetermine the value needed for the command.  This is sometimes
written with inline `expr` command substitutions.

	.c create text [expr {$x+1}] [expr {$y+1}] -text a

It would be nice to make complex lines like the above, easier to read:

	.c create text {$x+1} {$y+1} -text a

Now the command looks more like other (expression based) programming languages.

# Specification

Modify the `Tcl_GetInt()`, etc., by attempting to parse an expression after
failing to parse a valid number. If it fails, then report the normal
invalid number error, otherwise, evaluate the expression, confirm that
the result is a valid number, and return the number or an error as
appropriate.

The code should also check the `Tcl_ObjType` for an already compiled
expression to short circuit the string parsing steps.

# Discussion

From TIP 674:

* Steve Landers@tcl-core: I don´t like either of them. Why not enhance canvas...

	.canvas enclosed {$x + 20} {$x - 20} {$y + 20} {$y - 20}	


Gustaf Neumann: 

This is an interesting idea, somewhat similar to the index
expressions, but with the difference that these "number expressions"
could be used everywhere (for all arguments, but also in other
locations, where Tcl_GetInt*() is not meant to parse an argument). The
latter concerns me a little, since it has implications on provided
stack frames for resolving variables etc. For me, the exact
implications are not clear.

Peter Da Silva: 

You could avoid breaking any existing code or unexpectedly opening up
a new attack surface by using something like the {*} hack.

    .canvas enclosed {$}{$x + 20} {$}{$x - 20} {$}{$y + 20} {$}{$y - 20}

vs

    .canvas enclosed [expr {$x + 20}] [expr {$x - 20}] [expr {$y + 20}] [expr {$y - 20}]


Donal Fellows:

Now that's a much more sensible suggestion; no unexpected trouble in
scripts because it is currently definitely an error. I guess we'd need
to pick an initial indicator syntax (either {=} or {$} would work).

Having canvases do falling back to calling Tcl_Expr() on their
coordinate arguments isn't as good; they need to determine (in item
creation particularly) whether an argument is numeric in order to
decide when to stop parsing values as coordinates and start parsing
them as options. It certainly would be possible, but there would be
some weird edge cases and the performance would likely be terrible.

Colin Macleod:

This could work (I would prefer {=} to {$} but that's a detail).
However this would require updating the Dodecalogue, so again it's
much deeper change than what I proposed in tip 676.

Also I think Peter's warning about "opening up a new attack surface"
should be taken seriously.  There may be old code which accepts user
input and then uses it in a numeric context without validation.  In
the past bad input would just have caused an error.  If a new version
of Tcl makes it possible to enter "1/0" or "[puts $::password] ? 2 :
3" and get this run, it will not be popular.

Brian Griffin:

Variable scoping and expressions with side effects (e.g. [expr {$a
+[incr y]}] ) are a serious issue. If a command processes arguments
out of order, then side-effects will have unexpected behavior. 

I do not think the attack surface is any different in any of these
solutions.  [expr] is another form of [eval], no matter what other new
short-hand syntax is invented. Any code that effectively does an
[eval] on unwashed data is vulnerable. 

I think the side effects issue alone is enough to disqualify TIP #680.


# Copyright

This document has been placed in the public domain.

Added tip/681.md.















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 681: Ttk "size"-related options
	Author:		Jan Nijtmans <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	07-11-2023
	Tcl-Version:	9.0
	Tk-Branch:	gripsize
	Vote-Summary:	Accepted 4/0/0
	Votes-For:	FV, JN, KW, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

The Ttk options related to sizes are not always named _size_. This TIP is meant
to make those options consistent.

# Rationale

When Tk was made scalable (Thanks to Csaba!), a lot of ttk options changed
from being integers (pixels) to floats (screen units). This work made it
visible that some options were not named consistently. A major Tk
release is a perfect excuse to correct this.

There is hardly any code around using those options. The only ones I found
were scrollutil and tablelist from tklib (both from Csaba, and already adapted
for this change) and azure-ttk, sum-valley-ttk and ttk-themes (still need to be adapted)

If you want to make your ttk widgets/styles work for both Tk 8.x and 9.0, the solution
is to provide both options: ttk simply ignores any unknown options.

So in "ttk-themes", "-gripcount 16" should be changed to "-gripcount 16 -gripsize 24p".
As a bonus, the grip will become scalable in Tk 9.0, while the code still works with Tk 8.6 too.

# Implementation

The following options are renamed:
- -gripcount -> -gripsize      (for sash items)
- -indicatordiameter -> -indicatorsize (for indicators)
- -diameter	-> -size      (for treeitem)

With respect to -gripcount/-gripsize, there's a factor 2 involved, so "-gripcount 5" is
equivalent to "-gripsize 10" (or "-gripsize 7.5p", if you want to make it scalable).
The other options are renamed, nothing more.

Implementation is in [Tk branch "gripsize"](https://core.tcl-lang.org/tk/timeline?r=gripsize).

Since this is the first TIP brought into voting state for Tk 9.0, the renumbering
from 8.7 -> 9.0 is also done in the implementation branch.

# Copyright

This document has been placed in the public domain.

Added tip/682.md.

















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 682: Create tmp. widget in "option get" call
	Author:         René Zaumseil <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Tcl-Version:    8.7
-----

# Abstract

This TIP will allow the "option get" call to return option values of not already existing widgets.
Only the parent widget of the given widget path should exist.

# Rationale

Currently it is not possible to get values of not already existing widgets from the option database.
When creating megawidgets or wrapping existing widgets it can be necessary to get option values
before creating an widget. Currently this can be done p.e. with creating an frame widget, get option values,
and destroy the frame widget.i

The goal of this tip is to extend "option get" for this use case.
Alternatively a new method p.e. "option getnext" (the name is open for discussion) could be used.

# Examples

* current "option get" behaviour:

~~~tcl
    % option add *width 10
    % option get . width Width
    10
    % option get .x width Width
    bad window path name ".x" 
    % option get .x.y width Width
    bad window path name ".x.y" 
~~~

* new "option get" behaviour:

~~~tcl
    % option add *width 10
    % option get . width Width
    10
    % option get .x width Width
    10
    % option get .x.y width Width
    bad window path name ".x.y" 
~~~

# Implementation

The following C-code part from tkoOption.c should be changed.

Original code:

~~~c
    case OPTION_GET: {
        Tk_Window window;
        Tk_Uid value;

        if (objc != 5) {
            Tcl_WrongNumArgs(interp, 2, objv, "window name class");
            return TCL_ERROR;
        }
        window = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), tkwin);
        if (window == NULL) {
            return TCL_ERROR;
        }
        value = Tk_GetOption(window, Tcl_GetString(objv[3]),
                Tcl_GetString(objv[4]));
        if (value != NULL) {
            Tcl_SetObjResult(interp, Tcl_NewStringObj(value, -1));
        }
        break;
~~~

New version:

~~~c
    case OPTION_GET: {
        Tk_Window window;
        Tk_Uid value;

        if (objc != 5) {
            Tcl_WrongNumArgs(interp, 2, objv, "window name class");
            return TCL_ERROR;
        }
        window = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), tkwin);
        if (window == NULL) {
            Tcl_Obj *res = Tcl_GetObjResult(interp);
            Tcl_IncrRefCount(res);
            window = Tk_CreateWindowFromPath(interp,tkwin,Tcl_GetString(objv[2]),NULL);
            if (window == NULL) {
                Tcl_SetObjResult(interp, res);
                Tcl_DecrRefCount(res);
                return TCL_ERROR;
            }
            Tcl_DecrRefCount(res);
            Tcl_ResetResult(interp);
            value = Tk_GetOption(window, Tcl_GetString(objv[3]),
                Tcl_GetString(objv[4]));
            if (value != NULL) {
                Tcl_SetObjResult(interp, Tcl_NewStringObj(value, -1));
            }
            Tk_DestroyWindow(window);
        } else {
            value = Tk_GetOption(window, Tcl_GetString(objv[3]),
                 Tcl_GetString(objv[4]));
            if (value != NULL) {
                Tcl_SetObjResult(interp, Tcl_NewStringObj(value, -1));
            }
        }
        break;
~~~


# Copyright

This document has been placed in the public domain.

Added tip/683.md.



































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 683: Remove legacy "pack" and "scrollbar" syntax
	Author:		Jan Nijtmans <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	17-11-2023
	Tcl-Version:	9.0
	Tk-Branch:	tk-legacy
	Vote-Summary:	6 / 0 / 0
	Votes-For:	AK, DKP, FV, JN, KW, SL
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

Tk's "pack" and "scrollbar" commands have a legacy syntax, which is not
supported any more, but it still works in Tk up to 8.7. The code
related to this was never removed. Tk 9.0 is the right time to - finally -
get rid of this outdated code and documentation.

Also, the "-file" argument of "wish" is removed.

# Rationale

In versions of Tk before 4.0, the `scrollbar` `get` and `set` widget commands
had a different form. This old form is not noticeable any more:
<pre>
% .s set
wrong # args: should be ".s set firstFraction lastFraction"
</pre>
but if you provide 4 parameters in stead of 2 it still works.

The `pack` command has 4 old sub-commands (from before Tk 3.3), which
are not in use any more. Those are `after`, `append`, `before`, and `unpack`.
They are documented in the `pack-old.n` manpage, but nowhere else.

Tk doesn't use this old syntax anywhere any more. Applications shouldn't
use it any more; Any application using it was developed before Tk 4.0!

The "-file" argument of "wish" has been deprecated since 1994 (Tk 4.0).

# Implementation

Implementation is in [Tk branch "tk-legacy"](https://core.tcl-lang.org/tk/timeline?r=tk-legacy).

# Copyright

This document has been placed in the public domain.

Added tip/684.md.









































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 684: Add Support for Touchpad Scrolling to Tk
	Author:        Marc Culler
	State:         Final
	Type:          Project
	Vote:		Done
	Created:       28-11-2023
	Tcl-Version:   8.7
	Tk-Branch:     touchpad_events
	Vote-Summary:	7 / 0 / 0
	Votes-For:	MC,KW,FV,SL,JN,DF,AK
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

This TIP proposes to add Tk support for scrolling via the two-finger
gesture with a touchpad. It targets Tk 8.7 and the upcoming Tk 9.0.

# Background

Tk has supported mouse wheels since 1998. The design was that a
system-generated event reporting a click of the mouse wheel would be
translated to a modified TkKeyEvent. The type of the TkKeyEvent would
be a Tk-specific value (MouseWheelEvent), and the unsigned integer
keycode field of the TkKeyEvent would be repurposed to hold a signed
delta value. In the original implementation the value used in the
keycode field varied between platforms.

When it became common for laptops to have touchpads which can
interpret the two-finger scroll gesture, Tk inherited support for that
gesture by default. On all three of the major Tk platforms - Windows,
macOS and linux - the system would report touchpad scroll events by
using the same framework as was used for mouse wheel events. Windows
reports touchpad scroll events with MOUSEWHEEL and HMOUSEWHEEL
messages, but these messages have delta values which are not multiples
of 120. MacOS uses NSScrollWheel events to report touchpad scrolls,
but sets the hasPreciseScrollingDeltas property to YES. Linux sends
Button-4 and Button-5 events for touchpad scrolls. This accidental Tk
support for touchpads did not work great - it was not able to take
advantage of the high precision - but it was usable.

In 2020, TIP \#563 was passed. The stated purpose of the TIP was to
add a feature which made spinning the mouse wheel while the mouse
pointer was inside a horizontal scrollbar cause horizontal scrolling
to occur. The implementation of the TIP also devoted considerable
effort to uniformizing the MouseWheel bindings across platforms.

However, the effect of TIP \#563 on Tk's accidental touchpad interface
was overlooked. A two-finger touchpad scroll almost always has
non-zero values for both Δx and Δy. The implementation of TIP \#563
had the effect that the result of performing a two-finger scroll
gesture while the mouse pointer is in a vertical scrollbar would be to
scroll vertically by Δx + Δy. In particular, when a user was
attempting to slowly scroll downward the actual scrolling could move
in both directions. This problem was reported in ticket
[\[de3bbbcb68\]](https://core.tcl-lang.org/tk/tktview/de3bbbcb68)

# Rationale

This TIP proposes to both fix the issue reported in the ticket
mentioned above and to improve Tk by providing deliberate support for
scrolling with the two-finger gesture on a touchpad.

# Limitations

The implementation is currently limited to Windows and macOS Aqua. An
X11 implementation using libinput should be possible, but would
require understanding how to incorporate libinput into Tk. Testing
indicates that the undesirable artifacts are less severe in linux.

# Specification

The implementation of this TIP adds a new Tk-specific event type named
TouchpadScroll. As with MouseWheelEvent, a TouchpadScroll event
repurposes the TkKeyEvent struct. The event type is set to
TouchpadScroll and the 32 bit keycode field is used to store both Δx
and Δy as signed 16 bit values with Δx in the high order 16 bits and
Δy in the low order 16 bits.

To facilitate unpacking the delta values the implementation provides a
utility function named `::tk::PreciseScrollDeltas`. It can be used in
a binding script as follows:
<pre>
lassign [tk::PreciseScrollDeltas %D] deltaX deltaY
</pre>

To take full advantage of touchpad scrolling a widget should be able
to scroll at pixel resolution. While this is the case for text and
canvas widgets, there are many other widgets, such as listbox and
treeview, which can only scroll by "units", i.e. lines or
average-width characters. Since touchpad events are generated about 60
times per second during a scroll gesture, it does not work to scroll
by one unit each time that a TouchpadScroll event is received. In
order to deal with this issue, the serial field of the TkKeyEvent is
used to hold a counter which is incremented each time that a
TouchpadScroll event is generated. This allows a binding script to,
for example, only respond to every 5th TouchpadScroll event by testing
if the counter is divisible by 5. The value of the serial field is
accessible in a binding script via the %# substitution.

The TIP implementation includes TouchpadScroll event bindings for all
of the standard tk and ttk widgets for which such events are
appropriate. MouseWheelEvent bindings are also included, so these
widgets can be scrolled with either a mouse wheel or a touchpad.

# Backwards Compatibility

If the TIP implementation were merged, MouseWheelEvent bindings in
third-party widgets would continue to work as before, provided that
the user is using a mouse wheel. However, the two-finger scroll
gesture would no longer cause MouseWheelEvents to be generated. Hence
these third-party widgets would need to add TouchpadScroll bindings in
order to be scrollable with the two-finger gesture.

# Implementation

The implementation of this TIP is in the Tk [touchpad_events](https://core.tcl-lang.org/tk/timeline?r=touchpad_events) branch.

# Acknowledgements

This TIP project benefited from contributions from several people
besides the author. Christopher Chavez provided a great deal of
helpful background information about how scrolling works. Csaba
Nemethi provided both feedback and code for the project. Nicolas Bats,
who first reported the scrolling problem, contributed extensive
testing. Thanks to all of them.


# Copyright

This document has been placed in the public domain.

Added tip/685.md.





























































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 685: rename "string is unicode" to "string is transferable"
	Author:        Harald Oehlmann
	State:         Final
	Type:          Project
	Vote:          Done
	Created:       10-01-2024
	Tcl-Version:   8.7
	Tcl-Branch:    tip-685
	Vote-Summary:  4 / 2 / 0
	Votes-For:     BG, KW, MC, SL
	Votes-Against: DP, JN
	Votes-Present: none
	Obsoleted-By:  652
-----

# Abstract

This TIP proposes to rename "string is unicode" to "string is transferable".

# Background

[TIP 597](https://core.tcl-lang.org/tips/doc/trunk/tip/597.md) introduced "string is unicode". Please refer to this TIP for a description.
[TIP 652](https://core.tcl-lang.org/tips/doc/trunk/tip/652.md) proposes to remove this class from the "string is" command.

On a core list discussion, it was expressed:

   *   "string is unicode" may have value
   *   the class name "unicode" is miss-leading.
   *   the more appropriate class name "transferable" was proposed.
   *   a more generic command to get the list of all unicode character classes included in a string may superseed this command.
   *   the use of the ICU library may be the next step for those tasks.

# Rationale

The current class name "unicode" is seen as miss-leading, see [TIP 652](https://core.tcl-lang.org/tips/doc/trunk/tip/652.md).

The name "transferable" suggests, that the string is tested to be ready for a transfer to an external
resource like a file or data base.

It is proposed, that this TIP is voted together with [TIP 652](https://core.tcl-lang.org/tips/doc/trunk/tip/652.md).

# Specification

Rename:

<pre>
string is unicode ?-strict? data
</pre>

to 

<pre>
string is transferable ?-strict? data
</pre>

If [TIP 652](https://core.tcl-lang.org/tips/doc/trunk/tip/652.md) is accepted, this TIP is automatically widthdrawn.

Rename the directly connected C API function
<pre>
Tcl_UniCharIsUnicode
</pre>

to 

<pre>
Tcl_UniCharIsTransferable
</pre>

The manual page adds a phrase like:
"The purpose is to test a string to be transfered to an external resource."

# Implementation

The implementation of this TIP is in the Tcl [tip-685](https://core.tcl-lang.org/tcl/timeline?r=tip-685) branch.

# Copyright

This document has been placed in the public domain.

Added tip/686.md.













































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 686: Make NextWord/SelectNextWord behavior platform-independant
	Author:		Jan Nijtmans <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	29-1-2024
	Tcl-Version:	8.7
	Tk-Branch:	tip-686
	Vote-Summary:  3 / 0 / 0
	Votes-For:     FV, JN, SL
	Votes-Against: none
	Votes-Present: none
-----

# Abstract

The virtual events \<\<NextWord\>\>/\<\<SelectNextWord\>\> currently
behave in a platform-dependent way. On Windows, invoking those events,
the insert cursor will move to the beginning of the next word. On
UNIX, those events will make the insert cursor move to the end of
the current word, but - if the cursor is already at the end of
a word - it will jump to the end of the next word.

This TIP proposes the make this behavior platform-independent:
\<\<NextWord\>\> will move to the beginning of the next word.
\<\<SelectNextWord\>\> will extend the selection to the end of the
current word (or the next one, if the current position is
already at the end of the current word)

# Rationale

The current behavior for \<\<NextWord\>\> is not 'logical' on UNIX:
In stead of jumping to the next word it actually jumps to the
end of the current word. When traversing words, the behavior
on Windows is more logical: There it actually moves the
insert cursor to the beginning of the next word.

The current behavior for \<\<SelectNextWord\>\> is not 'logical'
on Windows. If you want to select a range of text, the
normal way to do this is use \<\<NextWord\>\> to move to the
word you want to begin selecting. Then use \<\<SelectNextWord\>\>
if you want to select a single word, use \<\<SelectNextWord\>\>
again if you want two words, and so on. Doing this,
will result in the spacing after the words being included
in the selection as well: You need to press \<\<SelectPrevChar\>\>
(eventually multiple times if there is more than one space).
On UNIX, this use-case works as expected.

This proposal is the same as currently implemented in
notepad++. It's a compromise between the original
Windows and the original UNIX behavior. But then
(contrary to most compromises) a compromise which
takes the best of both worlds.

So, let 'W' mean: including the spaces after the word
and 'U' not including those spaces. Then, let's compare with
other editors/viewers:

```
|   editor       |<<NextWord>>|<<SelectNextWord>>|
| -------------- | ---------- | ---------------- |
|Tk 8.6 (windows)|     W      |        W         |
|Tk 8.6 (UNIX)   |     U      |        U         |
|TIP #686        |     W      |        U         |
|notepad++       |     W      |        U         |
|word/wordpad    |     W      |        W         |
|nedit (UNIX)    |     W      |        W         |
|gedit           |     U      |        U         |
|Adobe Acrobat   |     U      |        U         |
```

Most editors take either the Windows approach, either the UNIX
approach. Notepad++ is the only editor I found which takes
the compromise approach, as in this TIP.

Nedit takes the Windows approach, even though it is running
on UNIX. Adobe Acrobat reader takes the UNIX approach, even
though it's running on Windows.

# Implementation

Implementation is in [Tk branch "tip-686"](https://core.tcl-lang.org/tk/timeline?r=tip-686).

# Copyright

This document has been placed in the public domain.

Added tip/687.md.











































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 687: locale support for word handling in text and entry
	Author:		Jan Nijtmans <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	30-1-2024
	Tcl-Version:	9.1
	Tk-Branch:	tip-687
	Vote-Summary:	
	Votes-For:	
	Votes-Against:	
	Votes-Present:	
-----

# Abstract

This TIP proposes to add the `-locale` option to the
text and entry widget and it's derivatives (so ttk and
spinbox as well). This option can be used to change the
algorithm used in virtual events `<<NextChar>>`,
`<<PrevChar>>`, `<<NextWord>>`, `<<PrevWord>>`
(and it's variants like `<<SelectNextChar>>`).
The locale will be handed to the ICU library, so it
can adapt the char- or word-division algorithm to
the specific locale.

If the locale is "", the ICU default locale is used. A
special locale "`regexp`" can be used to fall-back to a
locale-independent algorithm, using a regular expression.

Text tags have the new `-locale` option too. There's
also a new method [`$text locale index`] which can
be used to determine which locale is set for a specific
text index.

# Rationale

This TIP started with a [ticket](https://core.tcl-lang.org/tk/tktview/168f3ef130),
requesting to make the word break algorithm switchable: The ICU method of
char-/word-division is designed for natural languages, less for programming
languages.

The difference can be noted - for example - in the word `aujourd'hui`. With the
ICU algorithm, this is a single word. Using the "`regexp`" locale, it's split
into two parts.

# Implementation

Implementation is in [Tk branch "tip-687"](https://core.tcl-lang.org/tk/timeline?r=tip-687).

# Copyright

This document has been placed in the public domain.

Added tip/688.md.

















































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 688: clock command revision and speedup
	Author:		Harald Oehlmann <[email protected]>
	Author:		Sergey G. Brester <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	27-02-2024
	Tcl-Version:	8.7
	Tcl-Branch:	tip-688
	Vote-Summary:  3 / 0 / 0
	Votes-For:     JN, MC, SL
	Votes-Against: none
	Votes-Present: none
-----

# Abstract

Fix low [performance](#performance) of the clock command by a C implementation.
Change some corner cases in free scanning and format preferences.
Add new scan/format tolkens for zone and local seconds.
Add option *-now* to **format** to internalize common **clock seconds**
call.

# Rationale

The clock command was seen by FlightAware as critical for server
applications. A bounty was opened.

Sergey Brester developped a clock command rewrite in C in 2017 to get
FlightAware bounty #4. Since then, the branch is in use at FlightAware.
The branch originated for 8.6 was never merged due to small changes in
the command. The massive speedup by a factor of 15 to 100 can be viewed
[below](#performance) and is documented in this [RFC ticket](https://core.tcl-lang.org/tcl/info/ddc948cff9).

Sergey decided in this complete rewrite to do some changes as documented in the upper RFC and listed below.

# Specification

The main specification item is [**SPEED**](#performance) and lower memory footprint.

The proposed changes are:

   *   clock scan: preference of Gregorian date "%Y%m%d" over Julian date "%Y%j" if both are specified. See this [ticket](http://core.tcl.tk/tcl/tktview?name=e7a722cd35).
       Note: this only affects an ambiguous date (if day *%m%d* distinguish from *%j*), so basically only invalid input.

   *   Different priority of conflicting free form scan items: result for free scanning by relative date with given month. In the following example, current TCL applies "next 1 January" first", the proposal last. (see note on free form below)

~~~
 % # FreeScan : relative date with ordinal month (I said January)
 % clock scan "5 years 18 months 385 days next 1 January" -base 0 -gmt 1
-Fri Jul 21 02:00:00 CEST 1978
+Sat Jan 21 01:00:00 CET 1978
~~~

   *   Different priority of conflicting free form scan by relative date with given month and relative weekday. (see note on free form below)

~~~
 % # FreeScan : relative date with ordinal month and relative weekday (I said Fri in January)
 % clock scan "5 years 18 months 385 days next January Fri" -base 0 -gmt 1
-Sat Jul 22 02:00:00 CEST 1978
+Fri Jan 27 01:00:00 CET 1978
~~~

   *   additionally scan/format token *%Es* introduced to parse or format local seconds (in opposition to *%s* for posix seconds)

   *   two extended tokens: *%EJ* (calendar) and *%Ej* (astronomical) Julian day number with time fraction (as floating point number).<br/>
       (initially provided in [GH/tclclockmod/PR/16](https://github.com/sebres/tclclockmod/pull/16))

       The format group *%Ej* can be also used to convert float date-times of SQLite database, for example:

~~~
% clock format 1514764800 -format %Ej -gmt 1
2458119.5                                 
sqlite> select julianday(1514764800, 'unixepoch');
2458119.5

% clock format [clock scan 2458119.5 -format %Ej -gmt 1] -format {%Y-%m-%d %T} -gmt 1
2018-01-01 00:00:00
sqlite> select datetime(2458119.5);
2018-01-01 00:00:00
~~~

   *   value *-now* will be accepted as clock value for format or add functions, e. g. **clock format -now -f %u**

   *   new option clock scan ... **?-validate boolean?** (default 0), if 1 it'd check the scanned input and scan will fail by invalid values (like 30 Feb, or 13th month, or 61 minute, etc)<br/>
       (initially provided in [GH/tclclockmod/PR/10](https://github.com/sebres/tclclockmod/pull/10) as a faster, in C-written replacement for tcl'ed variant of [ticket [3475995]](https://core.tcl-lang.org/tcl/info/3475995fffffffff))<br/>
       Examples:

~~~
% clock scan "30 February 2018"
1519945200
% clock scan "30 February 2018" -valid 1
unable to convert input string: invalid day

% clock scan "2024-13-01"
1735686000
% clock scan "2024-13-01" -valid 1
unable to convert input string: invalid month

% clock scan "2024-12-01 30:00"
1733007599
% clock scan "2024-12-01 30:00" -valid 1
unable to convert input string: invalid time (hour)
~~~

   *   own extensions made in ParseClockFormatFormat, ParseClockScanFormat or DateParseActions are no more effective, as the scanning and formatting is pure C-implementation now

## Note about free form scan

The current 8.6.14 manual has the following warning on free form scanning:

If the **clock scan** command is invoked without a *-format* option, then
it requests a *free-form scan. This form of scan is deprecated.*
The reason for the deprecation is that there are too many ambiguities.
(Does the string **2000** represent a year, a time of day, or a quantity?)
No set of rules for interpreting free-form dates and times has been found
to give unsurprising results in all cases.

<h1 id="performance">Performance</h1>

Current performance increase (in comparison vs the original clock-ensemble):

type of clock usage &nbsp; &nbsp; &nbsp; | performance increase to original &nbsp; &nbsp; &nbsp; &nbsp; | new clock-engine &nbsp; | original clock
-------- | -------------------- | ----------- | ------------
`clock format` | 15 - 20 times faster | 0.27 - 4.28 µs/# | 5.45 - 45 µs/#
`clock scan -format` | 40 - 70 times (up to 100 times faster \*)<br/><sub>\* some previously extremely slow scans</sub> | 0.44 - 1.72 µs/# | 21 - 120 µs/#
`clock scan` (freescan) | 15 - 20 times | 0.51 - 5.84 µs/# | 12 - 77 µs/#
`clock add` | 50 - 90 times | 0.31 - 0.68 µs/# | 15 - 45 µs/#

The difference is much more larger, if the tests are running multi-threaded with parasitic load.

#### How the performance can be measured:

Tcl-core has a file [tests-perf/clock.perf.tcl](/tcl/file?name=tests-perf/chan.perf.tcl) which can be used to compare the execution times of original clock and new engine.
It can be also simply performed from the tclsh, using original and new branches.<br/>
Here is a diff illustrating that (which amounted to almost 95x speed-up):

~~~diff
  % timerate -calibrate {}
  % clock scan "" -timezone :CET; clock scan "" -gmt 1; # warming up
  % timerate { clock scan "2009-06-30T18:30:00 CEST" -format "%Y-%m-%dT%H:%M:%S %z" -gmt 1 }
- 62.0972 µs/# 16094 # 16103.8 #/sec 999.392 net-ms
+ 0.654699 µs/# 1437085 # 1527419 #/sec 940.858 net-ms
~~~

# Implementation

Implementation is in [TCL branch "tip-688"](https://core.tcl-lang.org/tcl/timeline?r=tip-688).

# Copyright

This document has been placed in the public domain.

Added tip/689.md.















































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 689: "namespace unknown" independent on caller namespace
	Author:		Harald Oehlmann <[email protected]>
	Author:		Jan Nijtmans <[email protected]>
	Author:		Sergey G. Brester <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	13-03-2024
	Tcl-Version:	8.7 and 9.0
	Tcl-Branch:	tip-689
	Vote-Summary:	
	Votes-For:	
	Votes-Against:	
	Votes-Present:	
-----

# Abstract

[TIP 181](./181.md) introduced *namespace unknown* to call the unknown handler of the caller namespace.
This TIP proposes to call the unknown handler of the namespace,
where the command could not be resolved.

# Rationale

A namespace assembles all commands of a package.
The purpose of a procedure registered by *namespace unknown* is to to dynamically handle procs in a namespace which do not exist on initial setup.
One application is auto loading on first use but other dynamic functions are possible.
Currently, this only works, if called from the own namespace.
If called from another namespace, the unknown handler of the other namespace is called.

This makes this feature unusable, as it is designed to be called from the outside.

Example:

~~~
    namespace eval ::t1 { namespace unknown ::u1 }
    proc ::u1 args {puts "u1 $args"}
    namespace eval ::t2 { namespace unknown ::u2 }
    proc ::u2 args {puts "u2 $args"}
    % namespace eval ::t1 {::t1::test}
    u1 ::t1::test
    % namespace eval ::t1 {::t2::test}
    u1 ::t2::test
~~~

As a demonstration, the TIP implementation also supplies a new ::tcl::clock
unknown handler, replacing the old `tclIndex` method for the `clock` command.

# Specification

*namespace unknown* should call the unknown function of the namespace where the proc was not found.

This changes the upper example to:

~~~
    % namespace eval ::t1 {::t2::test}
    u2 ::t2::test
~~~

# Details

  1. *namespace unknown* will be invoked independently to the current namespace of current frame.
    In opposite to [TIP 181](./181.md) even for this call:<br/>
    `    ::A::B::C::D::cmd`<br/>
    if *unknown* handler is set for any of that namespaces.

  2. The precedence of handler invocation: deepest NS with unknown-handler always wins (regardless from where exactly it was executed),
     thereby absolute namspace paths over relative paths. For the case of relative command name, firstly the current namespace and all
     parents will be inspected, hereafter if no one handler found, the affected namespaces relative global namespace, 
     at end the global *::unknown* handler.<br/>
    For instance, for this call:<br/>

    ~~~
        namespace eval ::A::B { C::D::cmd }
    ~~~

    the order of search for *namespace unknown* handler will be:

    ~~~
        ::A::B::C::D
        ::A::B::C
        ::A::B
        ::A
        ::C::D
        ::C
        ::
    ~~~

  3. The handler always get an originally supplied command name, which corresponds the command relative the caller frame
    (and therefore like by global *::unknown*, relative to `[uplevel {namespace current}]`).

    ~~~
        % namespace eval ::A::B::C { cmd }
        = cmd
        % namespace eval ::A::B { C::cmd }
        = C::cmd
        % namespace eval ::A { B::C::cmd }
        = B::C::cmd
        % ::A::B::C::cmd
        = ::A::B::C::cmd
    ~~~

    To obtain real normalized command name inside the handler, one could use something like this (e. g. with *auto_qualify* like global *::unknown* does):

    ~~~
        # fully-qualified command name:
        lindex [auto_qualify $cmd [uplevel {namespace current}]] 0
        # fully-qualified command name (without auto_qualify):
        regsub -all {(::){2}} [uplevel {namespace current}]::$cmd {::}
        # relative command name:
        regsub {^(::){1,2}foo::bar(::){1,2}} [uplevel {namespace current}]::$cmd {}
    ~~~

    Suggestion (not a part of this TIP, just as nice to have):<br/>
    For the last (to obtain normalized relative name) one could extend command *namespace tail* like this:

    ~~~
        % namespace tail
        namespace tail string ?relative?
        % namespace tail ::foo::bar::xxx::yyy ::foo::bar
        xxx::yyy
    ~~~

  4. Like in original implementation of [TIP 181](./181.md),
    only the first found *unknown* handler will be invoked.
    If logic of code expects to call *unknown* of near parent namespace instead, the handler must do that inside itself,
    for example using *tailcall* (to unfold recursion).

  5. There is a small compatibility issue possibly, because of the precedence matter.<br/>
    For instance:<br/>
    in case of 2 nested namespaces with handlers (`::A::B` and `::A::B::C`), for the call:

    ~~~
        namespace eval ::A::B { C::cmd }
    ~~~

    it'd invoke handler of `::A::B::C` now, where previously it'd rather invoke handler of `::A::B` (since another was not implemented yet).<br/>
    Although a negative impact is hardly believable, because previously it was rather unexpected behaviour.

# History

This TIP started as a [bug ticket](https://core.tcl-lang.org/tcl/info/910d67a229fe7f65),
not realizing that there was already a TIP describing the current behavior.

# Implementation

Implementation is in [TCL branch "tip-689"](https://core.tcl-lang.org/tcl/timeline?r=tip-689).

# Copyright

This document has been placed in the public domain.

Changes to tip/69.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# TIP 69: Improvements for the Tcl Hash Table
	Author:         George A. Howlett <[email protected]>
	Author:         Don Porter <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        16-Oct-2001
	Post-History:   
	Discussions-To: news:comp.lang.tcl
	Tcl-Version:    9.0
-----

# Abstract

This document describes various improvements to the existing Tcl hash
table.  They include support for 64 bit platforms, better memory
performance, and improved array hashing.  The goal is a hash table










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# TIP 69: Improvements for the Tcl Hash Table
	Author:         George A. Howlett <[email protected]>
	Author:         Don Porter <[email protected]>
	Author:         Donal K. Fellows <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        16-Oct-2001
	Post-History:   
	Discussions-To: news:comp.lang.tcl
	Tcl-Version:    9.1
-----

# Abstract

This document describes various improvements to the existing Tcl hash
table.  They include support for 64 bit platforms, better memory
performance, and improved array hashing.  The goal is a hash table

Added tip/690.md.























































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 690: Make "clock scan -valid 1" the default
	Author:		Jan Nijtmans <[email protected]>, Rolf Ade <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	20-03-2024
	Tcl-Version:	9.0
	Tcl-Branch:	tip-690
	Vote-Summary:   Accepted 6/0/0
	Votes-For:      AK, FV, JN, MC, KW, SL
	Votes-Against:  None
	Votes-Present:  None
-----

# Abstract

[TIP 688](./688.md) introduced a new *clock scan -validate 1* option,
which can detect more errors in the string being parsed, in stead of
trying to output a best-guess. This TIP proposes to make *1* the
default. If you don't want that, use *clock scan -validate 0*.

# Rationale

The current Tcl *clock scan* command accepts a wide range of strings
as dates which are obviously not a valid date string and does a
"best-guess" for this strings. This is not only true for the so called
"free format scan" but even if the -format option is used.

Example:

~~~
    % clock scan 2024-30-40 -format %Y-%m-%d -gmt 1
    1783641600
    % clock format 1783641600 -format %Y-%m-%d -gmt 1
    2026-07-10
~~~

This behaviour is rarely useful while validating user input. And is
almost never useful while parsing data formats which include dates.
A common pattern to overcome this *clock scan* behaviour in practise
if not using the "free form scan" is to string compare the original
date string with the result after a round-trip:

~~~
    set date 2024-30-40
    if {$date ne [clock format [clock scan $date -format %Y-%m-%d -gmt 1] -format %Y-%m-%d -gmt 1]} {
        # Not a valid date
    }
~~~

Since [TIP 688](./688.md) is is possible to use just the
*-validate 1* flag instead. And this works even for the "free format
scan".

Since "clock scan" is throwing an exception for *some* errors, but
just gives an illogical answer for other situations, this TIP
proposes to throw an exception for all such situations instead.

Example:

~~~
    $ tclsh9.0
    % clock scan "feb 30, 2024 12:00" -gmt 1
    unable to convert input string: invalid day
~~~

This behaviour change was left out of [TIP 688](./688.md) just to
prevent that the discussion got sidetracked by this behaviour change
from the main propose. The author of TIP 688 itself uses *-validate 1*
as default in his code.

In the supposed to be rare cases were the current "best-guess" *clock
scan* behaviour is seen as feature this behaviour can be restored with
a local *-validate 0* flag:

Example:

~~~
    $ tclsh9.0
    % clock scan 2024-30-40 -format %Y-%m-%d -gmt 1 -validate 0
    1783641600
~~~

In Tcl 8.6, this command (without `-validate 0`) gives the same answer
`1783641600`, which corresponds to the 1th of March.

# Specification

If the *-validate* option is not specified in the *clock scan* command, the value `1` will be assumed.

Note that the *-validate* option is located inside the (undocumented) ::tcl::unsupported::clock::configure
command. It is likely that this command will be removed in a future Tcl version.

# Compatibility

Very probably there is code out which banks on the current *clock
scan* behaviour to work as expected (e.g. splitting a date like
2023-11-03 into integers(!), do arithmetic as add 6 month, concat to
a date string and *clock scan* that). In that cases `-validate 0`
must be used.

But in much more cases this behaviour change would improve the quality
of existing reasonable code. Since *clock scan* right now raises error
on format error 

Example:

~~~
    % clock scan 2023-10-ab -format %Y-%m-%d
    input string does not match supplied format
~~~


such code has error handling at that places. In this cases the
detection of not valid date strings will just be better.

# Implementation

Implementation is in [TCL branch "tip-690"](https://core.tcl-lang.org/tcl/timeline?r=tip-690).

# Copyright

This document has been placed in the public domain.

Added tip/691.md.

















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 691: Setting -profile for tclsh/wish and the "source"/"open" commands.
	Author:		Jan Nijtmans <[email protected]>
	State:		Draft
	Type:		Project
	Vote:		Pending
	Created:	21-03-2024
	Tcl-Version:	8.7 and 9.0
	Tcl-Branch:	tip-691
	Vote-Summary:	
	Votes-For:	
	Votes-Against:	
	Votes-Present:	
-----

# Abstract

Tclsh and Wish, and the "source" and "open" commands have no
possibility to set the profile of the channel used to read the file.

Older UNIX platforms used the ISO8859-1 encoding, while many
older Windows systems use the CP1252 encoding. Starting with
Tcl 9.0 (TIP #587), the default encoding for the source command
is UTF-8. That creates problems for old Tcl scripts, which
were originally written in ISO8859-1 or CP1252: due to the
strict profile such scripts will start throwing an exception
in Tcl 9. As a quick workaround, one possibility would be
to change back the profile to "tcl8", as it was in Tcl 8.x.

This TIP is meant to provide a syntax for that.

On systems where the system-encoding was big5 or shiftjis,
it's best to explicitly provide the known encoding. E.g.
<pre>
$ tclsh -encoding shiftjis <file_in_shiftjis.tcl>
</pre>
Automatic detection of the encoding is out-of-scope
for this TIP.

# Rationale

Example:
<pre>
$ tclsh8.6 my_script.tcl
</pre>

Assume this script is written in ISO8859-1 encoding, but the system
encoding is UTF-8. Then, in Tcl 8.6 this will run fine. In Tcl 9.0
it will not run any more if there are bytes > 0x7F (unless they
form valid UTF-8 pairs, which is not very likely).

Best would be to convert "my_scipt.tcl" to UTF-8, then it will
run fine in both Tcl 8.6 and 9.0. But may-be that's not
possible (because the script is on a CDROM, for example)

Another example:
<pre>
$ tclsh8.6
source my_scipt.tcl
</pre>
Same problem. The only way to remedy this is:
<pre>
$ tclsh9.0
set f [open my_script.tcl]
fconfigure $f -profile tcl8
eval [read $f]
</pre>
This TIP proposes a new syntax:
<pre>
$ tclsh9.0
source -profile tcl8 my_scipt.tcl
</pre>

Finally
<pre>
$ tclsh9.0
set f [open my_script.tcl]
fconfigure $f -profile tcl8
eval [read $f]
</pre>
In the new syntax this could be shortened to:
<pre>
$ tclsh8.6
set f [open my_script.tcl TCL8]
eval [read $f]
</pre>

# Specification

The `Tcl_FSEvalFileEx`, `Tcl_GetStartupScript`, `Tcl_SetStartupScript` functions
are modified such that special values `TCL_ENCODING_UTF8_STRICT`,
`TCL_ENCODING_UTF8_REPLACE` or `TCL_ENCODING_UTF8_TCL8` are accepted
as encoding names as well.

tclsh/wish will get a new *-profile* option, setting the profile
to one of the available profiles. This option cannot be combined
with the *-encoding* option; it only can be used in combination
with the `UTF-8` encoding (which is implicit and the default).

In addition, the `source` command also gets a new *-profile* which
works exactly the same as the tclsh/wish command-line option.

Finally the `open` command gets 3 new `access` options (second
form only), `STRICT`, `TCL8` and `REPLACE`.

Currently one of `RDWR`, `RDONLY` or `WRONLY` is mandatory for
the second form of the `access` options. We don't want to make
it mandatory to specify `{RDONLY TCL8}`, that's why another
change is done making `RDONLY` the default.

# Implementation

Implementation is in [TCL branch "tip-691"](https://core.tcl-lang.org/tcl/timeline?r=tip-691).

There is also a simplified implementation for 8.6 in
[TCL branch "tip-691-for-8.6"](https://core.tcl-lang.org/tcl/timeline?r=tip-691-for-8.6)
where `-profile anyvalue` is just a dummy option, doing nothing. It won't be documented in 8.6.

# Copyright

This document has been placed in the public domain.

Added tip/692.md.

































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 692: Revise Tcl_GetAliasObj, remove Tcl_GetAlias()
	Author:		Jan Nijtmans <[email protected]>
	State:		Final
	Type:		Project
	Vote:		Done
	Created:	21-03-2024
	Tcl-Version:	9.0
	Tcl-Branch:	tip-692
	Vote-Summary:   Accepted 6/0/0
	Votes-For:      AK, FV, JN, MC, KW, SL
	Votes-Against:  None
	Votes-Present:  None
-----

# Abstract

Tcl_GetAliasObj and Tcl_GetAlias() are two functions doing the
same job but with a slightly different interface. No known
extension uses Tcl_GetAlias(), while Tcl_GetAliasObj() was
never extended to Tcl 9's 64-bit environment. This TIP
is meant to remedy that.

# Rationale

Let's complete the 64-bit transition for Tcl_GetAliasObj()

For Tcl_GetAlias() it would be possible to do the same. But
this function is not used anywhere in Tcl, and there is no known
extension using it.


# Specification

Revise Tcl_GetAliasObj() such that it's argcPtr parameter changes from
type "int *" to "Tcl_Size *". Remove Tcl_GetAlias() in Tcl 9.0
(deprecating it in Tcl 8.6/8.7).

When an extension is compiled with `-DTCL_8_API`, Tcl_GetAliasObj()
will be usable with both "int *" as "Tcl_Size *" parameter, the same
way as the other functions mentioned in TIP #616.

# Implementation

Implementation is in [TCL branch "tip-692"](https://core.tcl-lang.org/tcl/timeline?r=tip-692).

# Copyright

This document has been placed in the public domain.

Added tip/693.md.













































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 693: Restart the changes files
	Author:         Don Porter <[email protected]>
	State:          Final
	Type:           Project
	Vote:           Done
	Created:        27-Mar-2024
	Tcl-Version:    8.7 and 9.0
	Vote-Summary:	Accepted 8/0/0
	Votes-For:	DP, BG, AK, KW, MC, SL, FV, JN
	Votes-Against:	none
	Votes-Present:	none
-----

# Abstract

This TIP proposes a re-purposing and reformatting of the *changes* file.

# Background

Both Tcl and Tk have files named *changes* in the root directory
of their source code distributions.  These files have been growing
since at least 1990.  The *changes* file in Tcl is one of the largest
files in the distribution.

New content has been appended to the end of these files.  The contents
at the start of the files are some of the oldest contents of Tcl/Tk,
and of least value to any contemporary reader.

Unlike the recently deleted ChangeLog files (see TIP [663](663.md)),
the maintenance of the *changes* file is not incorporated into the
normal workflow of core developers.  This leaves the *changes* file
as a burden of release engineering of increasingly dubious value.

The formatting of items in the *changes* file has evolved into a set of
single line summaries, duplicating information from the Timelines
available online, with abbrevation that often becomes too cryptic.

Each release also prompts the creation of a file of Release Notes
which announces the release.  This is yet another duplication of
information, but one that uses more flexible structure and achieves
better readability.  The Release Notes are available from the
download area on SourceForge, but are not included in the release
itself at all.

# Rationale

The release of Tcl/Tk and the experience of Tcl/Tk users will be
improved with a reboot of these files.

# Specification

Following the example of the *README* file, the contents of
the changes files will be in Markdown.  The file name will
become *changes.md*.

Each minor release will restart with a new file, with
no content carried over from the prior minor releases (but see below).
The purpose of the file is to summarize differences in the release
compared with the previous minor release, limited to those changes that
have importance to programmers writing programs with the package.

The intent of the *changes.md* file is to be read by people.  Fitness
for automated processing is of secondary importance.  The file may
begin with a brief introduction, and the bulk of the file is made of
Markdown lists of items each describing a change of importance to programmers.

A precise format for each item in the file is not specified.
It is trusted that something workable will arise as we go.  It is
advised to aim for something more like the current Release Notes than
the current *changes* entries.  Items in the *changes.md* file should
be suitable to transfer to the Release Notes with little or no editing.
Brevity is important, but not to the point of becoming incomprehensible.
Markdown features should be used generously to provide hyperlinks to
TIPs or tickets or online resources where useful.  References to illustrative
examples in the test suite are also an option.

Items should not be dated, and need not be presented in
chronological order.  Credit should not be included.  The Timelines
and tickets are the place for that.  Any change that creates an
incompatibility should be indicated either by a mark or by segregation
into a separate list.

In an alpha or beta release, the items in the *changes.md* file are edited
to reflect the revised set of changes.  The *changes.md* file does not
contain a record of what features appeared in what alpha or beta release.

In a patch release, the changes new to the patch release are pre-pended
to appear in section(s) at the beginning of the *changes.md* file.  This
keeps the most recent, most useful information at the beginning of the file.

If the same bug is fixed in patch releases of multiple minor release
sequences, the *changes.md* files of those branches may share an item
in common.  Branch merging should be able to achieve this without undue
trouble.

Core developers are encouraged to add items to the *changes.md* file
when they merge a change to the development branch, though it is 
recognized it will take time to cultivate these habits.

# Copyright

This document has been placed in the public domain.

Added tip/694.md.

















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
# TIP 694: Define a definite test environment
	Author:         chw
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        2024-04-11
	Tcl-Version:    any
	Vote-Summary:
	Votes-For:
	Votes-Against:
	Votes-Present:
-----

# Abstract

This TIP proposes to establish a defined environment to perform an environment for testing Tcl

# Background

Following debates in https://core.tcl-lang.org/tcl/tktview/167e0635db79f05d23d766376f6eed32b1572451
it becomes obvious that very defined and confined environments for testing
corner cases of Tcl are desperately required.

# Rationale

As outlined above, a defined, confined environment for test and verification
with authoritative predication seems helpful in order to reduce discussion, distrust, and anger and to enable progress.

# Specification

Nothing can be exactly specified in this TIP for the time being.
However, to fulfill this TIP some defined platform has to be
chosen and agreed upon. Ideally an open source operating system
with suitable tooling due to its potentially eternal availability.
Plus of course the reciproce availability of the test tools
(currently valgrind).

# Copyright

This document has been placed in the public domain.

Changes to tip/86.md.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 86: Improved Debugger Support
	Author:         Peter MacDonald <[email protected]>
	Author:         Peter MacDonald <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Feb-2002
	Post-History:   
	Tcl-Version:    8.7
	Implementation-URL: http://pdqi.com/download/tclline-8.4.9.diff.gz
-----

# Abstract

This TIP proposes the storage by Tcl of source code file-name and
line-numbering information, making it available at script execution








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# TIP 86: Improved Debugger Support
	Author:         Peter MacDonald <[email protected]>
	Author:         Peter MacDonald <[email protected]>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        08-Feb-2002
	Post-History:   
	Tcl-Version:    9.1
	Implementation-URL: http://pdqi.com/download/tclline-8.4.9.diff.gz
-----

# Abstract

This TIP proposes the storage by Tcl of source code file-name and
line-numbering information, making it available at script execution