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
但是,我不確定我是否以正確的方式做這件事。
阻止'_F_'在全局方法緩存中可見只是性能優化,還是實際上會改變某些內容? – gTcV
用我目前的方法,我遇到了類似於https://github.com/JuliaLang/julia/issues/9869的東西,我也不明白這是怎麼發生的以及如何避免的細節。主要是因爲簡單,我轉而將'clever_foo_impl'定義爲通過'eval(( - )> begin #code end)()'調用的匿名函數,並且異常似乎已被消除。這種方法保存嗎? – gTcV