楽演算子のオーバーロード


8

次のコードを使用します。

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';
}

結果:

(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

一方、コメントブロックを他の定義に切り替えると、次のようになります。

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

壊れたバージョン(3つのパラメーター付き)が私が欲しいバージョンですが、誰かがなぜそれが壊れているのか説明できますか?

回答:


10

<5 0 10>文字通りList単一のを 構築しListます。

たとえは、やることのリスト、ToDoリストです。ToDoリストはいくつですか?それは1-1つのToDoリストです。

したがって、次のエラーメッセージが表示されます。

expected 3 arguments but got 1

必要なのは、それ自体が複数の値で構成される1つの値が必要であることを指定することです。これを行う1つの方法を次に示します。

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

追加の周囲(破壊)引き起こします。


1
代替案は、slurpy署名を使用することができ(*@foo where .elems == 3)、その後のいずれかでサポートすることができるα $a, $b, $c ω、またはα ($a, $b, $c) ω
user0721090601

@ user0721090601サブシグもどちらもサポートします。署名の豊富さをサブsigにwhere入れると、句よりもコンパイラに多くの知識が与えられるため、たとえば、より良いデフォルトのエラーメッセージとディスパッチ速度が得られます。whereサブsigが処理できない任意の条件、または完全にカスタムのエラーメッセージ(例:)を定義するための句を見つけます( *@ where { .elems == 3 or die "nope" } )。これらを組み合わせることができることに注意してください。( *@ where { .elems == 3 or die "nope" } ($a, $b, $c) )正しい引数を取得したときに名前付き変数に分解し、取得しなかったときにカスタムエラーメッセージを表示します。
raiph

1
++ multi sigはwhereを回避するように機能しますが、whereを提供しながら匿名のものを使用して構造を解除できることに気づきませんでした(つまり、例を見ることはできず、実際には本当に読みやすいと思いました)。
user0721090601

はい、multis です。句のwhereない複数のシグネチャで区別できるエラーのユースケースで句を悪用するという私の提案よりもはるかに優れていますwhere。(振り返ってみると、ハッカーの本能がまったく不要で不適切であるとわかったとき、私は自分の本能の啓示に戸惑いました!)Anyhoo、別の賛成投票をしてください。:)
ライフ

7
D:\>6e "say <5 0 10>"
(5 0 10)

これらは3つの引数ではありません。これは(タイプのIntStr)3つの値のリストであるため、1つの引数になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.