2

考虑这段代码:

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"

为什么会这样?

4

2 回答 2

4

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

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

因此,只有在第 2 阶段最初加载文件时才会发生运算符到消息的转换。在第 3 阶段执行运算符注册代码时。这已经发生,因此运算符无效。

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

于 2012-04-30T11:48:32.137 回答
2

通过勾选确认后,我得出了以下解决方案:

主.io:

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

操作.io:

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

脚本.io:

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

就像打勾解释的那样,整个文件是一次加载的,所以你必须把它分开,这样加载顺序才能保证操作符可用。

于 2012-04-30T12:14:42.357 回答