Version 1 of lmap

Updated 2005-04-03 20:28:23 by suchenwi

Richard Suchenwirth 2005-04-02 - lmap is a "collecting foreach" which returns a list of its results. In Jim it is built in, but it can be easily had in pure Tcl:

 proc lmap {_var list body} {
    upvar 1 $_var var
    set res {}
    foreach var $list {lappend res [uplevel 1 $body]}
    set res
 }

Several usage examples are at Multiplication tables. Lmap is a compromise between Tcl and the classical functional programming function map, in that it takes a "quasi-lambda" which is split up into the _var name and the body arguments. However, this style is well-known from foreach, and somehow reads better:

 lmap i {1 2 3 4 5} {expr $i*$i}

vs.

 map [lambda i {expr $i*$i}] {1 2 3 4 5}

A cute variation is fmap (influenced by ApplyAll in Backus' FP; Joy has a comparable operator in cleave) which maps a list of functions on one argument:

 proc fmap {functions x}  {lmap f $functions {$f $x}}

Then we can write a file reader like this:

 proc << filename  {lindex [fmap {read close} [open $filename]] 0}

Category Functional Programming