注:請參考user1712368的(傑姆遜納什,朱莉婭DEV)的答案,這discussion在朱莉婭用戶郵件列表和朱莉婭manual的這個條目,要知道這是爲什麼不正確的答案。
這是多重導入表達式的樣子,使用Julia版本0.3。4:
julia> parse("import Foo, Bar")
:($(Expr(:toplevel, :($(Expr(:import, :Foo))), :($(Expr(:import, :Bar))))))
julia> dump(ans)
Expr
head: Symbol toplevel
args: Array(Any,(2,))
1: Expr
head: Symbol import
args: Array(Any,(1,))
1: Symbol Foo
typ: Any
2: Expr
head: Symbol import
args: Array(Any,(1,))
1: Symbol Bar
typ: Any
typ: Any
這裏是一個做到這一點編程宏,它需要一個modules
說法,可能是一個:call
或:vcat
Expr
或Symbol
,其評價爲Vector{Symbol}
:
julia> macro dynamic_import(modules)
(modules = eval(modules))::Vector{Symbol}
ex = Expr(:toplevel)
for m in modules
push!(ex.args, Expr(:import, m))
end
return ex
end
您也可以推廣此行:
module_files = filter(r"^mod[0-9][0-9].jl$", readdir())
通過抽象成接受一個Regex
和作爲參一String
目錄路徑,並返回一個Vector{Symbol}
功能:
julia> function needed_modules(rx::Regex, dir::String=".")
module_files = filter(rx, readdir(dir))
module_syms = map(m -> symbol(split(m, '.')[1]), module_files)
end
needed_modules (generic function with 2 methods)
所以,你可以使用這樣的:
julia> @dynamic_import [:Mod01, :Mod02] # :vcat expression
julia> rx = r"^Mod[0-9][0-9].jl$";
julia> @dynamic_import needed_modules(rx) # :call expression
julia> modules = needed_modules(rx)
2-element Array{Symbol,1}:
:Mod01
:Mod02
julia> @dynamic_import modules # Symbol
最後你可以將它全部包裝到
module中,因此您可以使用
using DynamicImport
:
注:目前我得到這個試圖從一個模塊運行相同的例子時:
julia> using DynamicImport
julia> @dynamic_import [:mod01, :mod02]
julia> rx = r"^mod[0-9][0-9].jl$";
julia> @dynamic_import needed_modules(rx)
ERROR: rx not defined
julia> modules = needed_modules(rx)
2-element Array{Symbol,1}:
:mod01
:mod02
julia> @dynamic_import modules
ERROR: modules not defined
但是如果我定義了REPL裏面的物體,它工作正常,我想這是涉及衛生的問題,這是我沒有經歷過的事情,所以我會在julia-users郵件列表中詢問。
因爲'import'是一個關鍵字,而不是一個函數,所以我想說你需要爲它定義一個[macro](http://julia.readthedocs.org/en/latest/manual/metaprogramming/)。 – Jubobs
@Jubobs我通過一個宏來玩弄了一下,但Julia似乎不喜歡宏中的'import'語句。 – JoshAdel