Новые идеи для smart match
После выхода Perl 5.18 оператор умного сравнения ~~
, а также связанные с ним
given
и when
были объявлены экспериментальными. Основная причина этого
изменения — чрезвычайно сложная и запутанная таблица действий в зависимости от
типа аргументов этих операторов. Умное сравнение требовало радикального
пересмотра в сторону упрощения.
На днях в рассылке perl5-porters снова был поднят вопрос о том, каким должен стать обновлённый оператор умного сравнения. Рикардо Сигнес рассказал о своём новом видении работы оператора умного сравнения.
Изначальное предложение было следующим:
В первом приближении будет всего 5 операций:
$x ~~ $qr → $x =~ $qr
$x ~~ /.../ → $x =~ /.../
$x ~~ sub{...} → $sub->($x)
$x ~~ undef → ! defined $x
$x ~~ obj → используется перегрузка ~~ в объекте obj если есть
Второй шаг:
$obj ~~ $x → используется перегрузка ~~ в объекте obj если есть
Третий шаг:
$x ~~ $y → фатальная ошибка
После обсуждения было решено, что второй шаг нежелателен. Хоть это и приведёт к поломке практики использования given в autodie, всё же лучше исправить autodie.
На третьем шаге, в случае двух скаляров, будет возникать фатальная ошибка.
Связно это с тем, что невозможно достоверно выяснить будет ли применяться
сравнение для чисел ==
или сравнение для строк eq
.
С другой стороны, чтобы сохранить типичное использование given/when, например:
given ($x) {
when (undef) {...}
when (100) {...}
when ("string") {...}
}
предлагается всё-таки допустить использование явных значений (но не переменных).
На данный момент реализация новой версии оператора умного сравнения, получившего кодовое имя Smart Match 3, доступна в ветке tonyc/smartmatch git-репозитория исходного кода Perl.