changed 4 years ago
Published Linked with GitHub

Julia による 衛生的な生活

2020/05/30 Python東海/JuliaTokaiミニ合同勉強会
@ OSC2020 Online/Nagoya
antimon2(後藤 俊介)

Note:
Julia で衛生を保とう!


お前誰y?(ry

Note:
コミュニティ紹介で自己紹介もしたのでこちらでは省略っ


みなさん…

Note:


手洗いしていますか?

Note:
帰宅後や食事前にきちんと手を洗っていますか?っ


マスクしていますか?

Note:
外出時や人と会うときにマスクをいますか?っ
普段衛生的な生活を心がけているなら、当然…


じゃぁ当然…

Note:
ますよねっっ?っ


Julia のマクロ 使っていますよね?

Note:
ますよねっっ?っ


Julia のマクロは 衛生的

Note:
なぜならっ


衛生的なマクロ(Hygienic Macro)

衛生的マクロ(hygienic macro)は、マクロ展開によって導入される識別子と展開先のプログラムにある識別子が衝突して、意図とは異なる意味になることを防ぐ機構を持つマクロである。

出典:「多言語に対応した衛生的マクロ機構導入方式」(DOI

Note:
なぜならっ


Julia のマクロの例


macro time_ns(ex)
    return quote
        t0 = time_ns()
        val = $(esc(ex))
        t1 = time_ns()
        println("elapsed time: ", Int(t1-t0), " nanoseconds")
        val
    end
end

Note:
これは実行時間を計測するためのマクロの例ですっ


julia> @time_ns 1 + 2
elapsed time: 5604 nanoseconds
3

julia> @time_ns time_ns()
elapsed time: 9684 nanoseconds
0x00049b777cb1b4b1

Note:
ナノ秒なのでこんな単純な計算でも結果がっ


julia> @time_ns t0 += 1000000
# => ???

Note:
ではこんなの実行したらどうなるっ?


julia> @time_ns t0 += 1000000
ERROR: UndefVarError: t0 not defined
Stacktrace:
 [1] top-level scope at REPL[XX]:YY

Note:
エラーになりますっ!


julia> @macroexpand @time_ns t0 += 1000000
quote
    #= REPL[XX]:YY =#
    #12#t0 = (Main.time_ns)()
    #= REPL[XX]:YY =#
    #13#val = (t0 += 1000000)
    #= REPL[XX]:YY =#
    #14#t1 = (Main.time_ns)()
    #= REPL[XX]:YY =#
    (Main.println)("elapsed time: ", (Main.Int)(#14#t1 - #12#t0), " nanoseconds")
    #= REPL[XX]:YY =#
    #13#val
end

Note:
なぜならこんなコードに変換されて実行されるからっ!


  • マクロ中の変数(t0 val t1)が変な名前(#12#t0 #13#val #14#t1)に変換されている
  • マクロ中の関数に勝手にモジュール名が付加(time_ns()(Main.time_ns)())されている
  • esc(ex) と書かれた部分は勝手に変換されていない(t0 += 1000000


  • マクロ中の(ローカル)変数は他とかぶらない名前に変換される!
  • マクロ中の識別子でグローバルに存在するモノはモジュール名が付加されて特定される!
  • esc(ex) に渡されたモノだけは勝手に変換されずにそのまま使用される!


  • Julia のマクロは 衛生的!

まとめ


  • 手洗い!
  • マスク!
  • Julia のマクロ!

でコロナ禍を乗り切ろう!

Note:
で、衛生的な生活を心がけてコロナ禍を乗り切ろう!っ


ご清聴ありがとうございます。

Note:
ご清聴ありがとうございますっ!


参考リンク

Select a repo