11.3.91 generate_message_hook/3 [hook]


:- multifile user:generate_message_hook/3.

user:generate_message_hook(+MessageTerm, -S0, -S)

A way for the user to override the call to 'SU_messages':generate_message/3 in print_message/2.



May be any term.

list of pair

The resulting list of Control-Args pairs.

list of pair

The remaining list.


For a given MessageTerm, generates the list of Control-Args pairs required for print_message_lines/3 to format the message for display.

This is the same as 'SU_messages':generate_message/3 except that it is a hook. It is intended to be used when you want to override particular messages from the Prolog system, or when you want to add some messages. If you are using your own exception classes (see raise_exception/1) it may be useful to provide generate_message_hook clauses for those exceptions so that the print_message/2 (and thus the default exception handler that calls print_message/2) can print them out nicely.

The Prolog system uses the built-in predicate print_message/2 to print all its messages. When print_message/2 is called, it calls user:generate_message_hook(Message,L,[]) to generate the message. If that fails, 'SU_messages':generate_message(Message,L,[]) is called instead. If that succeeds, L is assumed to have been bound to a list whose elements are either Control-Args pairs or the atom nl. Each Control-Arg pair should be such that the call

     format(user_error, Control, Args)

is valid. The atom nl is used for breaking the message into lines. Using the format specification ‘~n’ (new-line) is discouraged, since the routine that actually prints the message (see user:message_hook/3 and print_message_lines/3) may need to have control over newlines.


     :- multifile user:generate_message_hook/3.
     user:generate_message_hook(hello_world) -->
             ['hello world'-[],nl].

Note that the terminating nl is required.

See Also


Send feedback on this subject.