[] уменьшить с помощью анонимной функции в Perl 6 - PullRequest
0 голосов
/ 07 мая 2018

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

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

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

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

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

Ответы [ 2 ]

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

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

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

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

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

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

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

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

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

> @a [Z[[+]=]] 1..5
> @a Z[[+]=] 1..5
> @a Z[+=] 1..5
> @a Z+= 1..5
0 голосов
/ 07 мая 2018

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

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

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

Я переместил свой комментарий сюда и немного расширил его, прежде чем я засну.

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

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

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

Обновление

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

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

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

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

...