# Subroutines in Tcl are created with the [proc] command, # which takes a list of formal parameters as its second # argument. # On activation, the parameters are bound to the "words" # of the call (which may contain data, variable/subroutine # names, executable expressions, etc). This is a variant # of call-by-name semantics. proc hypotenuse {x y} { return [expr {sqrt($x*$x+$y*$y)}] ;# Better still: use hypot() } set diag [hypotenuse 3 4] # => 5.0 # Subroutines may have a variable number of # arguments, by using the special argument "args": proc hypotenuse args { foreach {x y} $args break return [expr {hypot($x, $y)}] } # A subroutine can be applied to a list using [eval], # which concatenates and then executes its arguments. set a [list 3 4] eval hypotenuse $a # => 5.0 # It is possible to create local references # to variables in other stack frames using # [upvar], so the typical idiom for # pass-by-reference is to pass the variable's # name as argument, and [upvar] it: set nums [list 1.4 3.5 6.7] proc trunc-em {name} { upvar $name a set len [llength $a] for {set i 0} {$i < $len} {incr i} { lset a $i [expr {int([lindex $a $i])}] } } trunc-em nums |