Esse é um argumento ou nenhum para um bloco Perl 6?

Qual é a maneira do Perl 6 de dizer a diferença entre um argumento e nenhum argumento em um bloco sem assinatura explícita? Não tenho nenhum uso prático para isso, mas estou curioso.

Um bloco sem assinatura explícita coloca o valor em$_:

my &block := { put "The argument was $_" };

A assinatura é realmente;; $_? is raw. Esse é um argumento opcional. o@_ A variável não está definida no bloco porque não há assinatura explícita.

Não há argumento, onde$_ será indefinido:

&block();  # no argument

Mas há também uma situação de um argumento em que$_ será indefinido. Um objeto de tipo é sempre indefinido:

&block(Int);

Mas um$_ com nada nele é realmente umQualquer (em vez de, digamos,Nada) Não sei dizer a diferença entre esses dois casos:

&block();
&block(Any);

Aqui está um exemplo mais longo:

my $block := {
    say "\t.perl is {$_.perl}";

    if $_ ~~ Nil {
        put "\tArgument is Nil"
        }
    elsif ! .defined and $_.^name eq 'Any' {
        put "\tArgument is an Any type object"
        }
    elsif $_ ~~ Any {
        put "\tArgument is {$_.^name} type object"
        }
    else {
        put "\tArgument is $_";
        }
    };

put "No argument: ";    $block();
put "Empty argument: "; $block(Empty);
put "Nil argument: ";   $block(Nil);
put "Any argument: ";   $block(Any);
put "Int argument: ";   $block(Int);

Observe o argumento no e as formas Any argument mostram as mesmas coisas:

No argument:
    .perl is Any
    Argument is an Any type object
Empty argument:
    .perl is Empty
    Argument is Slip type object
Nil argument:
    .perl is Nil
    Argument is Nil
Any argument:
    .perl is Any
    Argument is an Any type object
Int argument:
    .perl is Int
    Argument is Int type object

questionAnswers(2)

yourAnswerToTheQuestion