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

カチカチ音をたてて確認した後、次の解決策にたどり着きました。

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

ティックが説明するように、ファイル全体が一度にロードされるため、ロード順序によってオペレーターが確実に使用できるように分割する必要があります。

于 2012-04-30T12:14:42.357 に答える