2015-05-14 3 views
2

Рассмотрим следующий код:Сообщения компилятора в Джулии

Файл 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: 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 написано с ошибками. Проблема в том, что я получил сообщение. expression starting on line 8 - это просто main(). Джулия безнадежно не указала неверный фрагмент кода - он просто указывает на вызов main, но ошибочная строка даже не в этом файле! Теперь представьте реальный проект, где ошибка скрывается в глубине стека вызовов. Джулия все еще не говорила ничего, кроме того, что проблема началась с точки входа в исполнение. Невозможно работать так ...

Есть ли способ заставить Джулию дать более точные сообщения?

+0

Не полностью связан с вашим вопросом, но вы создаете анонимные функции с вашими определениями, которые обычно не очень эффективны: https://github.com/JuliaLang/julia/issues/1864. Более julian-способом будет что-то вроде 'printLength (arr) = println (length (arr))'. Это не улучшит сообщение об ошибке, просто производительность – ptb

+0

Не то, чтобы это было важно, но код julia обычно не использует верблюд. --- подчеркивания предпочтительны. И самый код julia, который я видел, использует 'function main()', а не 'main = function()' ---, как указано выше, вы получите лучшую производительность. – tholy

+0

Я думаю, что у меня была эта привычка писать 'f = function()' из R. У меня не было представления, что это плохая практика в Джулии. Спасибо что подметил это! –

ответ

3

В этом случае почти наверняка является следствие встраивания: ваша printLength функции настолько мала, что почти наверняка встраивается в место вызова, поэтому вы получаете номер строки 8.

В конце концов, это, как ожидается, что вложение не вызовет проблем для обратных отображений. На данный момент ваш лучший выбор - если вы используете версию до релиза julia 0.4, --- начать julia как julia --inline=no и снова запустить тесты.

+0

Я не уверен, что это всего лишь вопрос встраивания - для более сложных функций поведение одинаково. Во всяком случае, я собрал последнюю версию julia из github (0.4.0-dev). Эта версия точно указывает на ошибочную строку (даже без '--inline = no'). Большое спасибо всем участникам :). Я могу подтвердить переход на версию 0.4 в качестве решения. –

Смежные вопросы