Juliaという速くて書きやすい言語をちょっとだけ覗いてみたんだが、なにやらワクワクするものがあったので報告しようと思う


# はじめに

最近うちの会社でも機械学習がホットになってきていて、去年、直属の先輩から「機械学習やりなよ」と言われましたが、「自分にはまだ他にやりたいことがあるので。。。」と逃げていました。

しかし今年の後半になるにつれて、さらに勢いをましている機械学習をみて、「これは今のうちにやらないと置いていかれる」と焦り始めて、ちょっと頑張ってみることにしました。

機械学習には「Python」「R」など長年使われている言語もありましたが、新しもの好きの私は迷うことなく「Julia」でやることに決めました！

「Julia」を少し調べてみると面白い機能があったので、個人的な備忘も兼ねて記事にしたいと思います。

# 参考文献

[Julia公式ページ](http://julialang.org/)
[GitHub](https://github.com/JuliaLang)
[yomichi's blog](http://yomichi.hateblo.jp/entry/2015/12/01/022544)

なかでもyomichiさんの「JuliaBook」はオススメです。
これをみればある程度のJuliaの文法が把握できると思います。

# Juliaとは

![logo_julia.png](https://qiita-image-store.s3.amazonaws.com/0/55672/0c63a4d4-80a6-b2eb-0a1f-ecd5b459295a.png)


一言で言うならば「超速くて、超書きやすい言語」とでも言っておきます。

作成者がJuliaを作った理由（日本語版）は以下にあります。
[なぜ僕らはJuliaを作ったか](http://marui.hatenablog.com/entry/20120221/1329823079)

様々な記事を見ている限り、ここに書いてあることは正しそうだなと思っています。

# Juliaのちょっと面白いなって思ったところ

ここからは完全に個人的な備忘と興味の記事です。
他にもこんな面白いことあるんだぜ！っていうのがあれば教えてください。

## `2*x+1`じゃなくて`2x+1`って書ける！

```jl:数字をくっつけて「×」省略
x = 100
y = 2x+1
println(y)

# 201
```

```jl:さらに発展的な「×」省略
x = 20
y = 30
fx = 2((x-10)*(y-20))^2
print(fx)


# 751168800
```
Juliaが対応している「×」の省略は以下のようです。

|左側|右側|対応|例|
|:--|:--|:-:|:--|
|数字|数字|×|`23`|
|数字|変数|○|`2x`|
|数字|（）|○|`2(x+1)`|
|変数|数字|×|`x3`|
|変数|（）|×|`x(1+2)`|
|変数|変数|×|`xy`|
|（）|数字|×|`(x+1)2`|
|（）|変数|○|`(x+1)x`|
|（）|（）|×|`(x+1)(y+1)`|

紙で式を書いているのと同じような書き方ができるのはいいですね。

## `6/3` は`2`だけど、`3\6`だって`2`だ！

```jl:左側を分母とした割り算
x = 3\6
println(x)

# 2.0
```

これは面白いと思いましたが、使いどころあるのか？

## `1 < x && x < 10`って無駄が多くないですか？

```jl:複数比較
x = 5
A = 1 < x < 10

println(A)

# true
```

## 人間がパッと見、解けない問題だって解ける！だってプログラミング言語だもの

```jl:ネットで話題の問題１
A = 7+7/7+7*7-7
print(A)

# 50.0
```
さすがです。

```jl:ネットで話題の問題２
# 原問 -> 6/2(1+2)
x = 1+2
A = 6/2x
print(A)

# 1.0
```
!!!?
[ネット](http://grapee.jp/7355)では、「9」が正解だ！という人が多数いましたが、「そもそも悪問だ！」と主張する人も多いようで。。
Julia先生が出した答えは1.0でした。

これは、数字と変数がくっついている部分を優先的に計算するというJuliaの仕様によるもの。

わかりにくい部分も多いと思いますので、コードを書く際は以下のように「（）」で計算順序の明示化をしたほうがいいですね。

```jl:ネットで話題の問題２
# 原文 -> 6/2(1+2)
x = 1+2
A = (6/2)x
print(A)

# 9.0
```

## どうせ行列書くなら見やすいほうがいいに決まってる。

```jl:行列の書き方
a = 2
x = [ a 3 4;
      4 5 6;
      5 6 7; ]

y = [ 1 3 4;
      4 4 6;
      5 6 6; ]

println(x-y)

# [1 0 0
#  0 1 0
#  0 0 1]
```

## `"I like %s and %s" %("apple","lemon")`って書かなくていいんだよ！

```jl:変数の埋め込み1
a = "julia"

println("I love $a")

# I love julia
```

```jl:変数の埋め込み2
x = 10
y = 20

println("this is $(x+y)")

# this is 30
```

埋め込みがあると、出力が簡単に書けるのでいいですね。

## もちろん辞書型だってある

```jl:辞書型
x = Dict("example1" => 2, "example2" => 3 , "example3" => 4)

println(x)

# Dict("example3"=>4,"example1"=>2,"example2"=>3)
```

## `if ... else ...`っておいしいの？

```jl:ifelse
x = 1
ifelse(false, x + 1, x + 2)

println(x)

# 3
```
コードが短くなるので個人的には好きです！

## 配列を一括で初期化

```jl:配列初期化
zeroarray = zeros(Integer,4)
println(array)

# Integer[0,0,0,0]

onearray = ones(Integer,4)
println(onearray)

# Integer[1,1,1,1]
```
0や1で配列を初期化する方法。

## このコード何ってなったら`@doc`で。

```jl:関数ドキュメント(hello.jl)
"""
# this is julia example program

# how to use

`add(x,y)`

|x|y|
|:-:|:-:|
|Integer|Integer|

"""
function add(x::Integer, y::Integer)
 print(x+y)
end
```
このように関数の上に文字列を書くことで関数のドキュメントを生成できる。（Markdown対応）

実行方法は、REPLを起動し、Juliaのコードを書いたファイルを`include("hello.jl")`してから、`@doc(add)` を入力。
（画像がイメージ）

<img width="267" alt="julia2.png" src="https://qiita-image-store.s3.amazonaws.com/0/55672/9604cd49-6d64-606c-28b6-48871f6cad1e.png">

ちなみに、変数などにも同様にDocumentをつけることができる。
もちろん標準装備されている関数のドキュメントも参照できる。
これは便利

# 最後に

いっぱい書きたいけど書きすぎると見栄え悪いのでこの辺で。。
Juliaは面白そうなので、今後様々な場面で使われていくのではないでしょうか。
私も来年に向けて必死にキャッチアップしようと思います。