Подгруппировка блоков (или Callables в целом) - PullRequest
0 голосов
/ 17 мая 2018

Этот вопрос был первоначально опубликован lookatme на канале Perl6 IRC .Первоначальное намерение состоит в том, чтобы ограничить Callable на , используя подмножества или любым другим возможным способом.Он работает в подписи, однако это:

subset WalkCb of Callable where *.signature ~~ :(Int $a); 
my WalkCb $x = sub (Int $a) { return $a; };

возвращает

«Type check failed in assignment to $x; expected WalkCb but got Sub (sub (Int $a) { #`(Sub...)␤  in block <unit> at <tmp> line 1␤␤»

Другие варианты объявления возвращают аналогичные сообщения.Какой будет правильный синтаксис?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Ограничение where может принимать блок (лямбда) или оператор.

… where { $_ == 42 }; # block
… where    * == 42;   # lambda
… where   $_ == 42;   # statement

Дело в том, что ~~ не участвует в создании лямбда-кодов Wh whatCode (*)
Итак, вы действительно создаете лямбду *.signature внутри большего where оператора (не лямбда).

constant $lambda = *.signature;
subset WalkCb of Callable where $lambda ~~ :(Int $);

Что, конечно, никогдавернуть True, поскольку лямбда имеет подпись :(;; $ is raw)


Так что вместо этого просто напишите форму заявления.(используя неявное $_)

subset WalkCb of Callable where .signature ~~ :(Int $);
my WalkCb $x = sub (Int $a) { return $a }
say $x(42); # 42␤
0 голосов
/ 17 мая 2018

Похоже, что синтаксический анализ WhateverCode в этом случае не работает.Таким образом, если вы укажете блок в where:

subset WalkCb of Callable where { .signature ~~ :(Int $) }
my WalkCb $x = sub (Int $a) { return $a; }

, он будет работать как положено.Также обратите внимание, что я удалил ; в конце строки, так как } в конце строки также является концом оператора.И то, что я удалил «a» из подписи: имя позиционных параметров в smartmatching подписи игнорируется.

...