6.67. kink/io/SCANNER¶
scanner型のコンパニオンモジュール。
6.67.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.67.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.67.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.67.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.67.2. SCANNER.is?(Val)¶
is?はValがscanner型かどうかを戻す。
6.67.3. SCANNER.mixin¶
mixinはScanner.scan_allの実装を提供するミックスイントレイトを戻す。scan_allはscanメソッドを使って実装される。