# Use `incr` to avoid initialisation

Incrementing an undefined variable will act like the variable was a zero. So an initial `set x 1` can be replaced with `incr x`, or an initial `set x 0` can be removed entirely. Same with similar functions like `append` and `lappend`.

# Looping

`time` can be used to repeat a block `n` times. `while` loops until a condition is true, if the condition is simple enough, you can escape it rather than use `{}` to save a byte. `for` loops are always longer than `while`s. `foreach`s can be replaced with `lmap`s.

``````set n 5;while \\$n {incr x \$n;incr n -1}
set n 5;time {incr x \$n;incr n -1} \$n
``````

# Nest statements

`[]`s can be used to recursively evaluate an expression, returning the value. So try to nest those `incr`s and `set`s when you can.

``````incr x
time {set x [expr \$x*[incr n]]} 5
``````

# Use numeric variables as variable variables

You can use anything as a variable name, even numbers, which can then be sourced from other variables. This are called variable variables in other languages like PHP, and can mostly be used as a source of unique uninitialised variables in loops.

``````# Generates squares
time {time {incr \$x \$x} [incr x];try puts\ \$\$x} 9
``````

# Construct expressions without evaluating them

You can assign mathematical expressions as strings to variables without evaluating them, to be evaluated later explicitly or as a condition for `if` and `while` statements. If you know the structure of the expression, you can even manipulate them with higher precedence operators.

``````set x 2+3
puts [expr \$x*0]
puts [expr 0*\$x]
``````