println(@__MODULE__)
Main
モジュールとパッケージ作成
司馬 博文
9/10/2020
10/16/2024
A Blog Entry on Bayesian Computation by an Applied Mathematician
$$
$$
Module は,Julia において名前空間を提供する.
documentation における Base.map
などである.現在 Module 内では大域的な名前を,外部から参照不可能にする方法はない. 現在の Module は @__MODULE__
マクロで確認できる.
この時の ”method” の語は,OOP に似ている使い方であるが,やはり多重ディスパッチが意識されている.Julia の多重ディスパッチにおいて,関数とは method の張り合わせである.
module
文とexport
文:Module 定義module MyModule
export my_function
const global_var = 42
function my_function(x)
return x * global_var
end
end # module MyModule
my_function
はMyModule.my_function
の外部からアクセス可能な関数になる.
export
文は,この module をusing
した時に,何が取り込まれるかを指定する.
module は入れ子式にできる.その際はA.B.foo
というように参照する.
using
文:既存の外部 Module から名前を輸入する:
演算子:個別の名前だけを選んで取り込むとすると,Module 内部の変数・関数名は一切入れずに,Module 名だけ取り込む.
すると,Statistics.mean
という形で利用できるようになる.using
じゃ届かない import
されていない名前も,全てこの方法でアクセスできる.1
using .MyModule
名前はLOAD_PATH
変数に沿って検索される.
REPL で定義した直後の module は Main.Module
になっており,LOAD_PATH
が通っていないので,using Module
と言われてもわからない.
この場合は,相対 path で読み込む必要がある..Module
でアクセスできる...
は親の子モジュール,...
は祖父母の子モジュールにアクセスする.ShellScript と同じ要領である.
include
文:ファイルの分割String
を path として評価し,そのファイルを見つけ出し,Julia 文として評価する.
path の構文は /
を用いる.2
include 関数を REPL で使うと,相対 path は working directory からのものと解釈される.
Import
文:拡張を許す取り込みまたusing
文と違って,export
に制御された暗黙の取り込みがない.
import
を使わない方法:
Base.length(v::MyType) = 3
構文と:
演算子はusing
と同じ.
PkgTemplates.jl
(GitHub / Docs)3ディレクトリごと作成する場合は:
既存のディレクトリを用いる場合は:
既存のプロジェクトを有効にして REPL を起動する場合は
この状態で
とすると,Project.toml
に依存関係が追記され,パッケージ内でusing Example
とすることができるようになる.
プロジェクト(環境)とは,Project.toml
とManifest.toml
(任意)を備えたディレクトリのことをいう.
Project.toml
はプロジェクトが読み込む名前空間と識別子を定義する.
これらのファイルは抽象的には次の3つの写像を定めている:
roots : name::Symbol
\(\Longrightarrow\) uuid:UUID
パッケージ名name
に,一意なuuid
を割り当てる.
環境内でimport X
という構文を見つけた際,Julia は識別子 roots[:X]
を検索する.
graph : context::UUID
\(\Longrightarrow\) name::Symbol
\(\Longrightarrow\) uuid::UUID
roots とは違って,コンテクストによって変わり得る名前とUUID
の対応を定める.
paths : uuid::UUID
\(\times\) name::Symbol
\(\Longrightarrow\) path::String
uuid
とname
の組に,パッケージのインストールされた場所を定める.
写像roots
はProject.toml
の[deps]
セクションによって定義される.
これで指定しないと何を取り込んだのかの制御が外部にあるままなので(module 定義内のexport
文),共同開発の時は指定するのが良い.↩︎
Windows のように,Julia は/を使う.↩︎
日本語解説記事もある:Qiita (2023.9).↩︎