Возможно ли определить пользовательские метаоператоры в Raku?

#operators #raku

#операторы #raku

Вопрос:

Стандартный способ определения нового оператора в Raku

 multi sub infix:<operator> ($l, $r) { ... }
  

С различными параметрами вместо инфикса. Однако я хотел бы определить пользовательский мета оператор. Самое близкое, что я могу придумать (соответствующее идее @a X @b), это

 multi sub prefix:<F> (amp;bar) { ... }
  

Но пока он компилируется, единственный способ заставить его работать, например, с оператором, — это использовать полный идентификатор:

 (Famp;infix:< >)($a, $b)
  

Или метаоператоры можно определить?

Комментарии:

1. Этот вопрос задан в отношении reddit.com/r/rakulang/comments/iii0i5 /… . Основываясь на моем чтении metaops файла в core.c , они выглядят очень не определяемыми без сленга, но я не знаю, является ли это долгосрочной целью, или они будут оставлены на сленге.

Ответ №1:

В настоящее время вы не можете определить пользовательские метаоператоры в Raku.

Возможно, вы сможете заставить его работать с помощью сленга, но с кодом, специфичным для Rakudo, а сленги не очень хорошо документируются — лучшее, что вы можете сделать, это учебные пособия и примеры Google, docs.raku.org о них ничего не говорится 🙁

Комментарии:

1. Это то, что я предполагал, но решил, что задам вопрос от имени redditer, просто чтобы быть уверенным. Вероятно, нет причин, по которым метаоператоры не могут быть легко определены пользователем, но у них есть всевозможные странные способы взаимодействия с кодом. Например, у вас может быть префиксный метаоператор, но комбинированный metaop op функционирует как инфикс. Или [ ] , где это исправление по окружности относительно основной операции, которая должна быть infx (но может содержать другие метаоператоры), а вся комбинация действует как своего рода префикс / sub.

2. С точки зрения грамматики / действий для Rakudo, это взаимодействие, вероятно, не слишком сложно определить, но вопрос в том, как вы определяете op. может быть multi sub metaop:circumfix<[ ]>:acts-as<prefix> (amp;main-op where amp;infix) или что-то подобное для сокращения metaop