MINERVA superseeded IF/Prolog.
Please see
http://www.ifcomputer.co.jp/MINERVA
for details.
We discontinued to sell IF/Prolog Dec 31. 2003.
For current customers, we continue to provide
professional support for IF/Prolog until Dec 31, 2008.
xtAddInput(+InputName, +Stream,
+InputCondition, +InputPredicate, +ClientData)
xtRemoveInput(InputName)
IntrinsicsのXtAdd/RemoveInput()と同様の働きをします。
xtAddInput/5は、InputConditionによって指定されたイベントが、Stream上に生じた時に呼び出されるべきInputPredicate/2を登録します。
FileDescriptorは、stdin, stdout, stderr,或は他のストリーム等(例えば、パイプ)うちのいずれかでなければなりません。
InputConditionは、xtInputReadMAsk, xtInputWriteMask, xtInputExceptMaskのうちのいずれかでなければなりません。
InputPredicateは、2つの引数をもつ述語でなければなりません。これは、適切なイベントがディスパッチされた時に呼び出されます: InputPredicate(InputName, ClientData).
xtInputReadMaskに設定した条件で入力イベントがコ−ルバック述語を呼び出した時には、コ−ルバック述語はそのイベントの原因を取り除くために、必ずファイル記述子から読み込まなければなりません。そうでなければ、結果が無限ル−プになります。get/1を使用した場合には、別の問題が生じます。オペレ−ティングシステムによるバッファリングのために、ファイル記述子からの入力は読み込まれますが、アプリケ−ションがその行の残りを読み込むためにコ−ルバックは再び呼び出されません。よって、get_until/3を使って1行ずつ読み込まなければなりません。
InputPredicateは失敗してはならず、失敗した場合には例外"input_predicate_failed"が結果として起こります。
[user].
| write_input(InputName, ClientData) :-
write('input callback '),
write(InputName),
write(' with client_data '),
write(ClientData),
write(' reads '),
get_until(10, Last, Line),
write(Line),
nl,
(( Line = last,
write(removed), nl,
xtRemoveInput(InputName),
!)
;
true).
|EOF
yes
?- xtAddInput(input1, stdin, xtInputReadMask,
write_input, xxx ).
yes
?- xtMainloop.
test1
input callback input1 with client_data xxx reads test1
test2
input callback input1 with client_data xxx reads test2
last
input callback input1 with client_data xxx reads last
removed
yes
?- _
<xtAddInput/5>
atom_expected InputCondition、Streamがアトムでない
input_name_already_used InputNameで指定した入力がすでに存在している
illegal_input_predicate InputPredicate/2が存在していない
<xtRemoveInput/1>
illegal_input この名前の入力は登録されていない
|