Новые идеи для 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.