%--------------------------------------------------% % vim: ft=mercury ts=4 sw=4 et %--------------------------------------------------% % Copyright (C) 1993-1999, 2003, 2005-2006, 2010-2011 The University of Melbourne. % Copyright (C) 2014-2016, 2018, 2021-2023 The Mercury team. % This file is distributed under the terms specified in COPYING.LIB. %--------------------------------------------------% % % File: require.m. % Main author: fjh. % Stability: medium to high. % % This module provides features similar to <assert.h> in C. % %--------------------------------------------------% %--------------------------------------------------% :- module require. :- interface. % error(Message): % % Throw a `software_error(Message)' exception. % This will normally cause execution to abort with an error message. % :- pred error(string::in) is erroneous. % func_error(Message): % % An expression that results in a `software_error(Message)' % exception being thrown. % :- func func_error(string) = _ is erroneous. % error(Pred, Message): % func_error(Pred, Message): % % Equivalent to invoking error or func_error on the string % Pred ++ ": " ++ Message. % :- pred error(string::in, string::in) is erroneous. :- func func_error(string, string) = _ is erroneous. % We declare error to be terminating so that all of the standard library % will treat it as terminating. :- pragma terminates(pred(error/1)). :- pragma terminates(pred(error/2)). :- pragma terminates(func(func_error/1)). :- pragma terminates(func(func_error/2)). %--------------------------------------------------% % sorry(Module, What): % % Call error/1 with the string % "Module: Sorry, not implemented: What". % % Use this for features that should be implemented (or at least could be % implemented). % :- func sorry(string, string) = _ is erroneous. :- pred sorry(string::in, string::in) is erroneous. % sorry(Module, Proc, What): % % Call error/1 with the string % "Module: Proc: Sorry, not implemented: What". % % Use this for features that should be implemented, % or at least could be implemented. % :- func sorry(string, string, string) = _ is erroneous. :- pred sorry(string::in, string::in, string::in) is erroneous. % unexpected(Module, Message): % % Call error/1 with the string % "Module: Unexpected: What". % % Use this to handle cases which are not expected to arise (i.e. bugs). % :- func unexpected(string, string) = _ is erroneous. :- pred unexpected(string::in, string::in) is erroneous. % unexpected(Module, Proc, Message): % % Call error/1 with the string % "Module: Proc: Unexpected: What". % % Use this to handle cases which are not expected to arise (i.e. bugs). % :- func unexpected(string, string, string) = _ is erroneous. :- pred unexpected(string::in, string::in, string::in) is erroneous. %--------------------------------------------------% % require(Goal, Message): % % Call goal, and call error(Message) if Goal fails. % This is not as useful as you might imagine, since it requires % that the goal not produce any output variables. In most circumstances, % you should use an explicit if-then-else with a call to error/1, % or one of its wrappers, in the "else". % :- pred require((pred)::in((pred) is semidet), string::in) is det. % expect(Goal, Module, Message): % % Call Goal, and call unexpected(Module, Message) if Goal fails. % :- pred expect((pred)::in((pred) is semidet), string::in, string::in) is det. % expect(Goal, Module, Proc, Message): % % Call Goal, and call unexpected(Module, Proc, Message) if Goal fails. % :- pred expect((pred)::in((pred) is semidet), string::in, string::in, string::in) is det. % expect_not(Goal, Module, Message): % % Call Goal, and call unexpected(Module, Message) if Goal succeeds. % :- pred expect_not((pred)::in((pred) is semidet), string::in, string::in) is det. % expect_not(Goal, Module, Proc, Message): % % Call Goal, and call unexpected(Module, Proc, Message) if Goal succeeds. % :- pred expect_not((pred)::in((pred) is semidet), string::in, string::in, string::in) is det. %--------------------------------------------------% % report_lookup_error(Message, Key): % % Call error/1 with an error message that is appropriate for % the failure of a lookup operation involving the specified Key. % The error message will include Message and information about Key. % :- pred report_lookup_error(string::in, K::in) is erroneous. % report_lookup_error(Message, Key, Value): % % Call error/1 with an error message that is appropriate for % the failure of a lookup operation involving the specified Key and Value. % The error message will include Message and information about Key % and Value. % :- pred report_lookup_error(string::in, K::in, V::unused) is erroneous. %--------------------------------------------------% %--------------------------------------------------%