2013-01-16 32 views
1

在使用Julia宏時,我似乎回到了試錯編程中,這也不例外。我試圖編寫一個簡單的宏來捕獲表達式中的任何錯誤,並在表達式失敗時設置一個標誌。這是一個宏,因爲我希望表達式(可能包含一個或多個賦值語句)在調用上下文中進行評估。所以,像這樣:宏在Julia分配中發現錯誤

macro flag_errors(ex) 
    broken = false 
    esc(quote 
     try 
      $(ex) 
     catch 
      broken = true 
     end 
    end) 
end 

我已經試過嵌套esc功能的各種方式,但我還沒有找到正確評估的通話環境中分配的方法:

julia> @flag_errors a=2 
2 

julia> a 
a not defined 

julia> @flag_errors a=2+"X" 
true 

julia> a 
a not defined 

julia> broken 
broken not defined 

什麼寫這個宏的正確方法是什麼? try塊是否會導致問題?

回答

1

我認爲try塊是這裏的罪魁禍首,因爲它引入了一個新的作用域塊。如果要分析ex中的作業,通常需要一些非常嚴肅的元編程來解決這個問題。你爲什麼需要它?

+0

我試圖在extras/test.jl中增強setup塊中的錯誤。理想情況下,錯誤會以測試套件報告沒有被破壞的方式被捕獲。 – Harlan

3

我同意Toivo這是一個範圍問題。例如,運行下面的代碼正確地分配全球環境:

julia>@flag_errors global a = 2 
a 

julia>a 
2 

這樣解決了,如果你確定與a現有的全球環境問題。如果這已經在另一個範圍內(功能,嘗試等),我們必須進一步進行實驗。

乾杯。

2

這裏有一些問題。一個是你有兩個不相關的變量名爲broken - 一個在宏中,另一個在引用體中。另一個缺乏衛生轉義的表達 - 它應該插入爲$(esc(ex))爲了向宏擴展器表明它應該在宏調用者的上下文中評估,而不是在宏定義上下文中評估。最後還有Toivo提到的範圍問題。爲使這種行爲好像它不在新的區塊中所需的範圍分析可能不可能;我不完全確定。