Julia中的编译器消息
考虑以下代码: 文件C.jlJulia中的编译器消息,julia,Julia,考虑以下代码: 文件C.jl module C export printLength printLength = function(arr) println(lentgh(arr)) end end #module 文件Main.jl using C main = function() arr = Array(Int64, 4) printLength(arr) end main() 让我们试着执行它 $ julia Main.jl ERROR: lent
module C
export printLength
printLength = function(arr)
println(lentgh(arr))
end
end #module
文件Main.jl
using C
main = function()
arr = Array(Int64, 4)
printLength(arr)
end
main()
让我们试着执行它
$ julia Main.jl
ERROR: lentgh not defined
in include at /usr/bin/../lib64/julia/sys.so
in process_options at /usr/bin/../lib64/julia/sys.so
in _start at /usr/bin/../lib64/julia/sys.so
while loading /home/grzes/julia_sucks/Main.jl, in expression starting on line 8
显然,它没有编译,因为lentgh
拼写错误。问题是我收到的信息<代码>第8行开始的表达式仅为main()
。Julia无可救药地没有指出无效的代码片段——它只是指向调用main
,但错误的行甚至不在该文件中!现在想象一个真实的项目,其中错误隐藏在调用堆栈的深处。Julia仍然不愿意透露更多的信息,问题开始于执行的入口点。像那样工作是不可能的
有没有办法强迫Julia给出更精确的消息?在这种情况下,这几乎肯定是内联的结果:你的
printLength
函数很短,几乎肯定是内联到调用站点,这就是为什么你得到了第8行
最终,内联将不会导致回溯问题。目前,如果您正在运行julia的0.4预发行版,您最好的选择是以julia的身份启动julia,即
julia--inline=no
,然后再次运行您的测试。与您的问题不完全相关,但您正在使用您的定义创建匿名函数,这些函数通常性能不太好:。更具朱利安风格的方法是类似于printLength(arr)=println(length(arr))
。这不会改善错误消息,只是性能不是很重要,但是julia代码通常不使用驼峰大小写——下划线是首选。我看到的大多数julia代码都使用function main()
而不是main=function()
——如上所述,您会获得更好的性能。我想我有一个习惯,就是从R编写f=function()
。我不知道这在julia中是一个不好的做法。谢谢你指出这一点!我不相信这只是内联的问题——对于更复杂的函数,行为是一样的。无论如何,我从github(0.4.0-dev)编译了julia的最新版本。这个版本正好指向错误的行(即使没有--inline=no
)。非常感谢所有贡献者:)。我可能承认将0.4版作为解决方案。