2012-04-30 41 views
2

考慮以下代碼:爲什麼Io REPL和解釋器給我兩個不同的值?

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中加載。 當在階段3中執行運營商註冊代碼時,這已經發生, 因此操作員不起作用。

您可以設置手動加載文件的順序,並將操作員定義放入加載的第一個文件中。 例如有一個名爲operators.io的文件,其中包含在使用它們的文件之前加載的所有運算符定義。

+0

它在加載的唯一文件的頂部,但仍然沒有效果。 – krainboltgreene

+3

沒關係。滴答指出,它是在編譯時完成的,而不是執行時間。 Io在任何執行之前都有編譯時間(甚至是文件中的第一個表達式),這是操作員混洗髮生的時間。因此,在系統執行文件中的第一個表達式時,更改影響該文件的操作符表已經太晚了。想想它就像在你開始駕駛之前試圖改變你的汽車輪胎,而不是先停下來。 – jer

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 

像滴答作響的解釋,整體e文件一次加載,因此您必須將其拆分,以便加載順序保證操作員可用。

相關問題