42 lines
1.0 KiB
Prolog
42 lines
1.0 KiB
Prolog
:- multifile(func/3).
|
|
|
|
func(fork, [F, G|S], [X, Y|S]) :-
|
|
fork(F, S, X, ChildPID),
|
|
thun(G, S, [Y|_]),
|
|
wait(ChildPID, Status). % FIXME check status!!!
|
|
|
|
fork(Expr, Stack, Result, ChildPID) :-
|
|
mkpipe(In, Out),
|
|
fork_prolog(ChildPID),
|
|
bar(ChildPID, In, Out, Expr, Stack, Result).
|
|
|
|
bar(0, In, Out, Expr, Stack, Result) :-
|
|
close(In),
|
|
thun(Expr, Stack, [Result|_]),
|
|
w(Out, Result),
|
|
close(Out),
|
|
halt.
|
|
|
|
bar(P, In, Out, Expr, Stack, Result) :-
|
|
integer(P), P =\= 0,
|
|
close(Out),
|
|
select([In], R, [], _, 1500),
|
|
(R=[In] ->
|
|
read(In, Result)
|
|
;
|
|
Result=timeout
|
|
),
|
|
close(In).
|
|
|
|
mkpipe(In, Out) :-
|
|
create_pipe(In, Out),
|
|
set_stream_buffering(Out, none),
|
|
set_stream_buffering(In, none).
|
|
|
|
w(Out, Term) :- % To get a term written out and recognized,
|
|
write(Out, Term), % you write it to the stream
|
|
put_code(Out, 0'.), % add a period at the end
|
|
nl(Out), % and a newline even if you set buffering
|
|
flush_output(Out). % to none, then flush for good measure.
|
|
|