読者です 読者をやめる 読者になる 読者になる

りんごがでている

何か役に立つことを書きます

Unicodeプログラミングのすゝめ

Julia

Julia Advent Calendar 2014 4日目の記事です。

以前、工学部の友人から「変数muの積をmuと書いたと思ったら、パラメータμmuと書いてたりするFortranのコードがあって混乱する」という話を聞きました。

最近の言語はUnicodeを使える物も多いですが(Unicode variable names)、そんなに積極的に使われているわけでもありません。

Juliaは根っからのUnicode好きです。Unicode(UTF8)文字列を最初からサポートしていることはもちろん、 変数名や関数名などに自由にUnicode文字を使えます。

Juliaの対話セッションを立ち上げて、\pi<Tab>と入力してみましょう。

~/v/julia (master|…) $ julia -q
julia> π
π = 3.1415926535897...

julia>

\piギリシャ文字のπに変化しましたね。 これはJuliaの定数で、piもしくはπに束縛されています。 他のUnicode文字についても、LaTeXの記法を用いてREPLに入力できます。 \alpha<Tab>, \beta<Tab>, \psi<Tab>などいろいろ試してみましょう。

当然、漢字だって使えます。

julia> 円周率 = π
π = 3.1415926535897...

julia> 円周率
π = 3.1415926535897...

julia> 半径 = 4.0
4.0

julia> 半径^2 * 円周率
50.26548245743669

エディタで入力する

REPLで使えてもあんまり嬉しくないかもしれません。かといってαを入力するのに エディタで「あるふぁ」と打って変換するのも面倒です。 実はVimなら簡単にUnicode文字を使ってプログラミングをできます。 そのためには、julia-vimを導入する必要があります。

julia-vimではJuliaのREPLと同じように\alpha<Tab>と入力するとαに変換されるようになっています。 つまり、

a + \alpha

の次にTabキーを押すと

1 + α

と変換されます。 この設定は、Juliaファイルについてはデフォルトで有効です。

EmacsについてもJuliaのcontrib/julia-mode.elLaTeX => Unicodeの変換表がありますので同様のことが可能だと思います(Emacs使いじゃないので分かりません。ゴメンナサイ)。

f:id:bicycle1885:20141205010304g:plain

実際のコード

この機能を使って、擬似コードをそっくりそのままJuliaのコードに翻訳してみました。

次の擬似コード(Hoffman, 2014) のコードです。 ここでは何をやっているコードかは気にする必要はありません。

f:id:bicycle1885:20141205010033p:plain

これを見た上で、下のJuliaのコードを見てみましょう。 これは、実際に動くコードです。

function build_tree(L::Function, ∇L::Function, θ::Vector{Float64}, r::Vector{Float64}, u::Float64, v::Int, j::Int, ϵ::Float64)
    if j == 0
        θ′, r′ = leapfrog(∇L, θ, r, v * ϵ)
        C′ = u ≤ exp(L(θ′) - r′ ⋅ r′ / 2) ? Set([(θ′, r′)]) : Set([])
        s′ = int(L(θ′) - r′ ⋅ r′ / 2 > log(u) - Δmax)
        return θ′, r′, θ′, r′, C′, s′
    else
        θ⁻, r⁻, θ⁺, r⁺, C′, s′ = build_tree(L, ∇L, θ, r, u, v, j - 1, ϵ)
        if v == -1
            θ⁻, r⁻, _, _, C″, s″ = build_tree(L, ∇L, θ⁻, r⁻, u, v, j - 1, ϵ)
        else
            _, _, θ⁺, r⁺, C″, s″ = build_tree(L, ∇L, θ⁺, r⁺, u, v, j - 1, ϵ)
        end
        s′ = s′ * s″ * ((θ⁺ - θ⁻) ⋅ r⁻ ≥ 0) * ((θ⁺ - θ⁻) ⋅ r⁺ ≥ 0)
        C′ = C′ ∪ C″
        return θ⁻, r⁻, θ⁺, r⁺, C′, s′
    end
end

変数の対応関係がそっくりそのまま分かるほど似ていませんか? 不等号()や集合の和()もJuliaの関数として既に定義されています。

ちなみに、はそれぞれ\^+<Tab>\pprime<Tab>で入力できます。

コード全体はnuts.jlから入手できます。

おまけ

絵文字も使えます。絵文字を使うにはmasterブランチのJuliaが必要です。

f:id:bicycle1885:20141205011058p:plain

次は@kimrinさんです。