6.35. kink/container/SET¶
6.35.1. set型¶
setは、一意な要素のコンテナの抽象型である。setの中で、要素は、実装定義の同値性において一意でなければならない。
ordered_setは、要素の全順序をサポートするsetの部分型である。kink/container/ORDERED_SETを見よう。
6.35.1.1. Set.have?(Elem)¶
have?は、SetがElemと同値の要素を持っているかどうかを戻す。
事前条件
Elemは、要素の同値関係の定義域に属さなければならない。
例
:FLAT_SET.require_from('kink/container/')
:Set <- FLAT_SET.of('foo' 'bar')
stdout.print_line(Set.have?('foo').repr) # => true
stdout.print_line(Set.have?('xxx').repr) # => false
6.35.1.2. Set.size¶
sizeは、Setの要素の数を整数のnum値として戻す。
例
:TREE_SET.require_from('kink/container/')
:Set <- TREE_SET.of('foo' 'bar')
stdout.print_line(Set.size.repr) # => 2
6.35.1.3. Set.push(Elem)¶
pushはElemをSetに挿入する。
SetがすでにElemと同値の要素を持っている場合、pushは何もしないかもしれないし、要素をElemで置き換えるかもしれない。
事前条件
Elemは、要素の同値関係の定義域に属さなければならない。
例
:TREE_SET.require_from('kink/container/')
:Set <- TREE_SET.of()
Set.push('foo')
Set.push('bar')
Set.push('foo')
stdout.print_line(Set.repr) # => (tree_set "bar" "foo")
6.35.1.4. Set.append(Eacher)¶
appendはEacherの要素をSetに挿入する。
事前条件
Eacherは、.each($consume)メソッドを提供しなければならない。eachメソッドは、Eacherのそれぞれの要素について$consumeを呼ぶものでなければならない。
Eacherの要素は、Setの要素の定義域に含まれなければならない。
例
:FLAT_SET.require_from('kink/container/')
:Set <- FLAT_SET.of('foo' 'bar')
Set.append(['bar' 'baz'])
stdout.print_line(Set.repr) # => (flat_set "bar" "baz" "foo")
6.35.1.5. Set.remove(Elem)¶
removeは、Elemと同値の要素を消す。Setがそのような要素を持っていない場合、removeは何もしない。
事前条件
Elemは、要素の同値関係の定義域に属さなければならない。
例
:FLAT_SET.require_from('kink/container/')
:Set <- FLAT_SET.of('foo' 'bar' 'baz')
Set.remove('foo')
Set.remove('xxx')
stdout.print_line(Set.repr) # => (flat_set "bar" "baz")
6.35.1.6. Set.clear¶
clearはすべての要素を消す。
例
:FLAT_SET.require_from('kink/container/')
:Set <- FLAT_SET.of('foo' 'bar' 'baz')
Set.clear
stdout.print_line(Set.repr) # => (flat_set)
6.35.1.7. Set.iter¶
iterメソッドは、Setの要素を含むiterを戻す。
例
:TREE_SET.require_from('kink/container/')
:Set <- TREE_SET.of('foo' 'bar' 'baz')
Set.iter.each{(:E)
stdout.print_line(E.repr)
}
# Output:
# "bar"
# "baz"
# "foo"
6.35.1.8. Set.each($consume)¶
eachは、Setのそれぞれの要素について$consumeを呼び出す。
事前条件
$consumeは、引数ひとつを取る関数でなければならない。
例
:TREE_SET.require_from('kink/container/')
:Set <- TREE_SET.of('foo' 'bar' 'baz')
Set.each{(:E)
stdout.print_line(E.repr)
}
# Output:
# "bar"
# "baz"
# "foo"
6.35.1.9. Set.all?($match?)¶
all?は、Setのすべての要素が述語$match?を満たすかどうかを戻す。
事前条件
$match?は述語でなければならない。
例
:FLAT_SET.require_from('kink/container/')
:Set <- FLAT_SET.of(1 2 3 4 5)
stdout.print_line(Set.all?{(:E) E % 2 == 0 }.repr) # => false
stdout.print_line(Set.all?{(:E) E < 10 }.repr) # => true
stdout.print_line(Set.all?{(:E) E >= 10 }.repr) # => false
6.35.1.10. Set.any?(...[$match?={ true }])¶
any?はSetの1個以上の要素が述語$match?を満たすかどうかを戻す。
$match?はオプショナルな引数で、デフォルト値は{ true }である。したがって、$match?が渡されない場合、any?はSetが空でないかどうかを戻す。
事前条件
$match?は述語でなければならない。
例
:FLAT_SET.require_from('kink/container/')
:Set <- FLAT_SET.of(1 2 3 4 5)
stdout.print_line(Set.any?{(:E) E % 2 == 0 }.repr) # => true
stdout.print_line(Set.any?{(:E) E < 10 }.repr) # => true
stdout.print_line(Set.any?{(:E) E >= 10 }.repr) # => false
例
:FLAT_SET.require_from('kink/container/')
stdout.print_line(FLAT_SET.of().any?.repr) # => false
stdout.print_line(FLAT_SET.of(1).any?.repr) # => true
stdout.print_line(FLAT_SET.of(1 2).any?.repr) # => true
6.35.1.11. Set.count($counted?)¶
countは、Setの要素のうちで述語$counted?を満たすものの数を、整数のnum値として戻す。
事前条件
$counted?は述語でなければならない。
例
:FLAT_SET.require_from('kink/container/')
:Set <- FLAT_SET.of(1 2 3 4 5)
:Even_count <- Set.count{(:E) E % 2 == 0 }
stdout.print_line(Even_count.repr) # => 2
6.35.1.12. Set.fold(Init $combine)¶
foldは、Setの要素をInitを種として畳み込む。
Setが要素E1, E2, E3, ,,, En_1, Enを持つとき、reduceはcombine(combine(,,,combine(combine(E1 E2) E3),,, En_1) En)を戻す。Setが順序付けられていない限り、要素がどんな順番で現れるか決まりはない。
Setが空の場合、foldはInitを戻す。
事前条件
$combineはふたつの値を取る関数でなければならない。
例
:TREE_SET.require_from('kink/container/')
:Set <- TREE_SET.of(1 2 3 4 5)
:N <- Set.fold(100){(:X :Y) X + Y }
stdout.print_line(N.repr) # => 115
6.35.1.13. Set.reduce($combine ...[$empty_fallback])¶
reduceは、Setの要素を相互に畳み込む。
Setの要素がE1, E2, E3, ,,, En_1, Enのとき、reduceはcombine(combine(,,,combine(combine(E1 E2) E3),,, En_1) En)を戻す。Setが順序付けられていない限り、要素がどんな順番で現れるか決まりはない。
Setの要素が単一のEのとき、reduceはEを戻す。
Setが空で、$empty_fallbackが与えられている場合、reduceは$empty_fallbackを引数なしで末尾呼び出しする。
Setが空で、$empty_fallbackが与えられていない場合、reduceは例外を投げる。
事前条件
$combineはふたつの値を取る関数でなければならない。
$empty_fallbackはサンクでなければならない。
例
:TREE_SET.require_from('kink/container/')
:Empty <- TREE_SET.of()
:Non_empty <- TREE_SET.of(1 2 3 4 5)
stdout.print_line(Non_empty.reduce{(:X :Y) X + Y}.repr) # => 15
stdout.print_line(Empty.reduce({(:X :Y) X + Y} { 'empty' }).repr) # => "empty"
6.35.1.14. Set.have_all?(Vals)¶
have_all?は、Valsのすべての要素をSetが持っているかどうかを戻す。
事前条件
Valsは.all?($match?)メソッドを実装していなければならない。
Valsの要素は、Setの要素の同値関係の定義域に属さなければならない。
例
:FLAT_SET.require_from('kink/container/')
:Set <- FLAT_SET.of('foo' 'bar' 'baz')
stdout.print_line(Set.have_all?(['foo' 'bar']).repr) # => true
stdout.print_line(Set.have_all?(['foo' 'X']).repr) # => false
stdout.print_line(Set.have_all?(['X' 'Y' 'Z']).repr) # => false
6.35.1.15. Set.have_any?(Vals)¶
have_any?は、Valsのいずれかの要素をSetが持っているかどうかを戻す。
事前条件
Valsは.any?($match?)メソッドを実装していなければならない。
Valsの要素は、Setの要素の同値関係の定義域に属さなければならない。
例
:FLAT_SET.require_from('kink/container/')
:Set <- FLAT_SET.of('foo' 'bar' 'baz')
stdout.print_line(Set.have_any?(['foo' 'bar']).repr) # => true
stdout.print_line(Set.have_any?(['foo' 'X']).repr) # => true
stdout.print_line(Set.have_any?(['X' 'Y' 'Z']).repr) # => false
6.35.1.16. Set1 == Set2¶
== 演算子、つまりop_eqメソッドは、Set1がSet2とおなじ要素のコレクションを持っているかどうかを戻す。
言い換えると、op_eqは、Set1がSet2のすべての要素を持っていて、かつSet2がSet1のすべての要素を持っているかどうかを戻す。
事前条件
Set2はsetでなければならない。
Set1とSet2の要素の同値関係は同じでなければならない。
例
:TREE_SET.require_from('kink/container/')
:X <- TREE_SET.of('foo' 'bar' 'baz')
:Y <- TREE_SET.of('foo' 'bar' 'baz')
:Z <- TREE_SET.of('A' 'B' 'C')
stdout.print_line((X == Y).repr) # => true
stdout.print_line((X == Z).repr) # => false
6.35.2. SET.is?(Val)¶
is?は、Valがsetであるかどうかを戻す。