Elementary List Operations
Creating and Accessing Lists
Creating an integer sequence: ‹int1›..‹int2›
Description:
The expression ‹int1›..‹int2›
creates a list of consecutive integers starting with ‹int1›
and ending with ‹int2›
.
If ‹int1›
is larger than ‹int2›
, then the empty list is returned.
4..9
[4, 5, 6, 7, 8, 9]
-2..2
[-2, -1, 0, 1, 2]
4..1
[]
The length of a list: length(‹list›)
Description:
This operator returns an integer that is equal to the number of elements in the ‹list›
.
length([2 ,5 ,7 ,3])
4
length([2 ,[5, 4, 5] ,7 ,3]_2)
3
length(1..1000)
1000
Combining the length
and the repeat
operator allows one to list all elements of a list easily.
list = [2,3,5,7]; repeat(length(list), println(list_#); )
2 3 5 7
One word of caution here: CindyScript is designed in such a way that it is seldom useful to traverse all the elements of a list using the repeat
operator.
There are more elegant ways.
Testing for containment: contains(‹list›,‹expr›)
Description:
This operator returns either true
or false
depending on whether ‹list›
contains the element ‹expr›
.
contains([1,3,4,5],4)
true
contains([1,3,4,5],7)
false
contains([1,3,4,5],2*2)
true
CindyScript >=3.0
4 ∈ [1,3,4,5]
true
7 ∈ [1,3,4,5]
false
4 ∉ [1,3,4,5]
false
7 ∉ [1,3,4,5]
true
List Manipulation
Concatenation of lists: ‹list1› ++ ‹list2›
, ‹list1› ∪ ‹list2›
or concat(‹list1›,‹list2›)
Description: This operator creates a list by concatenation of two other lists.
concat(["a", "b"], ["c", "d"])
["a", "b", "c", "d"]
Thanks to auto-coercion, numbers and boolean values will get converted to singleton lists.
concat(2, true)
[2, true]
Strings and ___
auto-coerce to the empty list.
concat("foo", [2])
[2]
concat([1], (;))
[1]
Removing elements from lists: ‹list1› -- ‹list2›
, ‹list1› ∖ ‹list2›
or remove(‹list1›,‹list2›)
Description:
This operator creates a list by removing all elements that occur in ‹list2›
from ‹list1›
.
Note that ∖
is not a plain backslash, but the Unicode symbol ‘set minus’.
remove([1,3,4,5,1,5,6], [1,3,7])
[4, 5, 5, 6]
[1,3,4,5,1,5,6]--[1,3,7]
[4, 5, 5, 6]
Intersection of lists: ‹list1› ~~ ‹list2›
, ‹list1› ∩ ‹list2›
or common(‹list1›,‹list2›)
Description:
This operator creates a list collecting all elements that are in both ‹list1›
and ‹list1›
.
In the returned list the elements are sorted and each element occurs at most once.
common([1,3,4,5,1,5,6], [1,3,7])
[1, 3]
[1,3,4,5,1,5,6]~~[1,3,7]
[1, 3]
Appending an element: ‹list› :> ‹expr›
or append(‹list›,‹expr›)
Description:
This operator returns a list that is created by appending ‹expr›
to the list ‹list›
as its last element.
append(["a", "b", "c"], "d")
["a", "b", "c", "d"]
["a", "b", "c"]:>"d"
["a", "b", "c", "d"]
Prepending an element: ‹expr› <: ‹list›
or prepend(‹expr›,‹list›)
Description:
This operator returns a list that is created by prepending ‹expr›
to the list ‹list›
as its first element.
prepend("d",["a", "b", "c"])
["d", "a", "b", "c"]
"d"<:["a", "b", "c"]
["d", "a", "b", "c"]
Traversing Lists
The forall loop: forall(‹list›,‹expr›)
Description:
This operator is useful for applying an operation to all elements of a list.
It takes a ‹list›
as first argument.
It produces a loop in which ‹expr›
is evaluated for each entry of the list.
For each run, the run variable #
takes the value of the corresponding list entry.
Example:
a=["this","is","a","list"]; forall(a,println(#))
This code fragment produces the output
this is a list
The forall loop: forall(‹list›,‹var›,‹expr›)
Description:
Similar to forall(‹list›,‹expr›)
, but the run variable is now named ‹var›
.
The variable is local to the expression.
v=994; forall([1,2,3],v,println(v))
1 2 3
v
994
Applying an expression: apply(‹list›,‹expr›)
Description:
This operator generates a new list by applying the operation ‹expr›
to all elements of a list and collecting the results.
As usual, #
is the run variable, which successively takes the value of each element in the list.
apply([1, 2, 3, 4, 5],#^2)
[1, 4, 9, 16, 25]
apply([1, 2, 3, 4, 5],#+5)
[6, 7, 8, 9, 10]
apply(1..5, [#,#^2])
[[1, 1], [2, 4], [3, 9], [4, 16], [5, 25]]
Applying an expression: apply(‹list›,‹var›,‹expr›)
Description:
Similar to apply(‹list›,‹expr›)
, but the run variable is now named ‹var›
.
The variable is local to the expression.
v=995; apply([1, 2, 3, 4, 5], v, v^2)
[1, 4, 9, 16, 25]
v
995
Selecting elements of a list: select(‹list›,‹boolexpr›)
Description:
This operator selects all elements of a list for which a certain condition is satisfied.
The condition is supposed to be encoded by ‹boolexpr›
.
This expression is assumed to return a ‹bool›
value.
As usual, #
is the run variable, which successively take the value of all elements in the list.
select(1..10, isodd(#))
[1, 3, 5, 7, 9]
select(0..10, #+# == #^2)
[0, 2]
A high-level application of the select
operator is given by the following example:
divisors(x):=select(1..x,mod(x,#)==0); primes(n):=select(1..n,length(divisors(#))==2); println(primes(20))
It produces the output
[2, 3, 5, 7, 11, 13, 17, 19]
In this example, first a function divisors(x)
is defined by selecting those numbers that divide x
without any remainder.
Then a function primes(n)
is defined that selects all numbers between 1
and n
that have exactly two divisors.
These numbers are the primes.
Selecting elements of a list: select(‹list›,‹var›,‹boolexpr›)
Description:
Similar to select(‹list›,‹boolexpr›)
, but the run variable is now named ‹var›.
The variable is local to the expression.
v = 996; select(0..10, v, v+v == v^2)
[0, 2]
v
996