Моя последняя идея для операции not-at (я расскажу о реализации ниже):
Использование:
say '0123456789'[- 1..3, 8 ]; # 045679
Реализация, упаковка (вариант) решения Брэда:
multi postcircumfix:<[- ]> (|args) { remove |args }
sub remove( Str:D $str is copy, +@exdices){
for @exdices.reverse {
when Int { $str.substr-rw($_,1) = '' }
when Range { $str.substr-rw($_ ) = '' }
}
$str
}
say '0123456789'[- 1..3, 8 ]; # 045679
Синтаксис для использования оператора, который я объявил, является string[- list-of-indices-to-be-subtracted ]
, то есть с использованием знакомой записи [...]
, но со строкой слева и дополнительным минусом после открытия [
для указывают, что содержимое нижнего индекса представляет собой список exdices , а не indexes .
[Редактировать: я заменил мою первоначальную реализацию на Брэда. Это, вероятно, неправильно, потому что, как отмечает Брэд, его решение «предполагает, что [exdices] находятся в порядке от низшего к высшему, и перекрытия нет», и хотя он не обещает иначе, использование [- ... ]
очень близко к этому. Поэтому, если кто-то использует этот синтаксический сахар, он, вероятно, не должен использовать решение Брэда. Возможно, есть способ устранить предположение, которое делает Брэд.]
Мне нравится этот синтаксис, но я знаю, что Ларри намеренно не использует [...]
для индексации строк так что, возможно, мой синтаксис здесь не подходит для широкого распространения. Возможно, было бы лучше, если бы использовались некоторые другие символы брекетинга. Но я думаю, что использование простого синтаксиса postcircumfix неплохо.
(я также пытался реализовать прямой вариант [ ... ]
для индексации строк точно так же, как для Positional
s, но не смог заставить его работать по независящим от меня причинам сегодня вечером. Странно [+ ... ]
будет работать для того, чтобы создавать превосходства, но не для того, чтобы делать индексы; для меня это вообще не имеет смысла! В любом случае, я опубликую то, что у меня есть, и считаю этот ответ завершенным.)
[Изменить: Приведенное выше решение имеет два аспекта, которые следует рассматривать как отдельные. Во-первых, пользовательский оператор syntacti c sugar, предоставляемый объявлением postcircumfix:<[- ]> (Str ...
. Во-вторых, текст этой декларации. Выше я использовал (вариант) решения Брэда. Мой первоначальный ответ ниже.]
Поскольку ваш вопрос сводится к удалению некоторых индексов .comb
и повторению join
результата, ваш вопрос по сути дубликат ... [Редактировать: неверно, согласно ответу Брэда.]
Что такое быстрый способ отменить выбор элементов массива или списка? добавляет еще больше решений для ответов [.comb ... .join
] здесь.
Реализовано как два мультисистема, поэтому один и тот же синтаксис может использоваться с Positional
s:
multi postcircumfix:<[- ]> (Str $_, *@exdex) { .comb[- @exdex ].join }
multi postcircumfix:<[- ]> (@pos, *@exdex) { sort keys ^@pos (-) @exdex }
say '0123456789'[- 1..3, 8 ]; # 045679
say (0..9)[- 1..3, 8 ]; # (0 4 5 6 7 9)
Реализация sort keys ^@pos (-) @exdices
- это лишь слегка упрощенная версия ответа @ Себастьяна. Я не сравнивал его с решением jnthn из предыдущего ответа, который я связал выше, но если это быстрее, его можно заменить. * [Редактировать: Очевидно, что вместо этого должно быть решение Брэда для строкового варианта.] *