Version 2 of func

Updated 2004-05-09 16:50:50

Richard Suchenwirth 2004-05-09 - Functions in Tcl are typically written with the proc command. But I notice more and more that, on my way to functional programming, my proc bodies are a single call to expr which does all the rest (often with the powerful x?y:z operator). So what about a thin abstraction around this recurring pattern?

 proc func {name argl body} {proc $name $argl [list expr $body]}

(Might have called it fun as well... it sure is.) That's all. But to not make the page look so empty, here's some examples for func uses:

 func fac n     {$n<2? 1: [fac [incr n -1]]}
 func gcd {u v} {$u? [gcd [expr $v%$u] $u]: $v}
 func min {a b} {$a<$b? $a: $b}
 func sgn x     {($x>0)-($x<0)} ;# courtesy rmax

Pity we have to make expr explicit again, in nested calls... But func isn't limited to math functions (which, especially when recursive, come out nice), but for expr uses in testing as well:

 func empty list           {[llength $list]==0}
 func in    {list element} {[lsearch -exact $list $element]<0}
 func limit {x min max}    {$x<$min? $min: $x>$max? $max: $x}

Feel free to add more meaningful examples! In any case, no one can blame me for not using return in these sweet one-liners... :)


Arts and crafts of Tcl-Tk programming