6.60. kink/io/SCANNER

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

6.60.1. scanner 型

scanner は文字列、またはUnicodeコードポイントの入力ポートである。 scanner は下にあるソースへのシーケンシャルな前方アクセスを提供する。

:FILE.require_from('kink/io/')
:CHARSET.require_from('kink/')
:CONTROL.require_from('kink/')

CONTROL.with_finally{(:finally)
  :S = FILE.open_to_scan('/etc/passwd' CHARSET.utf8)
  # result of FILE.open_to_scan also supports .close method of input type
  finally{ S.close }

  S.scan_line{
    C.on_success{(:Line)
      stdout.print_line(Line.repr)
    }
    C.on_eof{ stdout.print_line('no line found') }
  }
}
# => "root:x:0:0:root:/root:/bin/bash\n"

6.60.1.1. Scanner.scan(Max_codepoints ...[$config])

scan は最大 Max_codepoints 個のコードポイントからなる str を読み込む。

コンフィグメソッド:

• C.on_success($success): default = VAL.identity

• C.on_eof($eof): default = 例外を投げる関数

• C.on_error($error): default = 例外を投げる関数

end-of-fileに達しなかった場合、 scan は$successを、ソースから読まれた str を渡して末尾呼び出しする。

end-of-file に達した場合、 scan は$eofを引数なしで末尾呼び出しする。

IOエラーが発生した場合、 scan は$errorを exception を渡して末尾呼び出しする。

事前条件

$successは str を取る関数でなければならない。

$eofは引数なしの関数でなければならない。

$errorは exception を取る関数でなければならない。

:STR_SCANNER.require_from('kink/io/')

:S <- STR_SCANNER.new("foo\nbar")
:loop <- {(:Vec)
  S.scan(3){(:C)
    C.on_success{(:Line) loop(Vec + [Line]) }
    C.on_eof{ Vec }
  }
}
:Result <- loop([])
stdout.print_line(Result.repr)  # => ["foo" "\nba" "r"]

6.60.1.2. Scanner.scan_line(...[$config={}])

scan_line は"n"かend-of-fileに達するまで str を読み込む。

コンフィグメソッド:

• C.on_success($success): default = VAL.identity

• C.on_eof($eof): default = 例外を投げる関数

• C.on_error($error): default = 例外を投げる関数

"n"に達した場合、 scan_line は$successを、 str を渡して末尾呼び出しする。 str 値は末尾に"n"を含む。

end-of-fileに達した場合、 scan_line は$eofを引数なしで末尾呼び出しする。

IOエラーが起きた場合、 scan_line は$errorを exception を渡して末尾呼び出しする。

事前条件

$successは str を取る関数でなければならない。

$eofは引数なしの関数でなければならない。

$errorは exception を取る関数でなければならない。

:STR_SCANNER.require_from('kink/io/')

:S <- STR_SCANNER.new("foo\nbar")
:loop <- {(:Vec)
  S.scan_line{(:C)
    C.on_success{(:Line) loop(Vec + [Line]) }
    C.on_eof{ Vec }
  }
}
:Result <- loop([])
stdout.print_line(Result.repr)  # => ["foo\n" "bar"]

6.60.1.3. Scanner.scan_all(...[$config={}])

scan_all はend-of-fileに達するまで str を読み込む。

コンフィグメソッド:

• C.on_success($success): default = VAL.identity

• C.on_error($error): default = 例外を投げる関数

end-of-fileに達した場合、 scan_all は$successを、ソースから読まれた str を渡して末尾呼び出しする。

IOエラーが起きた場合、 scan_all は$errorを、 exception を渡して末尾呼び出しする。

事前条件

$successは str を取る関数でなければならない。

$errorは exception を取る関数でなければならない。

:STR_SCANNER.require_from('kink/io/')

:S <- STR_SCANNER.new("foo\nbar")
stdout.print_line(S.scan_all.repr)   # => "foo\nbar"
stdout.print_line(S.scan_all.repr)   # => ""
stdout.print_line(S.scan_all.repr)   # => ""

例: IOエラー

:FILE.require_from('kink/io/')
:CHARSET.require_from('kink/')
:CONTROL.require_from('kink/')

:S <- FILE.open_to_scan('/etc/passwd' CHARSET.utf8)
S.close
S.scan_all{(:C)
  C.on_error{(:Exc)
    stderr.print_line(Exc.message)
  }
}
# => already closed

S.scan_all
# Output:
#   -- main exception
#   [..root..]
#   {..call by host..}
#   ,,,
#   {builtin:kink-mods/kink/EXCEPTION.kn L117 C13 current_traces} { TRACE.-->current_traces }
#   already closed

6.60.2. SCANNER.is?(Val)

is? は Val が scanner 型かどうかを戻す。

6.60.3. SCANNER.mixin

mixin はScanner.scan_allの実装を提供するミックスイントレイトを戻す。 scan_all は scan メソッドを使って実装される。