mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-16 09:53:36 +00:00
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.
126 lines
2.6 KiB
Mathematica
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)
|
|
).
|