search
LoginSignup
1

More than 3 years have passed since last update.

posted at

【Elixirメモ①】プログラミングの等号(=)について考えてみる

はじめに

去年頃からElixirという言語に興味を持ち、本を買って実際にコーディングをしたのでその内容を振り返りながらまとめてみます。

読んだ本プログラミングElixirの練習問題を参考にElixirの言語の特徴とかを自分なりにまとめてみます。

今回は、その中でもElixirの初歩の初歩、パターンマッチについて考えてみます。

代入という概念は無い

今まで書いてきたプログラミング言語(Java, pythonなど)は書き方は違えど変数に値を代入して、その変数に処理を行ったりすることでプログラミングをしてきました。

例えば、Javaなら

example.java
int i = 10;

こんな感じで、pythonなら

example.py
i = 10

といった感じでしょうか?

一方で、Elixirでも=を使うのですが、代入という意味ではなく、assersion(表明)ということ(らしい)です。実際にコードで書いてみると、下のようになります。

example.exs
i = 10

この例だけを見ると、
「いやいやpythonと一緒やんけwww」
と思ったそこのあなた、私もそう思いました。

ただ、本を読み進めていくうちに、
「パターンマッチつよwww」
とか
「関数の呼び出しに最適すぎる」
とか
「えっ、if文書かなくても条件分岐できるのか!!!」
と狂喜乱舞してました。

何が言いたいかというと、自分が持っていた従来のプログラミングにおける等号(=)の概念をパターンマッチは一変させたということです。

先述した例だけだと、パターンマッチが何なのか、まだ説明しきれてないので、これから少しだけ説明していきます。

i = 10で変数を束縛するということ

さきほどの例では左辺の変数iを整数10束縛していました。
束縛という表現に違和感を覚えるかもしれませんが、自分は「変数i10という整数値に固定した」というふうに考えました。

さてここで

example.exs
10 = i

を考えてみます。どうなると思いますか?

これは10 = iというパターンマッチが行われた結果、エラーは起きずパス(成功)します。Elixirの対話環境で行った結果は以下の通りで

examle.exs
# 変数iを10に束縛
iex(1)> i = 10
10
# パターンマッチを実施
iex(2)> 10 = i
10

成功していることが分かります。
では次に、

example.exs
5 = i

を考えてみます。特に何も起きないかと思いきや、エラーが起きてしまいます。

example.exs
# パターンマッチを実施
iex(3)> 5 = i
** (MatchError) no match of right hand side value: 10

これは、右辺にある変数iが、iex(1)> i = 10で整数10に束縛され、
iex(3)> 5 = iでは5 = 10と評価されているためです。当然510は全く異なるのでエラーが出力されてしまいます。

ただ、ここまで聞いても
「だから何がすごいのだろう?」
と思ったそこのあなた、私もそう(ry

今までは変数は1つでした。
では、複数の変数に対して束縛を行い、複数の値に対してパターンマッチを行いたいと思います。

リストを考えてみる

当然、Elixirにもリストはあります。
具体的には以下のように書きます

example.exs
list = [1, 2, 3, 4]

これは、listという変数に対して[1, 2, 3, 4]という値を束縛した例です。
まずは、先程のiの場合と同じことを対話環境で実行してみます。

example.exs
iex(1)> list = [1,2,3,4]
[1, 2, 3, 4]
iex(2)> [1,2,3,4] = list
[1, 2, 3, 4]
iex(3)> [1,2,3,5] = list
** (MatchError) no match of right hand side value: [1, 2, 3, 4]

何が起きているかわかりますか?
iex(1)ではlist[1,2,3,4]という値に束縛しています。

iex(2)ではリスト[1,2,3,4]listとパターンマッチをし、リストの内容が一致してるので成功しています。

対して、iex(3)では、リスト[1,2,3,5]listに束縛した値は異なるので、パターンマッチした結果エラーが起きています。

また、[1,3,4,5]などの値と変数listでパターンマッチを行っても当然エラーが出力されます。

ここまで、読んでみて
「変数iの場合と何か変わった?」
と思っ(ry

えっ?これだけ?

ここまで見てきて、
パターンマッチってこれだけなの?」
と思うと思います。
もちろん、説明すべき^(ピン演算子)_(アンダースコア)などのパターンマッチにおける重要な記法はありますが、ここで重要なのは今まで説明してきたことが全てだと思います。

具体的にはパターンマッチは、左辺と右辺の値を同じにする方法を探し、同じになる方法が見つかれば成功とし、そうでなければエラーとして処理するということです。

今はまだ、具体例が無いので「えっ?これだけ?」と思うと思いますが。。。

おわりに

さて、ここまで簡単ではありますが、Elixirパターンマッチについて、まとめてみました(とはいえプログラミングElixirの2章の内容を薄くしただけ感が半端ないですが。。。)。

分量もそこそこになってしまったので、一旦ここでこの記事は終わりたいと思います。

最初この記事を書き始めたときは、Elixirで書いたプログラムを基に、中身の説明を行う予定でした。しかし、「 パターンマッチってめっちゃ重要だよな? 」と思い、単発で書いてしまいした。

次回は、今回でてきたパターンマッチを関数に組み込んだときのことについて説明していきたいと思います。
パターンマッチがその威力を発揮するのはこの関数での呼び出しのとき!と現時点の私は思っています。
また、今回は説明できなかった^_の使い方と威力についても説明できたらなと思います。

それでは、最後まで読んでいただきありがとうございました。

参考文献

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1