listing
This library provides support for listing object dynamic predicate clauses. The predicates must (also) be declared using a scope directive to make them visible to the listing predicates.
API documentation
Open the ../../docs/library_index.html#listing link in a web browser.
Loading
To load all entities in this library, load the loader.lgt
utility
file:
| ?- logtalk_load(listing(loader)).
Testing
To test this library predicates, load the tester.lgt
file:
| ?- logtalk_load(listing(tester)).
Usage
This library provides a listing
category that can be imported by any
number of objects. The main predicates are declared public. If you want
to restrict their scope, use protected or private import. For example:
:- object(data_store,
imports(private::listing)).
debug :-
^^listing(data/4).
...
:- end_object.
The listing
category provides a bare bones portray_clause/1
predicate implementation. As this predicate is called (by the
listing/0-1
predicates) using the (::)/1
control construct, the
object importing the category can easily override the inherited
definition with its own or with a call to the backend system native
implementation of the predicate. For example, assuming a backend that
provides portray_clause/1
as a built-in predicate, we can write:
:- object(thing,
imports(listing)).
:- uses(user, [portray_clause/1]).
...
:- end_object.
The main predicate, listing/1
, accepts as argument a predicate
indicator, a non-terminal indicator, or a clause head template (to list
only clauses with a matching head).
This library is often useful as a debugging helper. For example,
assuming that the we want to list dynamic predicate clauses for an
object data
compiled (or created) with the complements
flag set
to allow
, we can hot patch it to add the listing
category:
| ?- create_category(patch, [extends(listing),complements(data)], [], []).
yes
| ?- data::listing.
...
Another example:
| ?- create_category(
patch,
[extends(listing),complements(data)],
[public(debug/1)],
[(debug(Key) :- ::listing(p(Key,Datum)))]
).
yes
| ?- data::debug(k42).
...
Note that the semantic of complementing categories require that we use
the (::)/2
control construct instead of the (^^)/2
control
construct as a super call would be interpreted as made from the
complemented object.