This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/Logtalk/examples/metapredicates/closures.lgt

57 lines
1.4 KiB
Plaintext
Raw Normal View History

/* Logtalk meta-predicates accept not only goals but also closures
as meta-arguments as illustrated in this example
*/
:- object(meta).
% the meta_predicate/1 directive below changes the interpretation of meta-calls on apply/2
% clauses; the integer argument ("1") implies that the first argument is a closure that will
% be used to construct a goal by appending exactly one additional argument
:- public(apply/2).
:- mode(apply(+callable, ?term), zero_or_more).
:- meta_predicate(apply(1, *)).
apply(Closure, Arg) :- % the Logtalk compiler verifies that any closure which is a
call(Closure, Arg). % meta-argument is used within a call/N method that honors the
% meta-predicate directive (in this case, apply(1, *) => call/2)
:- public(test_this/0). % simple predicate for testing calls to a local meta-predicate
test_this :-
apply(foo(X), Y),
write((X, Y)), nl.
foo(1, meta).
:- end_object.
:- object(desc,
extends(meta)).
:- public(test_self/0). % simple predicate for testing calls to a meta-predicate
% defined in an ancestor object
test_self :-
::apply(foo(X), Y),
write((X, Y)), nl.
foo(2, desc).
:- end_object.
:- object(test).
:- public(test_obj/0). % simple predicate for testing calls to a meta-predicate
% defined in another object
test_obj :-
meta::apply(foo(X), Y),
write((X, Y)), nl.
foo(3, test).
:- end_object.