TIP 502: Index Value Reform

Login
Bounty program for improvements to Tcl and certain Tcl packages.
Author:         Don Porter <dgp@users.sourceforge.net>
State:          Draft
Type:           Project
Vote:           Pending
Created:        26-Feb-2018
Post-History:   
Tcl-Version:	8.7

Abstract

Proposes reformed handling of Tcl index values.

Background

Many Tcl programmers may be surprised by this result

% lindex {a b} -4294967295
b

This is the consequence of two features of incumbent Tcl functionality. First, passing the value "-4294967295" to Tcl_GetInt(FromObj) results in a successful extraction of the C int value 1. Generally any supported formatting of any value between -UINT_MAX and UINT_MAX is accepted, but transformed into a value between INT_MIN and INT_MAX. Second, the internal routine/macro TclGetIntForIndex(M) implements a definition of Tcl index values where any value acceptable to Tcl_GetInt(FromObj) is also acceptable as an index of the same value. Both of these features are of questionable merit, but the first has a fair bit of compatibility constraint attached to it because it involves the behavior of public routines. The second should be more open to potential revisions.

Another source of possible surprise is demonstrated:

% lindex {a b} 4294967295
% lindex {a b} 4294967295+1
a
% lindex {a b} 4294967296
bad index "4294967296": must be integer?[+-]integer? or end?[+-]integer?

Proposal

Compatibility

Implementation

Taking shape on the tip-502 branch.

Copyright

This document has been placed in the public domain.

History