0

这是我的代码:

OperatorTable addOperator("xor", 11)

OperatorTable println

true xor := method(bool, if(bool, false, true))
false xor := method(bool, if(bool, true, false))

true xor(false)
true xor false

当我将它输入 relp 时,它可以正常工作。但是,当我尝试在文件中运行它时,它的true xor false工作方式很奇怪。

4

1 回答 1

0

发生这种情况是因为运算符表代码像其他代码一样被解析一次。这意味着如果您想在您首先定义它的文件中使用它,您需要将您的操作员表代码放在一个单独的文件中。然后doFile("...")在与您的操作员表内容相同的文件中进行调用。

关于 Io 要了解的一件事是,它的解析器除了“重写运算符”之外没有多个阶段——这意味着,如果在解析文件时运算符在表中,它将使用这些优先级来根据这些规则在需要的地方添加括号。但是,如果您在希望使用它们的文件中定义优先规则,它将不起作用,因为在您操作运算符表之后 Io 不会执行第二个解析阶段。

在构建此功能时,我们讨论过它,但选择保持简单,因为多个阶段需要额外的复杂性。

REPL 以它的方式工作,因为每次您按 Enter 键时,它就像一个新文件——它是一个新的字符串缓冲区,其中包含 VM 将在运行上下文中解释的代码,但单独解析它。

我希望这有帮助。就上下文而言,我多年来一直是 Io 的开发人员。

于 2021-07-16T14:32:10.730 回答