Updated 2002-12-16 12:44:54

Richard Suchenwirth 2002-12-16 - Another thought experiment: how to implement variables with procs. This is in fact trivial - here's how to set such a variable:
 proc foo {} {return 42}

and it gets retrieved by bracketed call:
 puts [foo]

Procedures have the property that their names are visible in (at least) the defining namespace without need for declaration like global/variable. The downside is that they stay persistent until renamed away, while variables local to a procedure are automatically cleared up on return.

If you wish, you can of course sugar-wrap the above raw calls into a set look-alike:
 proc setp {name args} {
     switch [llength $args] {
        0   {#fall through}
        1   {proc $name {} [list return $args]}
        default {error "usage: setp name ?value?"}
     }
     $name
 }
 % setp foo 42
 42
 % setp foo
 42

See also procs as data structures for un-callable procs, and procs as objects for more complex state in procedures. The simple pattern above is sufficient for all values of a scalar variable.