[] уменьшить с анонимной функцией в Perl 6

Мы можем использовать reduce с sub с двумя аргументами, поставив его в двойные скобки:

> sub mysum { $^a + $^b }
> [[&mysum]] 1,3,5
9

Но что, если мы хотим использовать анонимную функцию?

Оба следующих варианта создают ошибку компиляции:

> [[&{ $^a + $^b }]] 1,3,5
> [[{ $^a + $^b }]] 1,3,5

Ответ 1

Вам не разрешено иметь какие-либо пробелы в этой форме сокращения.

> [[&({$^a+$^b})]] 1, 3, 5
9

Это так, что более очевидно, что это сокращение, а не объявление массива.

> [ { $^a + $^b }, { $^a * $^b } ].pick.(3,5)
8 | 15

Двойной [[…]] является просто расширением, позволяющим использовать любую функцию в качестве инфиксного оператора.

Обратите внимание, что вы должны использовать &(…) в этой функции, когда не говорите об именованной функции &foo или уже существующем операторе infix.

> 3 [&( { $^a + $^b } )] 5
8

Это своего рода расширение использования […] для брекетинга мета-операторов, таких как Z и =

> @a [Z[[+]=]] 1..5
> @a Z[[+]=] 1..5
> @a Z[+=] 1..5
> @a Z+= 1..5

Ответ 2

Не знаю, почему это не работает. Но всегда:

say reduce { $^a + $^b }, 1,3,5 # 9

Я предполагаю, что вы это знали, но все, что у меня есть сегодня. :)

Теперь я переместил свой комментарий и немного расширил его, пока не уснул.

Ошибка TTIAR означает, что он не может проанализировать сокращение как сокращение. Поэтому я решил взять быстрый gander в грамматике Perl 6.

Я искал "уменьшить" и быстро выводил, что он должен не соответствовать этому регулярному выражению.

Хотя для этого регулярного выражения может быть только 20 или около того строк, и я признаю большинство конструкций, это явно не тривиально. Я предполагаю, что есть способ использовать Grammar::Debugger и/или другой инструмент отладки грамматики с грамматикой Perl 6, но я этого не знаю. Между тем, вы должны быть немного свистком регулярных выражений, так что вы скажите мне: почему это не соответствует? :)

Обновить

Когда Брэд отвечает на ваш вопрос в качестве нашего гида, ответ на мой вопрос сразу становится очевидным. Первая строка правильного выражения (после двух объявлений переменных) напрямую соответствует правилу "без пробелов", которое показал Брэд:

<?before '['\S+']'>

Это утверждение о том, что движок регулярного выражения помещается непосредственно перед строкой, которая имеет форму [...] где ... является одним или несколькими непространственными символами. (\s означает пробел, \S означает не космос.)

(Конечно, я был бы совершенно озадачен, почему это непространственное правило было без ответа Брэда).