2016-10-25 3 views
0

Я пытаюсь определить правильный способ организовать исходное дерево для приложения Julia seqscan. Теперь у меня есть следующее дерево:Каков правильный способ организовать исходное дерево Джулии?

$ tree seqscan/ 
seqscan/ 
├── LICENSE 
├── README.md 
├── benchmark 
├── doc 
├── examples 
├── src 
│   └── seq.jl 
└── test 
    └── test_seq.jl 

5 directories, 4 files 

Файл seq.jl содержит

module SeqScan 
module Seq 

export SeqEntry 

type SeqEntry 
    id 
    seq 
    scores 
    seq_type 
end 

end 
end 

и test_seq.jl содержит:

module TestSeq 

using Base.Test 
using SeqScan.Seq 

@testset "Testing SeqEntry" begin 
    @testset "test SeqEntry creation" begin 
     seq_entry = SeqEntry("test", "atcg") 
     @test seq_entry.id == "test" 
     @test seq_entry.seq == "atcg" 
    end 
end 

end 

Однако запуск тестового кода дает ошибку:

ERROR: LoadError: ArgumentError: Module SeqScan not found in current path. 

даже после установки переменной окружения JULIA_LOAD_PATH для включения seqscan или seqscan/src, так что я должен что-то делать неправильно?

+0

ли перезапуску Джулии после изменения пути загрузки? Кроме того, я думаю, вы хотите, чтобы имя модуля соответствовало как директории, так и имени файла. – ARM

+0

Я запустил файл 'test_seq.jl' из командной строки, а не REPL. У нас есть какая-либо конкретная информация о сопоставлении имен модулей/dir/файлов? - Я не вижу, что в документах – maasha

+0

См. Http://docs.julialang.org/en/release-0.5/manual/modules/ об именах и путях файлов. Если модуль находится на вашем пути, вы должны использовать его с использованием «TestSeq» в REPL или скрипте, а не для запуска основного файла сценария из командной строки. Взгляните на структуру существующих пакетов Julia в каталоге вашего пакета: http://docs.julialang.org/en/release-0.5/manual/packages/ – ARM

ответ

2

Имя вашего пакета (корень вашего локального дерева) должно соответствовать имени файла, который существует в каталоге src. Попробуйте следующее:

SeqScan/ 
    |-- src/ 
     |-- SeqScan.jl (your seq.jl) 

Я не знаю, почему вы вставляете модуль Seq в SeqScan. Если нет важной причины для этого, вы можете получить доступ к типу более непосредственно. Вы можете удалить «модуль Seq» и ​​парный «конец». Тогда просто «использование SeqScan» приведет к типу SeqEntry.

Тип, SeqEntry, как написано, знает, что делать, если заданы четыре значения полей, по одному для каждого из определенных полей. Если вы хотите инициализировать этот тип только двумя первыми полями, вам нужно включить конструктор с двумя аргументами. Например, если предположить SEQ является вектором некоторого числового типа и оценки также является вектором этого числового типа и и seq_type является числовой тип:

function SeqEntry(id, seq) 
    seq_type = typeof(seq[1]) 
    scores = zeros(seq_type, length(seq)) 
    return SeqEntry(id, seq, scores, seq_type) 
end 

Пример пакета с внутренними модулями, для Джулии v0. 5.

Пакет имеет имя MyPackage.jl; он включает в себя два внутренних модуля: TypeModule и FuncModule; каждый модуль имеет свой собственный файл: TypeModule.jl и FuncModule.jl.

TypeModule содержит новый тип MyType. FuncModule содержит новую функцию MyFunc, которая работает с переменной [s] MyType. Существуют две формы этой функции: версия 1-arg и 2-arg.

MyPackage использует оба внутренних модуля. Он включает в себя каждый для немедленного использования и инициализирует две переменные MyType. Затем MyPackage применяет MyFunc к ним и печатает результаты.

Я предполагаю, что каталог пакетов Джулии «/you/.julia/v0.5» (Windows: «c: \ you.julia \ v0.5») и ссылается на него как PkgDir. Вы можете найти реальный каталог пакетов, набрав Pkg.dir() в интерактивном приглашении Julia. Первое, что нужно сделать, убедитесь, что внутренняя информация Юлии актуальна: > Pkg.update(), а затем получить специальный пакетный вызов PkgDev: > Pkg.add("PkgDev")

Вы можете начать свой пакет на GitHub. Если вы начинаете его локально, вы должны использовать PkgDev, потому что он создает необходимый файл пакета (и другие), используя нужную структуру: > using PkgDev затем > PkgDev.generate("MyPackage","MIT") Это также создает файл LICENSE.md с лицензией Julia. Вы можете сохранить его, заменить или удалить.

В каталоге PkgDir/MyPackage/src создайте подкаталог «внутренний». В каталоге PKGDIR/MyPackage/SRC/внутренний, создать два файла: "TypeModule.jl" и "FuncModule.jl", это:

TypeModule.jl:

module TypeModule 
    export MyType 

    type MyType 
     value::Int 
    end 

end # TypeModule 

FuncModule.jl:

module FuncModule 

    export MyFunc 

    #= 
    !important! 
    TypeModule is included in MyPackage.jl before this module 
    This module gets MyType from MyPackage.jl, not directly. 
    Getting it directly would create mismatch of module indirection. 
    =# 
    import ..MyPackage: MyType 

    function MyFunc(x::MyType) 
     return x.value + 1 
    end 

    function MyFunc(x::MyType, y::MyType) 
     return x.value + y.value + 1 
    end 

end # FuncModule 

И в каталоге Src, редактировать MyPackage.jl так соответствует этому:

MyPackage.jl:

module MyPackage 

    export MyType, MyFunc 

    #= 
     !important! Do this before including FuncModule 
     because FuncModule.jl imports MyType from here. 
     MyType must be in use before including FuncModule. 
    =#  
    include(joinpath("internal", "TypeModule.jl")) 
    using .TypeModule # prefix the '.' to use an included module 

    include(joinpath("internal", "FuncModule.jl")) 
    using .FuncModule # prefix the '.' to use an included module 

    three = MyType(3) 
    five = MyType(5) 

    four = MyFunc(three) 
    eight = MyFunc(three, five) 

    # show that everything works 
    println() 
    println(string("MyFunc(three) = ", four)) 
    println(string("MyFunc(three, five) = ", eight)) 

end # MyPackage 

Сейчас работает Юлия ввод > using MyPackage должна показать это:

julia> using MyPackage 

     4 = MyFunc(three) 
     9 = MyFunc(three, five) 

julia> 
+0

Я хочу использовать модули для определения пространств имен, один для проекта и вложенный в эти разные модули для различных функциональных компонентов. – maasha

+1

Текущая версия Julia не поддерживает пространства имен. Вы можете использовать разные модули для подделки, только если нет экспорта, который имеет одно и то же имя (или будут столкновения, которые Джулия не будет знать, как их разрешить). Если вы используете разные модули и всегда используете полное имя, указанное в модуле, вы можете быть в порядке ... но это станет более тернистым, чем хочет Джулия. Вы можете быть намного счастливее, предоставляя различным функциональным компонентам их подходящие уникальные имена, реализуя их в своих подчиненных файлах и используя _include_ внутри SeqScan.jl. –

+1

Предположим, что у вас есть две компоненты, каждая из которых является одной функцией: одна называется _dothis_, а другая - _dothat_. У вас все еще есть файл SeqScan.jl, расположенный здесь /.julia/v0.5/SeqScan/src/SeqScan.jl. В том же каталоге, src, добавьте DoThis.jl и DoThat.jl. DoThis.jl содержит, например, «function dothis (x) ... end» и DoThat.jl аналогичным образом. SeqScan.jl может быть 'модуль SeqScan' ' экспорт SeqEntry, dothis, dothat' 'включают ("DoThis.jl")' ' включают ("DoThat.jl")' ' типа SeqEntry ...' 'end # module' –