[ Control | Reference Manual | Alphabetic Index ]

# Goal @ ContextModule

Goal is executed in the calling context of ContextModule.

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

## 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) instantiation fault
  Goal is not instantiated.
(5) type error
  Goal is neither an atom nor a compound term.
(68) calling an undefined procedure
  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