
Goal @ ContextModule

   Goal is executed in the calling context of ContextModule.



Arguments
   Goal                Callable term (atom or compound).
   ContextModule       Atom.

Type
   Control

Description
   The calling context of a goal is normally the module where the goal is
   called.  @/2 allows to specify this context module explicitly.  This is
   needed when writing meta-predicates (i.e. predicates which have goals or
   predicates as their arguments) or predicates which depend otherwise on
   the module system's visibility rules.

   @/2 changes only the context module, not the lookup module. I.e. the
   way the definition of Goal is found is not affected at all. To specify
   the lookup module, use :/2. The following table summarises:

	Call within module(m)         lookup module    context module

	..., twice(X), ...               m               m
	..., lm : twice(X), ...         lm               m
	..., twice(X) @ cm, ...          m              cm
	..., lm : twice(X) @ cm, ...    lm              cm
	..., call(twice(X)) @ cm, ...   cm              cm

   If Goal is not a tool-predicate, then Goal@ContextModule is completely
   equivalent to Goal.


Modules
   This predicate is sensitive to its module context (tool predicate, see @/2).

Fail Conditions
   Fails if Goal fails

Resatisfiable
   Resatisfiable if Goal is resatisfiable

Exceptions
     4 --- Goal is not instantiated.
     5 --- Goal is neither an atom nor a compound term.
    68 --- Goal is an undefined procedure in the context module.

Examples
   
    [eclipse 1]: [user].
     :- tool(where/0, where/1).
     where(Module) :-
        printf("where/0 was called from module %w\n", [Module]).
    ^D
    [eclipse 2]: where.
    where/0 was called from module eclipse
    yes.
    [eclipse 3]: where @ m.
    where/0 was called from module m
    yes.
    [eclipse 4]: call(where) @ m.
    calling an undefined procedure where in module m

    [eclipse 1]: [user].
     :- tool(print_local_preds/0, print_local_preds/1).
     print_local_preds(Module) :-
            current_predicate(P) @ Module,
            get_flag(P, visibility, local) @ Module,
            writeln(P),
            fail.
    ^D
    [eclipse 2]: print_local_preds.
    print_local_preds / 0
    print_local_preds / 1





See Also
   : / 2, call / 1, tool / 2
