---
name: "lseq"
section: "3tcl"
platform: "linux"
package: "tcl9.0-doc"
version: "9.0.1+dfsg-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/lseq"
---

# lseq(3tcl)

Build a numeric sequence returned as a list

```

```

## NAME

lseq - Build a numeric sequence returned as a list

## SYNOPSIS

```
lseq start ?(..|to)? end ??by? step?
lseq start count count ??by? step?
lseq count ?by step?
```

```

```

## DESCRIPTION

The **lseq** command creates a sequence of numeric values using the given parameters *start*, *end*, and *step*. The *operation* argument "**..**" or "**to**" defines the range. The "**count**" option is used to define a count of the number of elements in the list. A short form use of the command, with a single count value, will create a range from 0 to *count*-1.

The **lseq** command can produce both increasing and decreasing sequences. When both *start* and *end* are provided without a *step* value, then if *start* \<= *end*, the sequence will be increasing and if *start* \> *end* it will be decreasing. If a *step* vale is included, it's sign should agree with the direction of the sequence (descending → negative and ascending → positive), otherwise an empty list is returned.  For example:

```
% lseq 1 to 5    ;# increasing
→ 1 2 3 4 5
% lseq 5 to 1    ;# decreasing
→ 5 4 3 2 1
% lseq 6 to 1 by 2   ;# decreasing, step wrong sign, empty list
% lseq 1 to 5 by 0   ;# all step sizes of 0 produce an empty list
```

The numeric arguments, *start*, *end*, *step*, and *count*, may also be a valid expression. The expression will be evaluated and the numeric result will be used.  An expression that does not evaluate to a number will produce an invalid argument error.

*Start* defines the initial value and *end* defines the limit, not necessarily the last value. **lseq** produces a list with *count* elements, and if *count* is not supplied, it is computed as:

```
count = int( (end - start + step) / step )
```

## EXAMPLES

```
lseq 3
→ 0 1 2
lseq 3 0
→ 3 2 1 0
lseq 10 .. 1 by -2
→ 10 8 6 4 2
set l [lseq 0 -5]
→ 0 -1 -2 -3 -4 -5
foreach i [lseq [llength $l]] {
    puts l($i)=[lindex $l $i]
}
→ l(0)=0
→ l(1)=-1
→ l(2)=-2
→ l(3)=-3
→ l(4)=-4
→ l(5)=-5
foreach i [lseq {[llength $l]-1} 0] {
    puts l($i)=[lindex $l $i]
}
→ l(5)=-5
→ l(4)=-4
→ l(3)=-3
→ l(2)=-2
→ l(1)=-1
→ l(0)=0
set i 17
         → 17
if {$i in [lseq 0 50]} { # equivalent to: (0 <= $i && $i <= 50)
    puts "Ok"
} else {
    puts "outside :("
}
→ Ok
set sqrs [lmap i [lseq 1 10] { expr {$i*$i} }]
→ 1 4 9 16 25 36 49 64 81 100
```

## SEE ALSO

[foreach(3tcl)](/foreach/3tcl.md), [list(3tcl)](/list/3tcl.md), [lappend(3tcl)](/lappend/3tcl.md), [lassign(3tcl)](/lassign/3tcl.md), [lindex(3tcl)](/lindex/3tcl.md), [linsert(3tcl)](/linsert/3tcl.md), [llength(3tcl)](/llength/3tcl.md), [lmap(3tcl)](/lmap/3tcl.md), [lpop(3tcl)](/lpop/3tcl.md), [lrange(3tcl)](/lrange/3tcl.md), [lremove(3tcl)](/lremove/3tcl.md), [lreplace(3tcl)](/lreplace/3tcl.md), [lreverse(3tcl)](/lreverse/3tcl.md), [lsearch(3tcl)](/lsearch/3tcl.md), [lset(3tcl)](/lset/3tcl.md), [lsort(3tcl)](/lsort/3tcl.md)

## KEYWORDS

element, index, list
