operators - 为什么 Io REPL 和解释器给我两个不同的值?

标签 operators read-eval-print-loop iolanguage

考虑这段代码:

OperatorTable addOperator(":", 2)

: := method(value,
  list(self, value)
)

hash := "key": "value"
hash println

返回值应该是list(key, value),并且在 Io REPL 中使用它时,这正是返回值。使用解释器时(如io somefile.io),返回的值是value。经过一番检查后,差异如下:

# In the REPL
OperatorTable addOperator(":", 2)
message("k" : "v") # => "k" :("v")

# Via the Interpreter
OperatorTable addOperator(":", 2)
message("k" : "v") # => "k" : "v"

为什么会发生这种情况?

最佳答案

文件执行发生在这些阶段:

  • 加载文件
  • 根据当前运算符表替换运算符
  • 执行内容

因此,运算符到消息的转换仅在文件最初在第 2 阶段加载时发生。 当运算符(operator)注册代码在第3阶段执行时,这已经发生了, 因此该运算符没有任何作用。

您可以设置手动加载文件的顺序,并将运算符定义放在加载的第一个文件中。 例如,有一个名为 operators.io 的文件,其中包含在使用它们的文件之前加载的所有运算符定义。

关于operators - 为什么 Io REPL 和解释器给我两个不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383065/

相关文章:

iolanguage - Io语言: Exception: Object does not respond to 'URL'

python - Python getslice项目运算符覆盖功能不起作用

objective-c - Objective-C 方法调用中前缀/后缀增量之间的区别?

c++ - 为什么我们在赋值运算符重载中使用引用返回而不是在加减运算中?

java - 如何使用操作符号(、-、*、/)与自定义对象进行交互?

clojure - 运行独立 clojure REPL 的推荐方法是什么?

string - 如何将字符串转换为 Io 中的列表?

frameworks - Io 框架开始学习 Io(编程语言)

capybara - capybara 的 REPL

xml - 如何将 Invoke-RestMethod 的响应转换为 XML?