リスト処理の基礎
リストの作成とアクセス
整数列の作成: <int1>..<int2>
説明: 式
<int1>..<int2>
により
<int1>
から
<int2>
までの連続する整数のリストを作ります。
<int1>
が
<int2>
より大きい場合は空のリストを返します。
例:
式: | 結果:
|
4..9 | [4, 5, 6, 7, 8, 9]
|
-2..2 | [-2, -1, 0, 1, 2]
|
4..1 | []
|
リストの長さ: length(<list>)
説明: この演算子は
<list>
の要素の個数を返します。
例:
式: | 結果:
|
length([2 ,5 ,7 ,3]) | 4
|
length([2 ,[5, 4, 5] ,7 ,3]_2) | 3
|
length(1..1000) | 1000
|
length
演算子と
repeat
演算子を組み合わせれば、リストのすべての要素を簡単に書き出すことができます。
repeat(length(list),
println(list_#);
)
ここで一つ注意:
repeat
演算子を使ってすべての要素を横断するようなやりかたがいつも有用とは限りません。よりエレガントな方法があります。このあとに解説する演算子、forall()やapply()をごらんください。
内容のテスト: contains(<list>,<expr>)
説明: この演算子は、
<list>
の中に<expr>があるかどうかで、
true
または
false
を返します。
例:
式: | 結果:
|
contains([1,3,4,5],4) | true
|
contains([1,3,4,5],7) | false
|
contains([1,3,4,5],2*2) | true
|
リストの操作
リストの連結: concat(<list1>,<list2>)
説明: この演算子は、2つのリストを連結します。この演算子は
<list1>++<list2>
と書くのと同じです。
例:
式: | 結果:
|
concat(["a", "b"], ["c", "d"]) | ["a", "b", "c", "d"]
|
["a", "b"] ++ ["c", "d"] | ["a", "b", "c", "d"]
|
リストからの要素の削除: remove(<list1>,<list2>)
説明: この演算子は、
<list2>
の要素と同じものを
<list1>
から削除します。 この演算子は、
<list1> -- <list2>
.と書くのと同じです。
例:
式: | 結果:
|
remove([1,3,4,5,1,5,6], [1,3,7]) | [4,5,5,7]
|
[1,3,4,5,1,5,6]--[1,3,7] | [4,5,5,7]
|
リストの共通部分: common(<list1>,<list2>)
説明: この演算子は
<list1>
と
<list2>
の両方に含まれるものを集めたリストを作ります。 この演算子は
<list1>~~<list2>
と書くのと同じです。
例:
式: | 結果:
|
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]
|
要素の追加: append(<list>,<expr>)
説明: この演算子は、
<expr>
を
<list>
の最後に追加したリストを返します。 この演算子は
<list>:><expr>
と書くのと同じです。
例:
式: | 結果:
|
append(["a", "b", "c"], "d") | ["a", "b", "c","d"]
|
["a", "b", "c"]:>"d" | ["a", "b", "c","d"]
|
要素の前方付加: prepend(<expr>,<list>)
説明: この演算子は、
<expr>
を
<list>
の前方に付加したリストを返します。 この演算子は
<expr><:<list>
と書くのと同じです。
例:
式: | 結果:
|
prepend("d",["a", "b", "c"]) | ["d","a", "b", "c"]
|
"d"<:["a", "b", "c"] | ["d","a", "b", "c"]
|
リストの要素の走査
全要素走査: forall(<list>,<expr>)
説明: この演算子は、ある操作をリストのすべての要素に対して行うときに有用です。第1引数の
<list>
を走査し、それぞれの要素を
<expr>
で評価していきます。実行にあたっては、実行変数
#
にそれぞれの要素の値を代入していきます。
Example:
a=["this","is","a","list"];
forall(a,println(#))
このコードの実行結果は次のようになります。
全要素走査: forall(<list>,<var>,<expr>)
説明: forall(<list>,<expr>)
と同様ですが、実行変数を
<var>
にします。
式の適用: apply(<list>,<expr>)
説明: この演算子は、操作
<expr>
をリストのすべての要素に適用し、その結果からなるリストを作成します。通常、
#
が実行変数で、リストのそれぞれの要素がこの変数に代入されていきます。
例:
式: | 結果:
|
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]]
|
式の適用: apply(<list>,<var>,<expr>)
説明: apply(<list>,<var>)
と同様ですが、実行変数を
<var>
にします。
リストの要素の選択: select(<list>,<boolexpr>)
説明: この演算子は、特定の条件を満たすすべての要素を選び出します。条件は
<boolexpr>
によって与えられます。この条件は
<bool>
値をとります。 通常、
#
が実行変数で、リストのそれぞれの要素がこの変数に代入されていきます。
例:
式: | 結果:
|
select(1..10, isodd(#)) | [1, 3, 5, 7, 9]
|
select(0..10, #+# == #2) | [0,2]
|
select
演算子の高度な応用例を次に挙げます。
divisors(x):=select(1..x,mod(x,#)==0);
primes(n):=select(1..n,length(divisors(#))==2);
println(primes(100))
結果は次のようになります。
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
この例では、まず最初の関数
divisors(x)
が
x
の約数を残らずリストアップします。 次に、関数
primes(n)
は
1
から
n
までの数の中から約数が2つだけ(1と自分自身)である数を選び出します。すなわち、それが素数です。
リストの要素の選択: select(<list>,<var>,<boolexpr>)
説明: select(<list>,<boolexpr>)
と同様ですが、実行変数を <var> にします。