control construct

# `{}/1`

## Description

    {Goal}
    {Closure}
    {Term}

This control construct allows the programmer to bypass the Logtalk compiler (including its linter but not its optimizer) in multiple contexts:

- Calling a goal as-is (from within an object or category) in the context of the user pseudo-object.

- Extending a closure as-is with the remaining arguments of a call/2-N call in order to construct a goal that will be called within the context of the `user` pseudo-object.

- Wrapping a source file term (either a clause or a directive) or a source file goal to bypass the term-expansion mechanism.

- Using it in place of an object identifier when sending a message. In this case, its argument is proved as a goal within the context of the `user` pseudo-object with the resulting term being used as an object identifier in the message sending goal. This feature is mainly used with parametric objects when their identifiers correspond to predicates defined in `user`.

- Using it as a message to an object. This is mainly useful when the message is e.g. a conjunction of messages, some of which being calls to Prolog built-in predicates.

Note

This control construct is opaque to cuts when used to wrap a goal (thus ensuring the same semantics independently of the argument being bound at compile time or at runtime).

## Modes and number of proofs

    {+callable} - zero_or_more

## Errors

`Goal` is a variable:
`instantiation_error`
`Goal` is neither a variable nor a callable term:
`type_error(callable, Goal)`
`Closure` is a variable:
`instantiation_error`
`Closure` is neither a variable nor a callable term:
`type_error(callable, Closure)`
`Term` is a variable:
`instantiation_error`
`Term` is neither a variable nor a callable term:
`type_error(callable, Term)`

## Examples

    % overload the standard (<)/2 operator by
    % calling its standard built-in definition:
    N1/D1 < N2/D2 :-
        {N1*D2 < N2*D1}.

    % call a closure in the context of "user":
    call_in_user(F, X, Y, Z) :-
        call({F}, X, Y, Z).

    % bypass the compiler for a proprietary backend directive:
    {:- load_foreign_resource(file)}.

    % use parametric object proxies:
    | ?- {circle(Id, Radius, Color)}::area(Area).
    ...

    % use Prolog built-in predicates as messages:
    | ?- logtalk::{write('hello world!'), nl}.
    hello world!
    yes