built-in method

# `call//1-N`

## Description

    call(Closure)
    call(Closure, Arg1, ...)
    call(Object::Closure, Arg1, ...)
    call(::Closure, Arg1, ...)
    call(^^Closure, Arg1, ...)
    ...

This non-terminal takes a closure and is processed by appending the two implicit grammar rule arguments to the arguments of the closure. This built-in non-terminal is interpreted as a private non-terminal and thus cannot be used as a message to an object.

Using this non-terminal is recommended when calling a predicate whose last two arguments are the two implicit grammar rule arguments to avoid hard-coding assumptions about how grammar rules are compiled into clauses. Note that the compiler ensures zero overhead when using this non-terminal with a bound argument at compile time. To call a predicate with a different argument order, use a lambda expression. For example:

    square -->
        call([Number, Double]>>(Double is Number*Number)).

When using a backend Prolog compiler supporting a module system, calls in the format `call(Module:Closure)` may also be used.

## Meta-non-terminal template

    call(0)
    call(1, *)
    call(2, *, *)
    ...

## Modes and number of proofs

    call(+callable) - zero_or_more
    call(+callable, ?term) - zero_or_more
    call(+callable, ?term, ?term) - zero_or_more
    ...

## Errors

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

## Examples

Calls a goal, constructed by appending the two implicit grammar rule arguments to the closure, in in the context of the object or category containing the call:
`call(Closure)`
To make a super call, constructed by appending the two implicit grammar rule arguments to the closure:
`call(^^Closure)`
To send a goal, constructed by appending the two implicit grammar rule arguments to the closure, as a message to self:
`call(::Closure)`
To send a goal, constructed by appending the two implicit grammar rule arguments to the closure, as a message to an explicit object:
`call(Object::Closure)`

See also

eos//0, phrase//1, phrase/2, phrase/3