<span>Julia による</span> <span>衛生的な生活<!-- .element: style="white-space:nowrap" --></span>
===
<!-- .element: style="font-size: 300%" -->
<!-- .slide: data-background-color="rgba(102,130,223,0.3)" -->
2020/05/30 Python東海/JuliaTokaiミニ合同勉強会
@ OSC2020 Online/Nagoya
antimon2(後藤 俊介)
Note:
Julia で衛生を保とう!
---
<!-- .slide: data-background-color="rgba(102,130,223,0.3)" -->
# お前誰y?(ry
Note:
コミュニティ紹介で自己紹介もしたのでこちらでは省略っ
---
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
みなさん…
Note:
っ
---
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
# 手洗いしていますか?
Note:
帰宅後や食事前にきちんと手を洗っていますか?っ
---
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
# マスクしていますか?
Note:
外出時や人と会うときにマスクをいますか?っ
普段衛生的な生活を心がけているなら、当然…
---
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
じゃぁ当然…
Note:
ますよねっっ?っ
---
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
# Julia のマクロ 使っていますよね?
Note:
ますよねっっ?っ
---
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
# Julia のマクロは 衛生的
<!-- .element: style="font-size: 385%" -->
Note:
なぜならっ
---
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
## 衛生的なマクロ(Hygienic Macro)
> 衛生的マクロ(hygienic macro)は、マクロ展開によって導入される識別子と展開先のプログラムにある識別子が衝突して、意図とは異なる意味になることを防ぐ機構を持つマクロである。
出典:「多言語に対応した衛生的マクロ機構導入方式」([DOI](https://doi.org/10.11309/jssst.35.2_33))
<!-- .element: style="font-size: 35%" -->
Note:
なぜならっ
---
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
## Julia のマクロの例
----
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
```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:
これは実行時間を計測するためのマクロの例ですっ
----
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
```julia
julia> @time_ns 1 + 2
elapsed time: 5604 nanoseconds
3
julia> @time_ns time_ns()
elapsed time: 9684 nanoseconds
0x00049b777cb1b4b1
```
Note:
ナノ秒なのでこんな単純な計算でも結果がっ
----
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
```julia
julia> @time_ns t0 += 1000000
# => ???
```
Note:
ではこんなの実行したらどうなるっ?
----
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
```julia
julia> @time_ns t0 += 1000000
ERROR: UndefVarError: t0 not defined
Stacktrace:
[1] top-level scope at REPL[XX]:YY
```
Note:
エラーになりますっ!
----
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
```julia
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
```
<!-- .element: style="font-size: 35%" -->
Note:
なぜならこんなコードに変換されて実行されるからっ!
----
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
+ マクロ中の変数(`t0` `val` `t1`)が変な名前(`#12#t0` `#13#val` `#14#t1`)に変換されている
+ マクロ中の関数に勝手にモジュール名が付加(`time_ns()`→`(Main.time_ns)()`)されている
+ `esc(ex)` と書かれた部分は勝手に変換されていない(`t0 += 1000000`)
⇩
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
+ マクロ中の(ローカル)変数は他とかぶらない名前に変換される!
+ マクロ中の識別子でグローバルに存在するモノはモジュール名が付加されて特定される!
+ `esc(ex)` に渡されたモノだけは勝手に変換されずにそのまま使用される!
<!-- .element: style="font-size: 120%" -->
⇩
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-background-color="rgba(96,173,81,0.3)" -->
+ Julia のマクロは 衛生的!
<!-- .element: style="font-size: 320%" -->
---
<!-- .slide: data-background-color="rgba(170,121,193,0.3)" -->
# まとめ
----
<!-- .slide: data-background-color="rgba(170,121,193,0.3)" -->
+ 手洗い!
+ マスク!
+ Julia のマクロ!
<!-- .element: style="font-size:200%" -->
でコロナ禍を乗り切ろう!
<!-- .element: class="fragment" data-fragment-index="1" style="text-align:right;font-size:120%" -->
Note:
で、衛生的な生活を心がけてコロナ禍を乗り切ろう!っ
---
<!-- .slide: data-background-color="rgba(170,121,193,0.3)" -->
ご清聴ありがとうございます。
Note:
ご清聴ありがとうございますっ!
---
<!-- .slide: data-background-color="rgba(170,121,193,0.3)" -->
# 参考リンク
+ [Metaprogramming](https://docs.julialang.org/en/v1/manual/metaprogramming/) - [Julia Documentation](https://docs.julialang.org/en/v1)
+ [1から始める Juliaプログラミング | コロナ社](https://www.coronasha.co.jp/np/isbn/9784339029055/) pp.82-95
{"metaMigratedAt":"2023-06-15T08:36:29.987Z","metaMigratedFrom":"YAML","title":"<span>Julia による</span> <span>衛生的な生活<!-- .element: style=\"white-space:nowrap\" --></span>","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"theme\":\"league\"}","contributors":"[{\"id\":\"80062a4b-8dad-49ac-95bf-848ce0686e9e\",\"add\":5930,\"del\":23394}]"}