Непонятные потопленные звонки через CALL-ME - PullRequest
5 голосов
/ 12 февраля 2020

Пытаясь придумать пример карт в скрытом контексте, я наткнулся на этот код:

my $a = -> { 42 };
my $b = -> { "foo" };

$a;
$a();

($a,$b).map: { $_ };

Первый вызов $ a сам по себе возвращает:

WARNINGS for /home/jmerelo/Code/raku/my-raku-examples/sunk-map.p6:
Useless use of $a in sink context (line 6)

Однако размещение. () Или () позади или использование их в (как я думал, это было) контекста приемника на карте не привело к какому-либо предупреждению. Вероятно, это не контекст слива, но я хотел бы знать, почему.

1 Ответ

5 голосов
/ 12 февраля 2020
$a;
$a();
($a,$b).foo ...

Первый вызов $a сам по себе

Это не "вызов". Это всего лишь упоминание об этом, ака "использовать". (Примечание: это использование «использования» не имеет ничего общего с ключевым словом use в выражении use.)

ПРЕДУПРЕЖДЕНИЯ для / home / jmerelo / Code / raku / my-raku-examples / sunk-map.p6: Бесполезное использование $ a в контексте стока (строка 6)

Верно. Просто упоминать это так бесполезно. Вы не делаете ничего со значением $a (которому была назначена функция). Вы просто опускаете его на пол.

Однако, если оставить .() или () позади или использовать их в (как я думал, это было) контекст приемника на карте, это не привело к любое предупреждение.

Верно. Они вызывают .CALL-ME на левой стороне. Они считаются потенциально полезными независимо от того, используется ли в коде какое-либо значение, возвращаемое вызовом. Так что нет никакого предупреждения, несмотря на то, что он находится в контексте приемника (хотя, возможно, контекст приемника сам по себе зависит от контекста, а на уровне компилятора они даже не считаются находящимися в контексте приемника; я не знаю).

cf мой комментарий о похожей ситуации в perl.

...