Daily Julia #2

この連載には Julia 周辺の気になるトピックを集めておく、ということ以外の方針らしい方針は存在しない。要するにチラ裏である。情報の速報性にはあまりこだわらずパッケージ類なども適宜触っていこうと考えている。ブログを更新することそれ自体が目的なのです。

goto マクロがマージされた #5699

Add labels and gotos. (Fixes #101) by dcjones · Pull Request #5699 · JuliaLang/julia

マクロとして @goto, @label が組み込まれた。早速 HEAD を更新して動かそうとしたら次のコードがエラー。

function f()
  @goto x

  println("not printed.")
  
  @label x
end
ERROR: label 0 not found

エラーメッセージが 0-origin なのは 1-orgin を採用している Julia への暗黙の抗議に見える。

さてなんで動かないのかなーということだが、ここ でのやりとりを見るに @goto を最後の式と使うことはまだできず、明示的な return をしないとだめである。

追記: 以下のプルリクで直った。

Fix error on functions ending with @goto. by dcjones · Pull Request #7312 · JuliaLang/julia

実装がよく分からないのだが julia-syntax.scm から AST をいじっているようだ。Scheme 難しい。

float(AbstractArray) と complex(AbstractArray) のパフォーマンス改善 #7308

Performance: float(AbstractArray) and complex(AbstractArray) by catawbasam · Pull Request #7308 · JuliaLang/julia

名前を付けた関数と比較して無名関数は 3.3 倍遅かった。ProfileView.jl のデモを見ていたら気づいたとのこと。無名関数はやはり遅いのか。

しかしこうなると色々直すべき所あるんじゃないだろうか。例えば typeofこんな感じで無名関数でちゃちゃっと書かれているが、こういうのもパフォーマンス上の問題を引き起こしたりしないのだろうか?

typesof(args...) = map(a->(isa(a,Type) ? Type{a} : typeof(a)), args)

julia/base/interactiveutil.jl at master · JuliaLang/julia

実測してないからやいのやいの言っても仕方ないか。それとも型キャストみたいにパフォーマンスに敏感になるほど使わないのかな…

話はずれるが、ProfileView の作者が notebook でデモを動かそうとしたら SVG (mime?) がちゃんと表示されなかったので IJulia 方面に Issue を立てたようだ 。実は自分もこれ を動かそうとしたときに気づいたけど「これバグ?」って Issue 立てるのは心理的障壁高いなー。

ProfileView Example and abstractarray.jl

staged な関数 (メソッド) に関する議論 #7311

Staged Functions · Issue #7311 · JuliaLang/julia

あまりよく理解できないが、メタプログラミング方面の強力な提案であるらしい。

@staged function foo{T<:Real}(::Type{T},::Type{T})
  quote
    $T
  end
end

というふうに書くと、

julia> foo(1,1)
Int64

foo(::Int64, ::Int64) という特殊化されたメソッドコンパイルされる。Jeff Bezanson の言葉を引いておく。

macros are so last century - Google グループ

A staged method is very similar to a normal method, except instead of computing a result value from input values, it constructs code from the types of the arguments, and that code will then be called on the actual run-time argument values.

disallow f (a,b) · Issue #7232 · JuliaLang/julia

関数とカッコの間にスペースを置くスタイルをエラーにするべきという議論。マクロとカッコの間にスペースを置くとエラーになるのでそれとの兼ね合いから不可ということにしたい? マクロにカッコを強制するか否かという点についても議題に上っているようだが、それを強制すると @inbound@parallel を書く時にだるいことになるなどなど。

Literate Julia?

Literate Julia? - Google グループ

Literate Haskell みたいなのを作る気ありませんか、と聞いているのかもしれないが微妙にオフトピとして見られてるっぽい? 紹介されているサードパーティ製のライブラリにちょっと興味があるので見てみる。

jocco

Docco の Julia ポート。METADATA.jl に登録されてないので Pkg.add できない。そもそも去年から更新されていないので 0.3 対応も進んでないっぽい。

Markdown.jl

こちらは現在進行形で開発が続いているようだ。Markdown パーサを自前で書いており GitHub Flavoured Markdown もパースできるらしい。将来的に Literate な記法や HTML, PDF, ターミナル, IJulia notebook へのアウトプットを行えるようにすると言っているが、pandoc の力を借りる気はないのか、という気もしないでもない。