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

时间:2012-04-30 11:38:28

标签: 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 个答案:

答案 0 :(得分:4)

文件执行发生在以下阶段:

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

因此,只有在第2阶段初始加载文件时才会发生操作符到消息转换。 当在第3阶段执行操作员注册码时,这已经发生了, 因此,运营商没有效果。

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

答案 1 :(得分:2)

确认后,我得到了以下解决方案:

main.io:

doFile("ops.io")
doFile("script.io")

ops.io:

OperatorTable addOperator(":", 2)
: := method(value,
            list(self, value))

script.io:

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

就像滴答解释一样,整个文件立即加载,因此您必须将其拆分,以便加载顺序保证运算符可用。