Updated 2015-02-11 20:21:10 by dkf

Sarnold 2005-11-10 -- The purpose is to offer a simple let command that works very much like C assignements for basic computations. The goal is not to join the general thing, but rather to keep it simple for everyday work.

Here is how it works :
 let varname assignment arg ...
 When assignment equals the '=' string, behaves like 'set varname [expr arg ...]'.
 When assignment is the '=' string following an operator like +, -, *, / or %,
 it behaves like 'set varname [expr {$varname <operator> args}]'
% let a = 10
10
% let a = $a - 1
9
% puts $a
9
% let a *= 2
18

Please note that arguments do not have to be distinct. You can write this:
let a = $a+2

or this:
let a = 3 * 4

and even:
let a = {$b*cos($d)}

It is better to enclose expr-essions into braces when they contain variables.

Here it is :
 proc let {varname assign args} {
     upvar $varname leftvalue
     if {[llength $args]==1} {
         set args [lindex $args 0]
     }
     set args [uplevel expr $args]
     switch -exact -- $assign {
         += {set leftvalue [expr {$leftvalue+$args}]}
         -= {set leftvalue [expr {$leftvalue-$args}]}
         *= {set leftvalue [expr {$leftvalue*$args}]}
         /= {set leftvalue [expr {$leftvalue/$args}]}
         %= {set leftvalue [expr {$leftvalue%$args}]}
         =  {set leftvalue $args}
         default {error "invalid syntax : second argument is not an assignment"}
     }
     return $leftvalue
 }

See let.