Как определить свои собственные операторы на языке программирования Io? - PullRequest
11 голосов
/ 28 мая 2010

Я пытаюсь определить свой собственный оператор в 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 не должен быть равен нулю. Как я могу исправить?

1 Ответ

14 голосов
/ 28 мая 2010

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

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

  1. Бинарные операторы (например, 1 + 2, называемые просто «операторами»)
  2. Операторы присваивания (например, a: = b)

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

OperatorTable addOperator("!!", 3)

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

message(a !! b)

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

==> a !!(b)

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

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

...