Ответ 1
В Perl 6 операторы считаются частью текущего языка. Все вещи, которые относятся к текущему языку, определены лексически (то есть my
-scoped). Следовательно, multi
sub - правильная вещь.
Если поместить этот код в модуль, вы, вероятно, также захотите пометить 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
).
Кроме того, набор операторов открыт, поэтому нельзя ограничивать перегрузку существующих операторов, но также можно вводить новые. Это поощряется, когда новое значение для оператора явно не связано с нормальной семантикой используемого символа; например, перегрузка +
для добавления матрицы была бы разумной, но для чего-то, что нельзя было бы рассматривать как дополнение, новый оператор был бы лучшим выбором.