Как определить собственные операторы на языке программирования Io?

Я пытаюсь определить своего оператора в Io, и мне тяжело. У меня есть объект:

MyObject := Object clone do(
  lst := list()
  !! := method(n, lst at(n))
)

Но когда я его назову, вот так:

x := MyObject clone do(lst appendSeq(list(1, 2, 3)))
x !! 2

Но я получаю исключение, что аргумент 0 до at не должен быть nil. Как я могу исправить?

Ответ 1

Ну, в вашем коде есть одна проблема. Проще говоря, вы не добавили!! к таблице операторов. Я расскажу вам немного об этом.

Операторы в Io перетасовываются перед построением AST. Это означает, что мы должны поддерживать список известных операторов с определенными уровнями приоритетов, чтобы знать, какие из них связаны сильнее других. Мы делаем это в "OperatorTable". Если вы находитесь в REPL, вы можете увидеть, как его использовать, набрав "OperatorTable" в REPL (без кавычек). Это даст вам список операторов (генерируется динамически, поэтому новые операторы добавляются по мере их определения), а также примеры использования каждого типа оператора. Существует два типа:

  • Двоичные операторы (например, 1 + 2, называемые просто "операторами" )
  • Операторы присваивания (например, a: = b)

Итак, в вашем примере ваш код прав; мы ничего не должны менять. Однако нам не хватает одного бита кода, чтобы подсистема синтаксического анализа знала, как обращаться с вашим оператором. Я приведу пример, предполагающий, что вы хотите, чтобы он привязывался так же сильно, как умножение.

OperatorTable addOperator("!!", 3)

Теперь мы можем видеть, как это перетасовывается, создавая сообщение и глядя на то, как его дерево представлено. Опять же в REPL, если мы наберем:

message(a !! b)

Мы увидим что-то вроде этого:

==> a !!(b)

Это как любой другой вызов метода, он должен существовать где-то, иначе вы получите сообщение об ошибке. Вы можете использовать его, как показано выше (с явным скобкой), или вы можете использовать его так, как вы хотите в своем исходном вопросе, без явных скобок. Как и для любого оператора, вы подчиняетесь правилам приоритета, если вы не используете явные скобки, просто чтобы вы знали.

Надеюсь, это ответит на ваш вопрос.