gpt4 book ai didi

operators - 如何在 Io 编程语言中定义自己的运算符?

转载 作者:行者123 更新时间:2023-12-03 22:30:37 26 4
gpt4 key购买 nike

我正在尝试在 Io 中定义自己的运营商,但我遇到了困难。我有一个对象:

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

但是当我调用它时,像这样:
x := MyObject clone do(lst appendSeq(list(1, 2, 3)))
x !! 2

但是我得到一个异常(exception),即 at 的参数 0 不能为零。我该如何解决?

最佳答案

好吧,您的代码中有一个问题。简单来说就是你没有添加!!到运算符(operator)表。我会给你一些背景知识。

在构建 AST 之前,Io 中的运算符会被洗牌。这意味着,我们必须维护一个具有特定优先级的已知运算符列表,以了解哪些运算符比其他运算符绑定(bind)得更紧密。我们在“OperatorTable”中执行此操作。如果您在 REPL 中,您可以通过在 REPL 中键入“OperatorTable”(不带引号)来查看如何使用它。这将为您提供运算符列表(动态生成,因此在定义时添加新运算符),以及如何使用每种类型的运算符的示例。有两种类型:

  • 二元运算符(例如 1 + 2,简称为“运算符”)
  • 赋值运算符(例如 a := b)

  • 因此,在您的示例中,您的代码是正确的;我们不必在那里改变任何东西。然而,我们遗漏了一点代码来让解析子系统知道如何处理你的操作符。我将提供一个示例,假设您希望它像乘法一样紧密绑定(bind)。
    OperatorTable addOperator("!!", 3)

    现在,我们可以通过构造消息并查看其树的表示方式来了解它是如何被打乱的。再次在 REPL 中,如果我们输入:
    message(a !! b)

    我们会看到这样的东西:
    ==> a !!(b)

    这就像任何其他方法调用一样,它必须存在于某个地方,否则你会得到一个错误。您可以像上面显示的那样使用它(带有明确的括号),或者您可以在原始问题中使用它,而无需明确的括号。与任何运算符一样,如果您不使用显式括号,则您必须遵守优先规则,以便您知道。

    希望这能回答你的问题。

    关于operators - 如何在 Io 编程语言中定义自己的运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926620/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com