Überlastung des Raku-Bedieners

8

Verwenden Sie den folgenden Code:

use v6d;

# sub circumfix:<α ω>( @a ) {
#     @a[0] >= @a[1] & @a[0] <= @a[2];
# };

sub circumfix:<α ω>( $a, $b, $c ) {
    $a >= $b & $a <= $c;
};

if (α <5 0 10> ω) {
    say 'Truthy';
}
else {
    say 'Falsey';
}

Ergebnisse in:

(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Too few positionals passed; expected 3 arguments but got 1
  in sub circumfix:<α ω> at ./op.p6 line 7
  in block <unit> at ./op.p6 line 11

Während das Umschalten des kommentierten Blocks für die andere Definition zu Folgendem führt:

(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Truthy

Die kaputte Version (mit drei Parametern) ist die, die ich möchte. Kann jemand erklären, warum sie kaputt ist?

hsmyers
quelle

Antworten:

10

<5 0 10>konstruiert buchstäblich a List, a single List .

Eine Analogie wäre eine Liste von Aufgaben, eine Aufgabenliste. Wie viele Dinge enthält eine Aufgabenliste? Es ist 1 - eine Aufgabenliste.

So erhalten Sie die Fehlermeldung:

expected 3 arguments but got 1

Sie möchten angeben, dass Sie einen Wert möchten , der selbst aus mehreren Werten besteht. Hier ist eine Möglichkeit, dies zu tun:

sub circumfix:<α ω>( ( $a, $b, $c ) ) ...

Die zusätzliche Umgebung (und )verursachen Zerstörung .

Raiph
quelle
1
Eine Alternative könnte sein, eine schlampige Signatur zu verwenden, (*@foo where .elems == 3)die dann entweder α $a, $b, $c ωoderα ($a, $b, $c) ω
user0721090601
@ user0721090601 Sub-Sigs unterstützen ebenfalls. Durch das Einfügen von Signaturreichtum in Sub-Sigs erhält der Compiler mehr Wissen als eine whereKlausel, sodass Sie beispielsweise eine schönere Standardfehlermeldung und Versandgeschwindigkeit erhalten. Ich finde whereKlauseln am besten für beliebige Bedingungen, die ein Sub-Sig nicht verarbeiten kann, oder für die Definition einer vollständig benutzerdefinierten Fehlermeldung (z ( *@ where { .elems == 3 or die "nope" } ). B. ). Beachten Sie, dass Sie diese kombinieren können: ( *@ where { .elems == 3 or die "nope" } ($a, $b, $c) )Sie erhalten eine Destrukturierung in benannte Variablen, wenn Sie die richtigen Argumente erhalten, und eine benutzerdefinierte Fehlermeldung, wenn Sie dies nicht tun.
Raiph
1
++ Multi Sigs würden funktionieren, um das Wo zu vermeiden, aber ich wusste nicht, dass man das anonyme verwenden kann, um es zu zerstören, während man für ein Wo sorgt (ich meine, ich dachte, man könnte einfach nie ein Beispiel sehen und es ist wirklich lesbar).
user0721090601
Ja zu multis, viel besser als mein Vorschlag, eine whereKlausel für einen Fehleranwendungsfall zu missbrauchen , der durch mehrere Signaturen ohne whereKlauseln unterschieden werden kann. (Im Nachhinein schäme ich mich für meine Enthüllung meiner hackigeren Instinkte, wenn sie so völlig unnötig und unangemessen wären!) Wie auch immer, haben Sie noch eine Gegenstimme und danke, dass Sie unsere Antwort mit Ihren Kommentaren verbessert haben. :)
Raiph
7
D:\>6e "say <5 0 10>"
(5 0 10)

Dies sind nicht drei Argumente. Es ist eine Liste von drei Werten (vom Typ IntStr) und daher ein einzelnes Argument.

Holli
quelle