[] уменьшить с анонимной функцией в 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
означает не космос.)
(Конечно, я был бы совершенно озадачен, почему это непространственное правило было без ответа Брэда).