A signature is a static description of the parameter list of a code object. That is, it describes what and how many arguments you need to pass to the code or function in order to call it.
Passing arguments to a signature binds the arguments, contained in a Capture
, to the signature.
For information on signature literals, see here.
Methods§
method params§
method params(Signature: --> Positional)
Returns the list of Parameter
objects that make up the signature.
method arity§
method arity(Signature: --> Int)
Returns the minimal number of positional arguments required to satisfy the signature.
method count§
method count(Signature: --> Real)
Returns the maximal number of positional arguments which can be bound to the signature. Returns Inf
if there is a slurpy positional parameter.
method returns§
Whatever the Signature's return constraint is:
:(, --> Int).returns # OUTPUT: «(Int)»
method ACCEPTS§
multi method ACCEPTS(Signature: Signature )multi method ACCEPTS(Signature: Capture )multi method ACCEPTS(Signature: Mu \topic)
If $topic
is a Signature
returns True
if anything accepted by $topic
would also be accepted by the invocant, otherwise returns False
:
:(, ) ~~ :(, , ?); # OUTPUT: «True»:(Int ) ~~ :(Str); # OUTPUT: «False»
The $topic
is a Capture
, returns True
if it can be bound to the invocant, i.e., if a function with invocant's Signature
would be able to be called with the $topic
:
\(1, 2, :foo) ~~ :(, , :foo()); # OUTPUT: «True»\(1, :bar) ~~ :(); # OUTPUT: «False»
Lastly, the candidate with Mu \topic
converts topic
to Capture
and follows the same semantics as Capture
$topic
:
<a b c d> ~~ :(Int ); # OUTPUT: «False»42 ~~ :(Int); # OUTPUT: «False» (Int.Capture throws)set(<a b>) ~~ :(:, :); # OUTPUT: «True»
Since where
clauses are not introspectable, the method cannot determine whether two signatures ACCEPTS the same sort of where
-constrained parameters. Such comparisons will return False
. This includes signatures with literals, which are just sugar for the where
-constraints:
say :(42) ~~ :($ where 42) # OUTPUT: «False»
method Capture§
method Capture()
Throws X::Cannot::Capture
.
Runtime creation of Signature objects (6.d, 2019.03 and later)§
Signature.new(params => (...), returns => Type, arity => 1, count => 1.Num)
In some situations, specifically when working with the MetaObject Protocol, it makes sense to create Signature
objects programmatically. For this purpose, you can call the new
method with the following named parameters:
params
A list of Parameter
objects for this signature.
returns
Any constraint the return value should match. Defaults to Mu
, which effectively implies no return value constraint check.
arity
The minimal number of positional arguments required to satisfy the signature. Defaults to the number of Parameter
objects given with the params
parameter.
count
The maximal number of positional arguments which can be bound to the signature. Defaults to the arity
if not specified. Specify Inf
if there is a slurpy positional parameter.
Warning: although the logical type of the count
parameter is integer, the value assigned to it must explicitly be of type Num
. If any other type is used, the new
method silently fails and returns an empty signature. The same trouble occurs when the value assigned to the arity
parameter is not of type Int
.