2015-05-14 52 views
1

當生成一個函數的不明確產生的版本,@ngenerate運行朱莉婭:本地模塊範圍

eval(quote 
    local _F_ 
    $localfunC# Definition of _F_ for the requested value of N 
    _F_ 
end) 

由於eval在當前模塊,而不是功能的範圍內運行,我不知道是什麼效果local在這方面。據我所知,languange文檔只提到在函數定義內使用​​。


給予一定的背景,爲什麼這個問題出現了:我經常需要在表格中的代碼循環

function foo(n::Int) 
    s::Int = 0 
    for i in 1:1000000000 
     for j in 1:n 
      s += 1 
     end 
    end 
    return s 
end 

其中n <= 10(當然,在我的實際代碼迴路是這樣的,他們不能只是減至O(1))。由於此代碼對於編譯器非常簡單,但在運行時要求很高,因此每次調用foo時都會重新編譯所需的值爲n的循環。

function clever_foo(n::Int) 
    eval(quote 
     function clever_foo_impl() 
      s::Int = 0 
      for i in 1:1000000000 
       s += $(Expr(:call,:+,[1 for j in 1:n]...)) 
      end 
      return s 
     end 
    end) 
    return clever_foo_impl() 
end 

但是,我不確定我是否以正確的方式做這件事。

回答

0

這是爲了防止_F_在全局方法緩存中可見。

如果您將clever_foon重複調用相同,您可以通過將編譯的函數保存在Dict中做得更好。這樣你就不必每次重新編譯它。

+0

阻止'_F_'在全局方法緩存中可見只是性能優化,還是實際上會改變某些內容? – gTcV

+0

用我目前的方法,我遇到了類似於https://github.com/JuliaLang/julia/issues/9869的東西,我也不明白這是怎麼發生的以及如何避免的細節。主要是因爲簡單,我轉而將'clever_foo_impl'定義爲通過'eval(( - )> begin #code end)()'調用的匿名函數,並且異常似乎已被消除。這種方法保存嗎? – gTcV