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