6.2. kink/BIN

bin 型の値のコンパニオンモジュール。

6.2.1. bin 型

bin は有限長の不変なバイト列である。

bin の要素は、[0x00, 0xff]の範囲内の整数の num 値である。

:BIN.require_from('kink/')
:Magic <- BIN.of(0xca 0xfe 0xba 0xbe)
:Slice <- Magic.take_front(2)
stdout.print_line(Slice.repr) # => (bin 0xca 0xfe)

6.2.1.1. Bin.size

size は Bin が含む要素の数を num 値として戻す。

6.2.1.2. Bin.any?

any?はBinの長さが1以上であるかどうかを戻す。

6.2.1.3. Bin.get(Ind)

get は Ind の位置の Bin の要素を戻す。

結果は[0, 0xff]の範囲内の整数の num 値である。

事前条件

Ind は[0, Bin.size]の範囲の整数の num 値でなければならない。

6.2.1.4. Bin.slice(From To)

sliceは、[From, To)の範囲のスライスをbinとして戻す。

事前条件

FromとToは整数のnum値でなければならない。

0 <= From <= To <= Bin.size

:BIN.require_from('kink/')

:Magic <- BIN.of(0xca 0xfe 0xba 0xbe)
:Slice <- Magic.slice(1 3)
stdout.print_line(Slice.repr) # => (bin 0xfe 0xba)

6.2.1.5. Bin.take_front(N)

take_front は Bin の最初の N 個の要素のスライスを bin 値として戻す。

事前条件

N は[0, Bin.size]の範囲の整数の num 値でなければならない。

:BIN.require_from('kink/')
:Pdf_signature <- BIN.of(0x25 0x50 0x44 0x46 0x2d)
:Slice <- Pdf_signature.take_front(2)
stdout.print_line(Slice.repr) # => (bin 0x25 0x50)

6.2.1.6. Bin.take_back(N)

take_back は Bin の最後の N 個の要素のスライスを bin 値として戻す。

事前条件

N は[0, Bin.size]の範囲の整数の num 値でなければならない。

:BIN.require_from('kink/')
:Pdf_signature <- BIN.of(0x25 0x50 0x44 0x46 0x2d)
:Slice <- Pdf_signature.take_back(2)
stdout.print_line(Slice.repr) # => (bin 0x46 0x2d)

6.2.1.7. Bin.drop_front(N)

drop_front は Bin の最初の N 個を除いた要素のスライスを bin 値として戻す。

事前条件

N は[0, Bin.size]の範囲の整数の num 値でなければならない。

:BIN.require_from('kink/')
:Pdf_signature <- BIN.of(0x25 0x50 0x44 0x46 0x2d)
:Slice <- Pdf_signature.drop_front(2)
stdout.print_line(Slice.repr) # => (bin 0x44 0x46 0x2d)

6.2.1.8. Bin.drop_back(N)

drop_back は Bin の最後の N 個を除いた要素のスライスを bin 値として戻す。

事前条件

N は[0, Bin.size]の範囲の整数の num 値でなければならない。

:BIN.require_from('kink/')
:Pdf_signature <- BIN.of(0x25 0x50 0x44 0x46 0x2d)
:Slice <- Pdf_signature.drop_back(2)
stdout.print_line(Slice.repr) # => (bin 0x25 0x50 0x44)

6.2.1.9. Bin1 + Bin2

+ 演算子、または op_add メソッドは、 Bin1 の要素を先頭に、 Bin2 の要素を末尾に持つ bin を戻す。

事前条件

Bin2 は bin 値でなければならない。

:BIN.require_from('kink/')
:Cafe <- BIN.of(0xca 0xfe)
:Babe <- BIN.of(0xba 0xbe)
:Cafe_babe <- Cafe + Babe
stdout.print_line(Cafe_babe.repr) # => (bin 0xca 0xfe 0xba 0xbe)

6.2.1.10. Bin * N

* 演算子、または op_mul メソッドは、 Bin の要素を N 回繰り返した bin 値を戻す。

事前条件

N は整数の num 値でなければならない。

:BIN.require_from('kink/')
:Babe <- BIN.of(0xba 0xbe)
:Babe_babe_babe <- Babe * 3
stdout.print_line(Babe_babe_babe.repr) # => (bin 0xba 0xbe 0xba 0xbe 0xba 0xbe)

6.2.1.11. Bin1 == Bin2

== 演算子、または op_eq メソッドは、 Bin1 と Bin2 が同じ要素の列を持っているかどうかを戻す。

事前条件

Bin1 と Bin2 は bin 値でなければならない。

:BIN.require_from('kink/')
:Bin <- BIN.of(1 2 3)

stdout.print_line((Bin == BIN.of(1 2 3)).repr)  # => true
stdout.print_line((Bin != BIN.of(1 2 3)).repr)  # => false

stdout.print_line((Bin == BIN.of(3 2 1)).repr)  # => false
stdout.print_line((Bin != BIN.of(3 2 1)).repr)  # => true

6.2.1.12. Bin1 <= Bin2

<=演算子、またはop_leメソッドは、Bin1がBin2よりも辞書順で小さいかどうかを戻す。

事前条件

Bin1とBin2はbin値でなければならない。

:BIN.require_from('kink/')

:compare <- {(:Bin :Arg_bin)
  [:Lt? :Le? :Gt? :Ge?] = [
    Bin < Arg_bin
    Bin <= Arg_bin
    Bin > Arg_bin
    Bin >= Arg_bin
  ]
  stdout.print_line(
    'Lt?={} Le?={} Gt?={} Ge?={}'.format(Lt?.repr Le?.repr Gt?.repr Ge?.repr))
}

compare(BIN.of(1 2 3) BIN.of(1 2 3))    # => Lt?=false Le?=true Gt?=false Ge?=true
compare(BIN.of(1 2 3) BIN.of(1 2 3 4))  # => Lt?=true Le?=true Gt?=false Ge?=false
compare(BIN.of(1 2 3) BIN.of(1 2))      # => Lt?=false Le?=false Gt?=true Ge?=true

6.2.1.13. Bin.repr

repr は "(bin 0xca 0xfe 0xba 0xbe)", "(bin 0x01 0x02 0x03 ,,, size=999 ,,, 0xfd 0xfe 0xff)" のような文字列を戻す。

6.2.2. BIN.is?(Val)

is? は Val が bin 値であるかどうかを戻す。

:BIN.require_from('kink/')
:Bin <- BIN.of(1 2 3)
stdout.print_line(BIN.is?(Bin).repr) # => true
stdout.print_line(BIN.is?(42).repr)  # => false

6.2.3. BIN.of(... Nums)

ofはNumsを要素として持つbin値を戻す。

事前条件

Numsの要素は[0, 0xff]の範囲の整数のnum値でなければならない。

:BIN.require_from('kink/')

:Bin <- BIN.of(0 1 254 255)
stdout.print_line(Bin.repr) # => (bin 0x00 0x01 0xfe 0xff)

6.2.4. BIN.from_each(Eacher)

from_eachはEacherの要素を持つbinを戻す。

事前条件

Eacherは、ベクタやiterのように、.each($consume)メソッドをサポートしなければならない。

Eacherのそれぞれのの要素は[0, 0xff]の範囲の整数のnum値でなければならない。

:BIN.require_from('kink/')

:Bin <- BIN.from_each([0 1 254 255])
stdout.print_line(Bin.repr) # => (bin 0x00 0x01 0xfe 0xff)