Правильный способ включения файлов в Julia-Lang, чтобы обновления считались - PullRequest
0 голосов
/ 24 апреля 2018

Я признаю, что был новичком в Юлии.Однако, просматривая различные документы, я не смог найти подходящий ответ на мой (возможно, очень простой) вопрос.

Что я знаю из Matlab

Рассмотрим два файла впапка src/ называется main.m и anotherfunc.m

function main
 anotherfunc(0)
end

и

function anotherfunc(x)
 disp(sin(x))
end

Я бы запустил main в командном окне и увидел желаемый результат (=0).Теперь, может быть, я передумаю и предпочитаю

function otherfunc(x)
 disp(cos(x))
end

Я бегу main снова и вижу 1.

Чего я не знаю о Джулии Как сделать то же самое.Я опробовал два подхода, которые, как я предполагал, сработал.

1)

Файлы anotherfunc.jl:

function anotherfunc(x)
 print(sin(x))
end

и (в том же каталоге) main.jl:

function main()
 anotherfunc(0)
end

Теперь я запускаю julia в терминале и пишу

julia> include("anotherfunc.jl")
anotherfunc (generic function with 1 method)

julia> include("main.jl")
main (generic function with 1 method)

julia> main()
0.0

Хорошо.Теперь я изменяю sin на cos и получаю

julia> main()
0.0

Это меня не удивляет, я знаю, что мне нужен еще include, то есть

julia> include("anotherfunc.jl")
anotherfunc (generic function with 1 method)

julia> main()
1.0

Так что это работает, нокажется довольно склонным к ошибкам, я забуду о включении в будущем.

2) Я думал, что буду умным и напишу

  function main
     include("anotherfunc.jl")
     anotherfunc(0)
    end

Но закрытие julia и повторный запуск дает

julia> main()
ERROR: MethodError: no method matching anotherfunc(::Int64)
The applicable method may be too new: running in world age 21834, while current world is 21835.
Closest candidates are:
  anotherfunc(::Any) at /some/path/anotherfunc.jl:2 (method too new to be called from this world context.)
Stacktrace:
 [1] main() at /some/path/main.jl:4

Это, очевидно, неправильно.

Подводя итог: я не знаю о наилучшей процедуре для обработки кода, который разбит на несколькофайлы и изменения в процессе разработки.

1 Ответ

0 голосов
/ 24 апреля 2018

Самый простой способ сделать это, я полагаю, использовать Modules вместо include и пакет Revise.

Установить Revise.jlвызывая `Pkg.add (" Revise ")

В вашем рабочем каталоге или каком-либо другом каталоге есть Module в MyModule.jl.

module MyModule

export anotherfunc

function anotherfunc(x)
    display(sin(x))
end

end

Сначала убедитесь, чточто каталог, в котором хранятся модули, находится в вашем LOAD_PATH.Рабочий каталог Джулии по умолчанию не добавляется в LOAD_PATH, поэтому, если вы поместите свой модуль в свой рабочий каталог, тогда вызовите push!(LOAD_PATH, pwd()), в противном случае вызовите push!(LOAD_PATH, "/path/to/your/module").Вы можете добавить этот код в ваш файл .juliarc, чтобы не вызывать его для каждого запускаемого вами экземпляра julia.

Теперь у нас есть следующий основной файл.

using Revise # must come before your module is loaded.
using MyModule

anotherfunc(0)

Теперь измените ваш файл MyModule.jl, чтобы anotherfunc использовал cos вместо sin и посмотрел результаты.

Я предлагаю вам прочитать https://docs.julialang.org/en/stable/manual/modules/ и https://github.com/timholy/Revise.jl

...