If a variable varName does not exist, it is created with its value set to value and marked as a constant; this means that no other command (e.g., set, append, incr, unset) may modify or remove the variable; variables are checked for whether they are constants before any traces are called. If a variable varName already exists, it is an error unless that variable is marked as a constant (in which case const is a no-op).
The varName may not be a qualified name or reference an element of an array by any means. If the variable exists and is an array, that is an error.
Constants are normally only removed by their containing procedure exiting or their namespace being deleted.
proc foo {a b} { const BAR 12345 return [expr {$a + $b + $BAR}] }
Create a constant in a namespace to factor out a regular expression:
namespace eval someNS { const FOO_MATCHER {(?i)}\mfoo\M} proc findFoos str { variable FOO_MATCHER regexp -all $FOO_MATCHER $str } proc findFooIndices str { variable FOO_MATCHER regexp -all -indices $FOO_MATCHER $str } }
Making a constant in a loop doesn't error:
proc foo {n} { set result {} for {set i 0} {$i < $n} {incr i} { const X 123 lappend result [expr {$X + $i**2}] } }