未経験文系初学者 Elixirを学ぶ 『プログラミングElixir』-第6章


こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はElixirの教科書[『プログラミングElixir』](https://www.ohmsha.co.jp/book/9784274226373/)第6章を読んで、学んだことをまとめます。[^0]

#### 目次
[第4章へはこちらから](https://qiita.com/Alicesky2127/items/804c41110b0033fb7770)
[第5章へはこちらから](https://qiita.com/Alicesky2127/items/e12309be527d63644331)
## 


## 実行環境
<dl>
  <dd>・Windows 11 Home(バージョン 21H2, OS ビルド 22000.613)</dd>
  <dd>・Ubuntu v18.04 ※WSL2環境下</dd>
  <dd>・Elixir v1.13.0 (compiled with Erlang/OTP 24) ※WSL2環境下</dd>
  <dd>・Phoenix v1.6.7 ※WSL2環境下</dd>
  <dd>・psql (PostgreSQL) 10.19 ※WSL2環境下</dd>
</dl>



以下私が詰まった箇所です。それ以外は本書か
[Elixir公式の学習ページ](https://elixir-lang.org/getting-started/basic-types.html#linked-lists)か、[Elixir School](https://elixirschool.com/ja/lessons/basics/basics)かで、学ぶことができます。


## 6.1　モジュールとコンパイル
特筆すべき箇所なし



## 6.2　関数のボディはブロックだ
1行で書く書き方をワンライナーという。do:から始まりendは不要。コードが長いときは読みづらくなってしまうので使用しない。
2行以上ならばdoから始まりendで終わる。


## 6.3　関数呼び出しとパターンマッチ
Elixirの関数呼び出しは、定義を上から順番にパターンマッチさせていって、マッチしたらその結果を返し、それより下の定義は呼び出さない。


## 6.4　ガード節
いわば関数を実行する前に行うバリデーションチェックみたいなもの。
条件分岐で書くと長ったらしいがガード節ならスマートに書ける。

使える記号に制限があることに注意。&&と||が使えない辺りとか。


## 6.5　デフォルトパラメータ
デフォルトパラメータの設定がない変数から順に引数を渡す。
デフォルトパラメータの有無と引数を渡す処理はいつも通り第一引数から順に行われる。


## 6.6　プライベート関数
```elixir
def fun(a) when is_list(a), do: true #ヘッド部 fun(a) がパブリック
defp fun(a), do: false #ヘッド部 fun(a) がプライベート

#同じヘッドをパブリックとプライベートに書き分けることはできない
```


## 6.7　素晴らしきパイプ演算子 |>
サブタイトル
Functional
|>Coucurrent
|>Pragmatic
|>Fun

関数型プログラミングは |>　並列処理で |> 役に立つ |> 面白い 


## 6.8　モジュール
名前付き関数をカプセル化 = 名前付き関数はモジュールの内側でしか呼び出せない。
これを可能にするのがimportやalias。


#### importとaliasの違い
aliasはモジュールをコピー。as: により呼び出し元のモジュールには別名をつけられる。
呼び出し先では、「モジュール名.関数名」で使用する。


```elixir
defmodule Example1 do
alias My.Other.Module.Parser #aliasのディレクティブ
 def compile_and_go(source) do
  source |> Parser.parse()  #Parserモジュール内のparse関数を呼び出し
 end
end

defmodule Example2 do
alias My.Other.Module.Runner, as :Run #aliasのディレクティブ + as: 別名
 def compile_and_go(source) do
  source |> Run.execute()  #Runnerモジュールを別名Runとして、Runnerモジュール内のexecute関数を呼び出し
 end
end
```


importはモジュール外の名前付き関数を取り込む。

only: や　except: で取り込む/取り込まないを選択し、続く name: arityで関数名とその引数で絞り込んで取り込みができる。
つまり、不必要な関数を取り込まないように設定できる。

呼び出し先では、「関数名」で使用する。

```elixir
defmoduele Example3 do
 def func do
  import List, only: [flatten: 1] #importのディレクティブ、Listモジュール内のflatten/1関数のみを取り込む
  flatten[1,[2, 3], 4]
 end
end
```


## 6.9　モジュールの属性
特筆すべき箇所なし



## 6.10　モジュールの名前：Elixir、Erlang、そしてアトム
大文字から始まる名前を書いたとき、Elixirは内部でそれを、「:Elixir.名前」というアトムに変換している:astonished:

```elixir
iex()> my_io =IO # my_ioとIOモジュールを束縛
IO

iex()> my_io.puts 123 # my_io.puts == IO.puts がtrueなので実行される
123
:ok
```


## 6.11　Erlangのライブラリにおける関数の呼び出し & 6.12　ライブラリを見つける
ElixirはErlangを基礎とした住宅の2階部分のようなもの。よって、ErlangのライブラリはすべてElixirで使用できる。
但し、ElixirとErlang間で文法が違う箇所があるため注意。
Erlangのライブラリを使用するときは、Erlangの文法で書くこと。

Erlang文法の例: 変数は大文字から始まる。アトムは小文字の英単語。モジュール名も小文字の英単語。


<br>









# ～Elixirの国のご案内～
※Elixirって何ぞや？と思ったらこちらもどぞ。未来がぎゅっと詰まった、Elixirは今年で生まれて10周年です:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/7bf8f9f4f5f576e597f5



[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^9]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。


まずは気軽に話しかけてみてください。[^10]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

[^0]:プログラミングが完全未経験ゆえ、「え？！そこからつまずく？！！」というお見苦しい箇所があるかと思いますが、私自身の記録のために残します。ご了承ください。

[^9]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。
[^10]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！