- Publicity: Public Only All

### ad-functional-procs.tcl

Functional Programming in Tcl? - Absolutely!

This library adds the expressive power of functional languages like LISP, Gofer or Haskell to the Tcl language!

If you don't know what functional programming is, here's a good place to start:

A general naming convention in this file is:f = a function

x = an element

xs = a list of elements

- Location:
- packages/acs-tcl/tcl/ad-functional-procs.tcl
- Created:
- March 29, 2000
- Author:
- Mark Dettinger <mdettinger@arsdigita.com>
- CVS Identification:
`$Id: ad-functional-procs.tcl,v 1.10.2.6 2021/02/22 16:12:38 antoniop Exp $ This was part of ACS 3 Added to OpenACS by bdolicki on 11 Feb 2004 I just converted proc_doc to ad_proc, added ad_library, fixed an unmatched brace in a doc string and wrapped everything in a namespace`

### Procedures in this file

- f::abs (public)
- f::all (public)
- f::and (public)
- f::any (public)
- f::bind (public, deprecated)
- f::bind2nd (public, deprecated)
- f::choose (public, deprecated)
- f::compose (public)
- f::cons (public)
- f::const (public, deprecated)
- f::copy (public)
- f::curry (public)
- f::cycle (public)
- f::drop (public)
- f::drop_while (public)
- f::elem_p (public)
- f::enum_from_to (public)
- f::even_p (public)
- f::factorial (public)
- f::filter (public)
- f::flip (public)
- f::fold (public)
- f::fold1 (public)
- f::fst (public)
- f::gcd (public)
- f::head (public)
- f::id (public)
- f::init (public)
- f::iterate (public)
- f::lambda (public, deprecated)
- f::last (public)
- f::lcm (public)
- f::lmax (public)
- f::lmin (public)
- f::map (public)
- f::max (public)
- f::min (public)
- f::mul (public)
- f::not_elem_p (public)
- f::nub (public)
- f::null_p (public)
- f::odd_p (public)
- f::or (public)
- f::pascal (public, deprecated)
- f::prime_p (public)
- f::product (public)
- f::products (public)
- f::qsort (public)
- f::reverse (public, deprecated)
- f::scanl (public)
- f::scanl1 (public)
- f::snd (public)
- f::span (public)
- f::split_at (public)
- f::sum (public)
- f::sums (public)
- f::tail (public)
- f::take (public)
- f::take_until (public)
- f::take_while (public)
- f::thd (public)
- f::transpose (public)
- f::uncurry (public)
- f::unzip (public)
- f::zip (public)
- f::zip_with (public)

### Detailed information

### f::abs (public)

f::absx

returns the absolute value of x

- Parameters:
x

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::all (public)

f::allpredxs

Takes a predicate pred and a list xs and returns 1 if all elements of xs fulfill pred.

## Examples

`all even_p {2 44 64 80 10} = 1`

`all even_p {2 44 65 80 10} = 0`

- Parameters:
pred

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::and (public)

f::andxs

reduces a list of boolean values using &&

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::any (public)

f::anypredxs

takes a predicate pred and a list xs and returns 1 if there exists an element of xs that fulfills pred

- Parameters:
pred

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::bind (public, deprecated)

f::bindf[args... ]

Deprecated. Invoking this procedure generates a warning.

binds args to the first k arguments of the n-ary function f and returns the resulting (n-k)-ary function DEPRECATED: As of tcl8.5, Tcl has native support for 'lambda' provided by means of 'apply' per TIP 194. Tcllib provides a 'lambda' package with procs that make use of it.

- Parameters:
f

- See Also:
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::bind2nd (public, deprecated)

f::bind2ndfarg

Deprecated. Invoking this procedure generates a warning.

binds arg to the 2nd argument of f DEPRECATED: As of tcl8.5, Tcl has native support for 'lambda' provided by means of 'apply' per TIP 194. Tcllib provides a 'lambda' package with procs that make use of it.

- Parameters:
f

arg

- See Also:
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::choose (public, deprecated)

f::choosenk

Deprecated. Invoking this procedure generates a warning.

Here's how to compute 'n choose k' like a real nerd. DEPRECATED: As of tcl8.5, Tcl has native support for 'lambda' provided by means of 'apply' per TIP 194. Tcllib provides a 'lambda' package with procs that make use of it.

- Parameters:
n

k

- See Also:
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::compose (public)

f::composefgx

function composition: evaluates f (g x)

- Parameters:
f

g

x

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::cons (public)

f::consxxs

inserts x at the front of the list xs

- Parameters:
x

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::const (public, deprecated)

f::constk

Deprecated. Invoking this procedure generates a warning.

Returns a unary function that ignores its argument and constantly returns k.

## Example

DEPRECATED: As of tcl8.5, Tcl has native support for 'lambda' provided by means of 'apply' per TIP 194. Tcllib provides a 'lambda' package with procs that make use of it.

`map [const 7] [list 1 2 3 4 5] = {7 7 7 7 7}`

- Parameters:
k

- See Also:
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::copy (public)

f::copynx

returns list of n copies of x

- Parameters:
n

x

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::curry (public)

f::curryf[args... ]

Converts a function that takes one tuple as an argument into a function that takes a series of single arguments.

- Parameters:
f

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::cycle (public)

f::cyclenxs

returns concatenated list of n copies of xs

- Parameters:
n

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::drop (public)

f::dropnxs

returns the remaining elements of xs (without the first n)

- Parameters:
n

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::drop_while (public)

f::drop_whilepxs

returns the remaining portion of the list

- Parameters:
p

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::elem_p (public)

f::elem_pxxs

checks if x is contained in s

- Parameters:
x

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::enum_from_to (public)

f::enum_from_tolohi

generates {lo lo+1 ... hi-1 hi}

- Parameters:
lo

hi

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::even_p (public)

f::even_pn

returns 1 if n is even and 0 otherwise

- Parameters:
n

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::factorial (public)

f::factorialn

compute n!

- Parameters:
n

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::filter (public)

f::filterpredxs

Returns all elements of the list

xsthat fulfill the predicatepred.## Examples

`filter even_p {3 1 4 1 5 9 2 6} = {4 2 6}`

`filter [lambda {x} {expr $x>500}] {317 826 912 318} = {826 912}`

- Parameters:
pred

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::flip (public)

f::flipfab

takes a binary function 'f' and two arguments 'a' and 'b' and returns f b a (arguments are flipped)

- Parameters:
f

a

b

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::fold (public)

f::foldfexs

Takes a binary function f, a start element e and a list {x1 x2 ...} and returns f (...(f (f (f e x1) x2) x3)...).

## Examples

`fold + 0 [list 1 2 3 4] = 10`

`fold * 1 [list 1 2 3 4] = 24`

- Parameters:
f

e

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::fold1 (public)

f::fold1fxs

Takes a binary function f and a list {x1 x2 x3 ...} and returns (...(f (f (f x1 x2) x3) x4)...).

"fold1" behaves like "fold", but does not take a start element and does not work for empty lists.

## Examples

`fold1 min [list 3 1 4 1 5 9 2 6] = 1`

`fold1 max [list 3 1 4 1 5 9 2 6] = 9`

- Parameters:
f

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::fst (public)

f::fstxs

returns the first element of a list

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::gcd (public)

f::gcdxy

returns the greatest common divisor of x and y

- Parameters:
x

y

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::head (public)

f::headxs

first element of a list

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::id (public)

f::idx

Identity function: just returns its argument.

I'm not kidding! An identity function can be useful sometimes, e.g. as a default initializer for optional arguments of functional kind.

- Parameters:
x

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::init (public)

f::initxs

all elements of a list but the last

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::iterate (public)

f::iteratenfx

Returns {x (f x) (f (f x) (f (f (f x))) ...}.

## Examples

`iterate 10 [lambda {x} {expr $x+1}] 5 = {5 6 7 8 9 10 11 12 13 14}`

`iterate 10 [lambda {x} {expr $x*2}] 1 = {1 2 4 8 16 32 64 128 256 512}`

`iterate 4 tail {1 2 3 4 5} = {1 2 3 4 5} {2 3 4 5} {3 4 5} {4 5}`

- Parameters:
n

f

x

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::lambda (public, deprecated)

f::lambdaargsbody

Deprecated. Invoking this procedure generates a warning.

The lambda function - one of the foundations of functional programming - defines an anonymous proc and returns it. This is useful if you quickly need an auxiliary function for a small task.

## Examples

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

= {1 4 9 16 25}`zip_with [lambda {x y} {return "$x and $y"}] {1 2 3} {4 5 6}`

= "1 and 4" "2 and 5" "3 and 6"## Note

Although lambda defines a proc and therefore consumes memory, executing the same lambda expression twice will just re-define this proc. Thus, there is no memory leak, if you have a lambda inside a loop. DEPRECATED: As of tcl8.5, Tcl has native support for 'lambda' provided by means of 'apply' per TIP 194. Tcllib provides a 'lambda' package with procs that make use of it.

- Parameters:
args

body

- See Also:
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::last (public)

f::lastxs

last element of a list

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::lcm (public)

f::lcmxy

returns the least common multiple of x and y

- Parameters:
x

y

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::lmax (public)

f::lmaxxs

returns the maximum element of the list xs

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::lmin (public)

f::lminxs

returns the minimum element of the list xs

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::map (public)

f::mapfxs

Takes a function f and a list { x1 x2 x3 ...}, applies the function on each element of the list and returns the result, i.e. { f x1, f x2, f x3, ...}.

## Examples

(fib = fibonacci function, sqr = square function)

- Applying a function to each element of a list:

`map fib [list 0 1 2 3 4 5 6 7 8] = {0 1 1 2 3 5 8 13 21}`

- Applying a function to each element of a matrix (a list of lists) can be done with a nested call:

`map [lambda {row} {map sqr $row}] [list [list 1 2 3] [list 4 5 6]] = {{1 4 9} {16 25 36}}`

- Parameters:
f

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::max (public)

f::maxxy

returns the maximum of x and y

- Parameters:
x

y

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::min (public)

f::minxy

returns the minimum of x and y

- Parameters:
x

y

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::mul (public)

f::mulnfraction

multiplies n with a fraction (given as a tuple)

- Parameters:
n

fraction

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::not_elem_p (public)

f::not_elem_pxxs

checks if x is not contained in s

- Parameters:
x

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::nub (public)

f::nubxs

removes duplicates from xs

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::null_p (public)

f::null_pxs

checks if xs is the empty list

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::odd_p (public)

f::odd_pn

returns 1 if n is odd and 0 otherwise

- Parameters:
n

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::or (public)

f::orxs

reduces a list of boolean values using ||

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::pascal (public, deprecated)

f::pascalsize

Deprecated. Invoking this procedure generates a warning.

prints Pascal's triangle DEPRECATED: As of tcl8.5, Tcl has native support for 'lambda' provided by means of 'apply' per TIP 194. Tcllib provides a 'lambda' package with procs that make use of it.

- Parameters:
size

- See Also:
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::prime_p (public)

f::prime_pn

- Parameters:
n

- Returns:
- 1 if n is prime
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::product (public)

f::productxs

returns the product of the elements of the list xs

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::products (public)

f::productsxs

returns the list of partial products of the list xs

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::qsort (public)

f::qsortxs[value]

sorts a sequence with the quicksort algorithm

- Parameters:
xs

value(defaults to`"id"`

)

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::reverse (public, deprecated)

f::reversexs

Deprecated. Invoking this procedure generates a warning.

reverses the list xs. Tcl has a built-in support for reversing lists: "lreverse". Use this instead.

- Parameters:
xs

- See Also:

- lreverse
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::scanl (public)

f::scanlfexs

takes a binary function f, a start element e and a list {x1 x2 ...} and returns {e (f e x1) (f (f e x1) x2) ...}

- Parameters:
f

e

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::scanl1 (public)

f::scanl1fxs

takes a binary function f and a list {x1 x2 x3 ...} and returns {x1 (f x1 x2) (f (f x1 x2) x3) ...}

- Parameters:
f

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::snd (public)

f::sndxs

returns the second element of a list

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::span (public)

f::spanpxs

splits a list using take_while and drop_while

- Parameters:
p

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::split_at (public)

f::split_atnxs

splits a list using take and drop

- Parameters:
n

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::sum (public)

f::sumxs

returns the sum of the elements of the list xs

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::sums (public)

f::sumsxs

returns the list of partial sums of the list xs

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::tail (public)

f::tailxs

all elements of a list but the first

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::take (public)

f::takenxs

returns the first n elements of xs

- Parameters:
n

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::take_until (public)

f::take_untilpxs

returns the list of elements up to and including the first element of xs which satisfies p

- Parameters:
p

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::take_while (public)

f::take_whilepxs

returns the longest initial segment of xs whose elements satisfy p

- Parameters:
p

xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::thd (public)

f::thdxs

returns the third element of a list

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::transpose (public)

f::transposelists

tranposes a matrix (a list of lists)

- Parameters:
lists

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::uncurry (public)

f::uncurryftuple

Converts a function that takes a series of single arguments into a function that takes one tuple as an argument.

## Example

`min 3 5 = 3`

`min {3 5} = error`

(because min expects two arguments)`uncurry min {3 5} = 3`

- Parameters:
f

tuple

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::unzip (public)

f::unzipxs

unzip takes a list of tuples {x1 y1} {x2 y2} {x3 y3} ... and returns a tuple of lists {x1 x2 x3 ...} {y1 y2 y3 ...}.

- Parameters:
xs

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::zip (public)

f::zip [args... ]

takes two lists {x1 x2 x3 ...} and {y1 y2 y3 ...} and returns a list of tuples {x1 y1} {x2 y2} {x3 y3} ... Works analogously with 3 or more lists.

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.

### f::zip_with (public)

f::zip_withfxsys

takes two lists {x1 x2 x3 ...} and {y1 y2 y3 ...} and returns the list {(f x1 y1) (f x2 y2) (f x3 y3) ...}

- Parameters:
f

xs

ys

- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.