2015-05-14 73 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