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 input list of tokens and the list of remaining tokens 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 input list of tokens and the list of remaining tokens 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.

When using a backend Prolog compiler supporting a module system, calls in the format call(Module:Closure) may also be used. By using as argument a lambda expression, this built-in non-terminal can provide controlled access to the input list of tokens and to the list of the remaining tokens processed by the grammar rule containing the call.

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 tokens difference list 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 tokens difference list to the closure:
call(^^Closure)
To send a goal, constructed by appending the tokens difference list to the closure, as a message to self:
call(::Closure)
To send a goal, constructed by appending the tokens difference list to the closure, as a message to an explicit object:
call(Object::Closure)