Julia 条件評価(if , iflese , 三項演算子 , 短絡評価) 

# Julia 条件評価(if , iflese , 三項演算子 , 短絡評価) 

Juliaには複数の条件分岐がある。

- if,ifelse,三項演算子,短絡評価等がある　　
-  ifelse と　それ以外の２種類のlowコードとなった。
-  LLVM中間コードでみるとすべてほぼ同じ。（※最適化されたからもあると思う）
-  読みやすさと分岐の多さで使い分けるといいかも（という当然の結果でした。）
-  （なお、ifelseは速くなるという情報もあり。ただし真偽未確認）

## if
if <条件>  then <真のとき> else <偽のとき> end
```julia
# 偶数ならばTrueを返す（奇数はFalse）判定する関数を考えてみる

function fn_isEven_if_bool(x_num)
    if x_num % 2 ==0
        return true
    else
        return false
    end
end
        
println(fn_isEven_if_bool(200)) #true
println(fn_isEven_if_bool(201)) #false
```
内部処理を確認
```julia
@code_lowered　fn_isEven_if_bool(201)　#lowコードに変換
#=
CodeInfo(
1 ─ %1 = x_num % 2
│   %2 = %1 == 0
└──      goto #3 if not %2
2 ─      return true
3 ─      return false
)
=#

```
## ifelse
ifelse(<条件> ,<真のとき> ,<偽のとき>)
```julia
function fn_isEven_ifelse_bool(x_num)
    ifelse(x_num % 2 ==0,true,false)
end
println(fn_isEven_ifelse_bool(200))
println(fn_isEven_ifelse_bool(201))
```

```julia
function fn_isEven_ifelse_bool(x_num)
    ifelse(x_num % 2 ==0,true,false)
end
println(fn_isEven_ifelse_bool(200))
println(fn_isEven_ifelse_bool(201))

#=
@code_lowered　fn_isEven_ifelse_bool(201)
CodeInfo(
1 ─ %1 = x_num % 2
│   %2 = %1 == 0
│   %3 = Main.ifelse(%2, true, false)
└──      return %3
)
=#
```

## 三項演算子
if <条件> <文> end, の代わりに<条件> ? <真のとき> :<偽のとき> と書く。
```julia
function fn_isEven_ternaryOperator_bool(x_num)
    (x_num % 2 == 0) ? true : false
end

println(fn_isEven_ternaryOperator_bool(200))
println(fn_isEven_ternaryOperator_bool(201))

@code_lowered　fn_isEven_ternaryOperator_bool(201)
#=
CodeInfo(
1 ─ %1 = x_num % 2
│   %2 = %1 == 0
└──      goto #3 if not %2
2 ─      return true
3 ─      return false
)
=#
```

## 短絡評価
if <条件> <文> end, の代わりに<条件> && <文>と書く。
（短絡評価は　 if <条件１> && <条件２>　 then <真のとき>...end
として使う方法であるが　条件１が真であれば条件２を評価する。この条件２の評価は実行でもよいのでこれを利用する。）

```julia
function fn_isEven_shortCircuitEvaluation_bool(x_num)
    x_num % 2 == 0 && return true
    return false
end
    
println(fn_isEven_shortCircuitEvaluation_bool(200))
println(fn_isEven_shortCircuitEvaluation_bool(201))

@code_lowered fn_isEven_shortCircuitEvaluation_bool(201)
#=
CodeInfo(
1 ─ %1 = x_num % 2
│   %2 = %1 == 0
└──      goto #3 if not %2
2 ─      return true
3 ─      return false
)
=#
```

## 速度比較
lowコードに翻訳されると２種類だった（ if=三項演算子=短絡評価 , ifelse） そこでこの２種類の速度を比較する
この程度ですと誤差っぽいですがifelseが早いという話もあります。

```julia
@time for i in 1000000000000000000
    fn_isEven_shortCircuitEvaluation_bool(201)
end
    
@time for i in 1000000000000000000
     fn_isEven_ifelse_bool(201)
end

0.000001 seconds
0.000000 seconds

```

## 追記　LLVM中間コードの確認。
- 結論　同じやん。コンパイルの最適化がすごいと言うべきなのかも。

```julia
@code_llvm　fn_isEven_if_bool(201)　#llvmコードに変換
#=
;  @ In[11]:3 within `fn_isEven_if_bool`
define i8 @julia_fn_isEven_if_bool_1259(i64 signext %0) #0 {
top:
;  @ In[11]:4 within `fn_isEven_if_bool`
  %1 = trunc i64 %0 to i8
  %2 = and i8 %1, 1
  %3 = xor i8 %2, 1
;  @ In[11]:5 within `fn_isEven_if_bool`
  ret i8 %3
}
=#

@code_llvm fn_isEven_ifelse_bool(201)
#=
;  @ In[3]:1 within `fn_isEven_ifelse_bool`
define i8 @julia_fn_isEven_ifelse_bool_1284(i64 signext %0) #0 {
top:
;  @ In[3]:2 within `fn_isEven_ifelse_bool`
  %1 = trunc i64 %0 to i8
  %2 = and i8 %1, 1
  %3 = xor i8 %2, 1
  ret i8 %3
}
=#

@code_llvm fn_isEven_ternaryOperator_bool(201)
#=
;  @ In[5]:1 within `fn_isEven_ternaryOperator_bool`
define i8 @julia_fn_isEven_ternaryOperator_bool_1286(i64 signext %0) #0 {
top:
;  @ In[5]:2 within `fn_isEven_ternaryOperator_bool`
  %1 = trunc i64 %0 to i8
  %2 = and i8 %1, 1
  %3 = xor i8 %2, 1
  ret i8 %3
}
=#

@code_llvm fn_isEven_shortCircuitEvaluation_bool(201)
#=
  @ In[7]:1 within `fn_isEven_shortCircuitEvaluation_bool`
define i8 @julia_fn_isEven_shortCircuitEvaluation_bool_1288(i64 signext %0) #0 {
top:
;  @ In[7]:2 within `fn_isEven_shortCircuitEvaluation_bool`
  %1 = trunc i64 %0 to i8
  %2 = and i8 %1, 1
  %3 = xor i8 %2, 1
  ret i8 %3
}
=#
```
## 参考図書

[１から始めるプログラミング](https://amzn.to/3HHR7Yv)
<a href="https://www.amazon.co.jp/1%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B-Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%80%B2%E8%97%A4-%E8%A3%95%E4%B9%8B/dp/433902905X?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-1&linkCode=li3&tag=buzz06-22&linkId=8f7deba521f52f812d35ecdbe756cc10&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=433902905X&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=433902905X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[Juliaプログラミングクックブック](https://amzn.to/3PFfb0a)
<a href="https://www.amazon.co.jp/Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF-%E2%80%95%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%80%81%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%80%81%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E3%81%BE%E3%81%A7-Bogumi%C5%82-Kami%C5%84ski/dp/4873118891?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-2&linkCode=li3&tag=buzz06-22&linkId=4e34b4b620932164412ec18acff914a8&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873118891&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=4873118891" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[天才プログラマー タンメイが教える Julia超入門](https://amzn.to/3FJRpeW)
<a href="https://www.amazon.co.jp/%E5%A4%A9%E6%89%8D%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E3%82%BF%E3%83%B3%E3%83%A1%E3%82%A4%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Julia%E8%B6%85%E5%85%A5%E9%96%80-Tanmay-Bakshi/dp/4807920219?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-10&linkCode=li3&tag=buzz06-22&linkId=bf79aa67b5c5956c8fd26f9436401dc6&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4807920219&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=4807920219" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />