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