MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

JuliaのREPLを使った開発フロー


Juliaプログラミングクックブック ―言語仕様からデータ分析、機械学習、数値計算まで

目次

はじめに

以前、プログラミング言語Juliaを紹介しましたが、

myenigma.hatenablog.com

JuliaにはREPL(read-eval-print loop)と呼ばれる対話的実行環境があり、

今回はこちらをもちいた開発の方法について説明したいと思います。

 

REPL実行と終了

JuliaのREPLはコマンドラインから

$ julia

と入力することで起動できます。

終了はCtrl + d または quit()でできます。

Julia REPLのモード

JuliaのREPLにはいくつかのモードがあります。

1. Juliaモード

Juliaのコードを入力すると、実行してくれるモードです。

JuliaのREPLのデフォルトはこのモードで、

REPLの行の左側が >julia となっていると、

Juliaモードです。

MATLABと同様に、変数は保存され使い回すことができます。

一つ前の実行された値はansに保存されます。

これもMATLABと同じです。

 

ちなみにREPLで一度実行された関数は、

JITコンパイルされた状態で残るため、

二度目に読んだ場合は計算が早くなります。

また、Ctrl + L を押すと、表示がすべてクリアされます。

 

2. helpモード

REPLで?を入力するとhelpモードになります。

ここで、型や関数、マクロを入力すると、

その説明が表示されます。

 

下記のようなフォーマットでコメントを書いておくと、

helpモードで自作の関数の説明もみれて便利です。

"""
    rad2deg(x)
Convert `x` from radians to degrees.
# Examples
\```jldoctest
julia> rad2deg(pi)
180.0
\```
"""
rad2deg(z::AbstractFloat) = z * (180 / oftype(z, pi))

3. Shell モード

セミコロン;を入力すると、Shellモードになり、

シェルのコマンドが使えるようになります。

4. Searchモード

Ctrl + rを押すと、Bashと同じように、

過去のREPLの履歴を検索することができます。

5. Pkgモード

] を押すと、Pkgモードというモードになり、

Pkg> add パッケージ名

で外部パッケージをインストールしたり、

Pkg> update

でパッケージをすべて最新版に更新したり、

開発中のパッケージを読み込んだりできます。

 

REPLで開発する時に便利なツール

下記のツールを利用すると便利です。

 

OhMyREPL.jl

このパッケージをインストールして、startup.jlで起動するようにすると、

REPLのコードがハイライトされたり、対応する括弧が自動で設定されたりします。

github.com

 

Revise.jl

モジュールを開発していると、

変更部分を適用するために、毎回REPLを再起動する必要があり、

面倒ですが、

このRevise.jlを使うと、自動的に変更部分を認識し、

REPLの再起動無しに、変更部分のみを再コンパイルしてくれます。

github.com

docs.julialang.org

 

Revise.jlは基本的に、モジュール単位で変更を検知しますが、

スクリプト単位で変更を検知する関数としてincludetがあります。

timholy.github.io

 

しかし、一つ注意点として、

このincludetは指定したスクリプトの変更を検知して

自動コンパイルしてくれるだけで、

指定したスクリプトがインクルードしている別のファイルを変更しても、

その別ファイルの自動コンパイルはしてくれません。

 

そこで、startup.jlに下記のような関数を定義し、

function recursive_includet(filename)
    already_included = copy(Revise.included_files)
    includet(filename)
    newly_included = setdiff(Revise.included_files, already_included)
    for (mod, file) in newly_included
        Revise.track(mod, file)
    end
end

includetの代わりにこのrecursive_includet関数を使って、

スクリプトを指定すると、自動的にそのファイルが

インクルードしている別スクリプトも変更検知対象としてくれ、

そのファイルを変更すると自動的にコンパイルしてくれるようになります。

 

workspace()関数

REPLでworkspace()とすると、

REPLの環境をクリアすることができます。

GitHub上のJuliaパッケージを開発する方法

下記の通りに実施できます。

  1. GitHub上でforkして、手元にcloneする

  2. REPL上で、pkgモードにして, dev /path/to/moduleとする

  3. Reviseを起動して、対象となるモジュールをusingする

  4. あとは自動的にREPL上で変更が適応されるため開発して、PRを作る

 

テストを実行する

  1. REPLで "]" キーを押して、pkgモードにして

  2. Project.tomlがあるディレクトリに対して、 activate /path/to/Project.toml する

  3. testとタイプすると、テストが自動実行される

 

パッケージを公開する

qiita.com

 

パッケージ開発の資料

qiita.com

qiita.com

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com