truly fork, sort of
This commit is contained in:
parent
11fdc81409
commit
2057d9ee74
|
|
@ -2,7 +2,7 @@
|
||||||
GPLC_OPTIONS=--no-top-level
|
GPLC_OPTIONS=--no-top-level
|
||||||
#GPLC_OPTIONS=
|
#GPLC_OPTIONS=
|
||||||
|
|
||||||
THUN_DEPS=parser.pl defs.pl main.pl math.pl DCG_basics.pl
|
THUN_DEPS=parser.pl defs.pl main.pl math.pl DCG_basics.pl fork.pl
|
||||||
|
|
||||||
thun: thun.pl $(THUN_DEPS) Makefile
|
thun: thun.pl $(THUN_DEPS) Makefile
|
||||||
gplc $(GPLC_OPTIONS) -o thun thun.pl $(THUN_DEPS)
|
gplc $(GPLC_OPTIONS) -o thun thun.pl $(THUN_DEPS)
|
||||||
|
|
@ -11,6 +11,7 @@ defs.pl: meta-defs.pl parser.pl defs.txt thun.pl DCG_basics.pl
|
||||||
gprolog \
|
gprolog \
|
||||||
--consult-file meta-defs.pl \
|
--consult-file meta-defs.pl \
|
||||||
--consult-file parser.pl \
|
--consult-file parser.pl \
|
||||||
|
--consult-file fork.pl \
|
||||||
--consult-file thun.pl \
|
--consult-file thun.pl \
|
||||||
--consult-file DCG_basics.pl \
|
--consult-file DCG_basics.pl \
|
||||||
--query-goal do
|
--query-goal do
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@ def(drop,[[rest],times]).
|
||||||
def(dupdd,[[dup],dipd]).
|
def(dupdd,[[dup],dipd]).
|
||||||
def(dupdipd,[dup,dipd]).
|
def(dupdipd,[dup,dipd]).
|
||||||
def(enstacken,[stack,[clear],dip]).
|
def(enstacken,[stack,[clear],dip]).
|
||||||
def(fork,[[i],app2]).
|
|
||||||
def(fourth,[rest,third]).
|
def(fourth,[rest,third]).
|
||||||
def(gcd,[true,[tuck,mod,dup,0,>],loop,pop]).
|
def(gcd,[true,[tuck,mod,dup,0,>],loop,pop]).
|
||||||
def(grabN,[[],swap,[cons],times]).
|
def(grabN,[[],swap,[cons],times]).
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ dupdd == [dup] dipd
|
||||||
dupdipd == dup dipd
|
dupdipd == dup dipd
|
||||||
enstacken == stack [clear] dip
|
enstacken == stack [clear] dip
|
||||||
flatten == [] swap [concat] step
|
flatten == [] swap [concat] step
|
||||||
fork == [i] app2
|
|
||||||
fourth == rest third
|
fourth == rest third
|
||||||
gcd == true [tuck mod dup 0 >] loop pop
|
gcd == true [tuck mod dup 0 >] loop pop
|
||||||
grabN == [] swap [cons] times
|
grabN == [] swap [cons] times
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
:- 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.
|
||||||
|
|
||||||
Loading…
Reference in New Issue