В Perl 6 операторы считаются частью текущего языка .Все вещи, которые относятся к текущему языку, определены лексически (то есть my
-области).Следовательно, подпрограмма multi
- это правильная вещь.
Если поместить этот код в модуль, вы, вероятно, также захотите пометить multi
для оператора с is export
:
multi infix:<~>(A:D $lhs, A:D $rhs) is export {
('(', $lhs.val, ',', $rhs.val, ')', 'µ').join;
}
Так что он будет доступен пользователям, которые use
или import
модуль (на самом деле use
определен в терминах import
, а import
импортирует символы в лексическую область).
Хотя есть некоторые операторы, которые по умолчанию делегируют методы (например, prefix:<+>
вызывает Numeric
), между ними нет отношения 1: 1, и для большинства операторов их реализация напрямуюоператор sub
(или распределенный по многим multi sub
с).
Кроме того, набор операторов открыт, поэтому нельзя ограничивать перегрузку существующих операторов, но также можно вводить новые.Это поощряется, когда новое значение для оператора явно не связано с нормальной семантикой используемого символа;например, было бы целесообразно перегрузить +
для добавления матрицы, но для чего-то, что нельзя было бы рассматривать как дополнение, новый оператор был бы лучшим выбором.