Ну, есть одна проблема в вашем коде. Проще говоря, вы еще не добавили! к столу оператора. Я расскажу вам немного об этом.
Операторы в Io перемешиваются перед созданием AST. Это означает, что мы должны поддерживать список известных операторов с определенными уровнями приоритета, чтобы знать, какие из них связываются более жестко, чем другие. Мы делаем это в «OperatorTable». Если вы находитесь в REPL, вы можете увидеть, как его использовать, введя «OperatorTable» в REPL (без кавычек). Это даст вам список операторов (генерируемых динамически, поэтому новые операторы добавляются по мере их определения), а также примеры того, как использовать операторы каждого типа. Есть два типа:
- Бинарные операторы (например, 1 + 2, называемые просто «операторами»)
- Операторы присваивания (например, a: = b)
Итак, в вашем примере ваш код верен; нам не нужно ничего там менять. Однако нам не хватает одного куска кода, чтобы подсистема синтаксического анализа знала, как обращаться с вашим оператором. Я приведу пример, который предполагает, что вы хотите, чтобы он связывался так же тесно, как умножение.
OperatorTable addOperator("!!", 3)
Теперь мы можем увидеть, как это происходит, создав сообщение и посмотрев, как представлено его дерево. Снова в REPL, если мы введем:
message(a !! b)
Мы увидим что-то вроде этого:
==> a !!(b)
Это так же, как любой другой вызов метода, он должен где-то существовать, иначе вы получите ошибку. Вы можете использовать его так, как показано выше (с явными круглыми скобками), или вы можете использовать его так, как хотите в исходном вопросе, без явных круглых скобок. Как и с любым оператором, вы подчиняетесь правилам приоритета, если вы не используете явные скобки, просто чтобы вы знали.
Надеюсь, это ответит на ваш вопрос.