- 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::abs x
returns the absolute value of x
- Parameters:
- x
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
f::all (public)
f::all pred xs
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::and xs
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::any pred xs
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::bind f [ 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::bind2nd f arg
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::choose n k
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::compose f g x
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::cons x xs
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::const k
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::copy n x
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::curry f [ 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::cycle n xs
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::drop n xs
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_while p xs
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_p x xs
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_to lo hi
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_p n
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::factorial n
compute n!
- Parameters:
- n
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
f::filter (public)
f::filter pred xs
Returns all elements of the list xs that fulfill the predicate pred.
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::flip f a b
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::fold f e xs
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::fold1 f xs
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::fst xs
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::gcd x y
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::head xs
first element of a list
- Parameters:
- xs
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
f::id (public)
f::id x
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::init xs
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::iterate n f x
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::lambda args body
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::last xs
last element of a list
- Parameters:
- xs
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
f::lcm (public)
f::lcm x y
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::lmax xs
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::lmin xs
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::map f xs
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::max x y
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::min x y
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::mul n fraction
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_p x xs
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::nub xs
removes duplicates from xs
- Parameters:
- xs
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
f::null_p (public)
f::null_p xs
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_p n
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::or xs
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::pascal size
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_p n
- Parameters:
- n
- Returns:
- 1 if n is prime
- Partial Call Graph (max 5 caller/called nodes):
- Testcases:
- No testcase defined.
f::product (public)
f::product xs
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::products xs
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::qsort xs [ 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::reverse xs
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::scanl f e xs
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::scanl1 f xs
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::snd xs
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::span p xs
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_at n xs
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::sum xs
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::sums xs
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::tail xs
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::take n xs
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_until p xs
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_while p xs
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::thd xs
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::transpose lists
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::uncurry f tuple
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::unzip xs
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_with f xs ys
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.