```
Author: Jan Nijtmans <[email protected]>
State: Withdrawn
Type: Project
Vote: Pending
Created: 19-Feb-2020
Post-History:
Keywords: lset
Tcl-Version: 8.7
Tcl-Branch: lset-index
```

# Abstract

This TIP proposes to change the `lset`

command, such that situations previously resulting in an error result in a more logical outcome.

# Rationale

Commands like `string insert`

and `linsert`

are very flexible in how index underflow and overflow is handled. For example

% linsert {a b c} 2 x a b x c % linsert {a b c} 100 x a b c x % linsert {a b c} -10 x x a b c

We see that indices larger than the list size result in elements added at the end of the list. While all negative indices result in elements added at the beginning.

`lset`

does not have that flexibility:

% set x {a b c} % lset x 2 x a b x % lset x 3 y a b x y % lset x 4 z list index out of range % lset x -1 z list index out of range

# Specification

The function `Tcl_GetIntForIndex()`

is modified such that for any index value resulting in a negative
number, value `-1`

is returned. Also, any index value resulting in a number bigger than the list size
will result in exactly the list size. This means that all commands using `Tcl_GetIntForIndex()`

will
automatically gain part the functionality as built-in by `linsert`

and `string insert`

.

Also, `lset`

is modified not to consider index `-1`

as an error, but duplicate the functionaly
as done for large indices: Using negative indices results in adding elements to the left side of the list.

New situation:

% set x {a b c} % lset x 2 x a b x % lset x 3 y a b x y % lset x 4 z a b x y z % lset x -1 z z a b x y z

# Compatibility

With this change, `lset`

will not return the `list index out of range`

error-message any more.
Any application depending on this error-situation will be affected.

# Implementation

See the `lset-index`

branch.

This branch targets 8.7.

# Copyright

This document has been placed in the public domain.