Files
mercury/tests/debugger/save.m
Zoltan Somogyi f9c8453a15 Add a new option, --warn-no-stream-calls.
compiler/options.m:
doc/user_guide.texi:
NEWS:
    Add the above option.

compiler/simplify_goal_call.m:
    If the option is given, then generate severity_informational messages
    for calls to I/O predicates such as io.write_string/3, which have twins
    (in this case io.write_string/4) that take an extra initial argument
    that explicit specifies the stream to do the I/O on.

    Additionally, generate warnings for the predicates that update
    the library's notion of the current input and outpuy streams,
    since these are effectively the "enablers" for the calls that the
    above paragraph describes.

    Fix the conditions on some error specs.

    Delete a duplicated comment.

compiler/simplify_tasks.m:
    Add the new task to the list of tasks that simplification
    may be asked to do.

compiler/simplify_info.m:
compiler/simplify_proc.m:
    Fix an old minor bug: shut up *all* messages, whether their severity
    is error, warning or informational, during the second pass of
    simplification. (The need for the fix is described in the new comment
    in simplify_proc.m.)

compiler/common.m:
compiler/simplify_goal.m:
compiler/simplify_goal_disj.m:
compiler/simplify_goal_ite.m:
    Conform to the changes above.

tests/warnings/save.{m,exp}:
    A new test case to test the new option.

tests/warnings/Mmakefile:
    Enable the new test case.

    Switch to a more consistent indentation style.

tests/warnings/Mercury.options:
    Run the new test case with the new option.

tests/debugger/save.m:
    The new test case, warnings/save.m, is a version of debugger/save.m
    with up-to-date programming style. Update the original as well.
2016-10-11 10:40:10 +11:00

126 lines
2.6 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
:- module save.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is cc_multi.
:- implementation.
:- import_module list.
:- import_module int.
:- import_module string.
main(!IO) :-
( if
data(Data),
queen(Data, Out)
then
print_list(Out, !IO)
else
io.write_string("No solution\n", !IO)
),
io.see("save_file", SeeRes, !IO),
(
SeeRes = ok,
io.read_file_as_string(ReadRes, !IO),
(
ReadRes = ok(FileContents),
io.write_string(FileContents, !IO)
;
ReadRes = error(_PartialFileContents, ReadError),
io.error_message(ReadError, ReadMsg),
io.write_string("Read error: " ++ ReadMsg ++ "\n", !IO)
)
;
SeeRes = error(SeeError),
io.error_message(SeeError, SeeMsg),
io.write_string("See error: " ++ SeeMsg ++ "\n", !IO)
).
:- pred data(list(int)::out) is det.
data([1, 2, 3, 4, 5]).
:- pred queen(list(int)::in, list(int)::out) is nondet.
queen(Data, Out) :-
qperm(Data, Out),
safe(Out).
:- pred qperm(list(T)::in, list(T)::out) is nondet.
qperm(L, K) :-
(
L = [],
K = []
;
L = [_ | _], qdelete(U, L, Z),
K = [U | V],
qperm(Z, V)
).
:- pred qdelete(T::out, list(T)::in, list(T)::out) is nondet.
qdelete(A, [A | L], L).
qdelete(X, [A | Z], [A | R]) :-
qdelete(X, Z, R).
:- pred safe(list(int)::in) is semidet.
safe([]).
safe([N | L]) :-
nodiag(N, 1, L),
safe(L).
:- pred nodiag(int::in, int::in, list(int)::in) is semidet.
nodiag(B, D, L) :-
(
L = []
;
L = [N | T],
NmB = N - B,
BmN = B - N,
( if D = NmB then
fail
else if D = BmN then
fail
else
true
),
D1 = D + 1,
nodiag(B, D1, T)
).
:- pred print_list(list(int)::in, io::di, io::uo) is det.
print_list(Xs, !IO) :-
(
Xs = [],
io.write_string("[]\n", !IO)
;
Xs = [_ | _],
io.write_string("[", !IO),
print_list_2(Xs, !IO),
io.write_string("]\n", !IO)
).
:- pred print_list_2(list(int)::in, io::di, io::uo) is det.
print_list_2([], !IO).
print_list_2([X | Xs], !IO) :-
io.write_int(X, !IO),
(
Xs = []
;
Xs = [_ | _],
io.write_string(", ", !IO),
print_list_2(Xs, !IO)
).