mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 17:33:38 +00:00
samples/Mmakefile:
Add the beer program to list of targets.
samples/*.m:
Convert (C->T;E) to (if C then T else E).
Delete trailing whitespace.
Use predmode syntax instead of separate pred and mode
declarations.
samples/interpreter.m:
Fix up one predicate that had some clauses that used
DCGs and others that used state variables.
Don't use the name 'IO' for something that isn't the I/O state.
samples/diff/*.m:
samples/c_interface/c_calls_mercury/mercury_main.m:
samples/c_interface/short_example.m:
Delete trailing whitespace.
134 lines
3.2 KiB
Mathematica
134 lines
3.2 KiB
Mathematica
%-----------------------------------------------------------------------------%
|
|
% vim: ft=mercury ts=4 sw=4 et
|
|
%-----------------------------------------------------------------------------%
|
|
%
|
|
% A simple sorting program.
|
|
%
|
|
% It works on text files, considering each line to be a record.
|
|
% The entire line is considered to be the sort key.
|
|
%
|
|
% The algorithm used is simple insertion sort.
|
|
%
|
|
% This source file is hereby placed in the public domain. -fjh (the author).
|
|
%
|
|
%-----------------------------------------------------------------------------%
|
|
|
|
:- module sort.
|
|
|
|
:- interface.
|
|
:- import_module io.
|
|
|
|
:- pred main(io::di, io::uo) is det.
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
%-----------------------------------------------------------------------------%
|
|
|
|
:- implementation.
|
|
|
|
:- import_module char.
|
|
:- import_module list.
|
|
:- import_module maybe.
|
|
:- import_module require.
|
|
:- import_module string.
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
|
|
main(!IO) :-
|
|
io.command_line_arguments(Args, !IO),
|
|
(
|
|
Args = [],
|
|
handle_args(no, no, !IO),
|
|
sort(!IO)
|
|
;
|
|
Args = [Input],
|
|
handle_args(yes(Input), no, !IO),
|
|
sort(!IO)
|
|
;
|
|
Args = [Input, Output],
|
|
handle_args(yes(Input), yes(Output), !IO),
|
|
sort(!IO)
|
|
;
|
|
Args = [_, _, _ | _],
|
|
io.write_string("Usage: sort [Input [Output]]\\n", !IO)
|
|
).
|
|
|
|
:- pred handle_args(maybe(string)::in, maybe(string)::in, io::di, io::uo)
|
|
is det.
|
|
|
|
handle_args(InArg, OutArg, !IO) :-
|
|
(
|
|
InArg = yes(InFilename),
|
|
io.see(InFilename, InResult, !IO),
|
|
(
|
|
InResult = ok
|
|
;
|
|
InResult = error(InError),
|
|
io.error_message(InError, InMsg),
|
|
error(InMsg)
|
|
)
|
|
;
|
|
InArg = no
|
|
),
|
|
(
|
|
OutArg = yes(OutFilename),
|
|
io.tell(OutFilename, OutResult, !IO),
|
|
(
|
|
OutResult = ok
|
|
;
|
|
OutResult = error(OutError),
|
|
io.error_message(OutError, OutMsg),
|
|
error(OutMsg)
|
|
)
|
|
;
|
|
OutArg = no
|
|
).
|
|
|
|
:- pred sort(io::di, io::uo) is det.
|
|
|
|
sort(!IO) :-
|
|
sort_2([], !IO).
|
|
|
|
:- pred sort_2(list(string)::in, io::di, io::uo) is det.
|
|
|
|
sort_2(Lines0, !IO) :-
|
|
io.read_line_as_string(Result, !IO),
|
|
(
|
|
Result = error(Error),
|
|
io.error_message(Error, Msg),
|
|
error(Msg)
|
|
;
|
|
Result = eof,
|
|
output_sorted_lines(Lines0, !IO)
|
|
;
|
|
Result = ok(Line),
|
|
insert(Lines0, Line, Lines1),
|
|
sort_2(Lines1, !IO)
|
|
).
|
|
|
|
:- pred insert(list(T)::in, T::in, list(T)::out) is det.
|
|
|
|
insert([], I, [I]).
|
|
insert([H | T], I, L) :-
|
|
compare(R, I, H),
|
|
(
|
|
R = (<),
|
|
L = [I, H | T]
|
|
;
|
|
( R = (=)
|
|
; R = (>)
|
|
),
|
|
insert(T, I, NT),
|
|
L = [H | NT]
|
|
).
|
|
|
|
:- pred output_sorted_lines(list(string)::in, io::di, io::uo) is det.
|
|
|
|
output_sorted_lines([], !IO).
|
|
output_sorted_lines([Line | Lines], !IO) :-
|
|
io.write_string(Line, !IO),
|
|
output_sorted_lines(Lines, !IO).
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
:- end_module sort.
|
|
%-----------------------------------------------------------------------------%
|