みずりゅの自由帳

主に参加したイベントやソフトウェア技術/開発について記録しています

ネタ:Elixirへのいざない外伝:束縛してみよう

注:今回は薄い本(技術同人誌)向けのネタ話です。

インプレスR&D社さんから出版した「Elixirへのいざない」*1の献本が届きました。

同人誌の時も思いましたが、製本されてるものを見ると、心が弾むものですね。

特に、表紙の女の子が可愛いです。

それで、表紙の女の子みてて思いつきました。

「この子を使って薄い本(技術同人誌)を書けないかなぁ」と。

キャラ名

表紙の女の子、可愛いですね。(2回目)

まぁ、それは置いといて名前がないと動かしづらいなぁ、と。
というわけで、「名前をつけよう」と思いたつ。

真っ先に思いついた候補が「食官木木見晴」。うん、ダメだ(笑

んで、Elixir(エリクサー)なんだから、「エリィ」でいいかなぁ、と安直に考える。

まぁ、女の子の名前は出来たと。

ただ、相方(or話相手)が欲しいなぁ、と。
できれば人間。

ここで、ElixirはErlang VM上で動くのでErlangの子供のようなもの...つまり、Erlang(アーラン)は親...。
はい、お父さんの名前は「アラン」に決定!

まぁ、「アラン」は女性名にも使えるっぽいので、もしかしたらエリィと同年代の女の子に変わる可能性もあるかも。

せっかく名前をつけてみたので、次はお話を書いてみよう。

第1話:束縛してみよう

Elixir使いの少女エリィは、Erlang使いの父アランと総合格闘プログラミング*2の練習を繰り広げるのであった。

アラン「さぁ、今日も練習を始めよう。エリィ、REPL*3 を開いて」

$erl
Erlang/OTP 22 [erts-10.7.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Eshell V10.7.1  (abort with ^G)


エリィ「はい、お父さん」

$iex
Erlang/OTP 22 [erts-10.7.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Interactive Elixir (1.10.3) - press Ctrl+C to exit (type h() ENTER for help)

アラン「いいかいエリィ。束縛*4とは、こうするんだ」

1> Hoge = 10.
10


エリィ「…こう?」

iex(1)> Hoge = 10
** (MatchError) no match of right hand side value: 10

エリィ「あれ?」

アラン「ははは。最後に『.』(ドット)をつけなかったのは良かったぞ。でも、私の使うErlangでは変数名は大文字から始めないといけないが、エリィの使うElixirでは変数名は小文字から始めないといけないだろう」

エリィ「…あ、そうか。ええと、先頭を小文字にして、えい!」

iex(1)> hoge = 10
10

アラン「良くできたね。でも、束縛に使った変数は使いまわせないから注意しような」

2> Hoge = 20.
** exception error: no match of right hand side value 20


エリィ「...あれ?再束縛ができちゃったよ」

iex(2)> hoge = 20
20


アラン「んなっ!」

エリィ「あ!でもキャレット(『^』)を付けていると、再束縛できないや」*5

ex(3)> ^hoge = 20
20
iex(4)> ^hoge = 30
** (MatchError) no match of right hand side value: 30

iex(4)> hoge = 30
30

アラン「...(この子には私以上の秘めた力があるのか)」*6

元ネタ

補足:束縛とは

ちなみに、「代入」と「束縛」の違いについて。

代入が「変数という箱に対して値をしまう」に対して、束縛は「変数自身が(右辺で指定した)値と同じである」という認識です。*7

下記の例だとわかりやすいでしょうか。
この場合、変数「hoge」は「20」に束縛したので「20」と同じになります。
そして、20とのパターンマッチは成立しますが、30とのパターンマッチは成立しません。

iex> 20
20
iex> hoge = 20
20
iex> hoge
20

iex> 20 = 20
20
iex> 30 = 20
** (MatchError) no match of right hand side value: 20

iex> 20 = hoge
20
iex> 30 = hoge
** (MatchError) no match of right hand side value: 20

まとめ

こんな風にネタが思いついたら書き綴って、薄い本(技術同人誌)にして出したいなぁ。*8

*1:https://nextpublishing.jp/book/11841.html

*2:考えるな。感じろ。

*3:Read-Eval-Print Loop

*4:ErlangやElixirでは、『=』は代入ではなくパターンマッチングに利用するマッチ演算子。変数に対してマッチ演算子を使った場合、マッチ演算子で指定した値と同値の扱いになる。これを束縛という。

*5:厳密には、キャレットは「ピン演算子」と呼ぶ。ピン演算子が変数に付与している場合、新たに束縛は行わず、以前に束縛させた値とマッチしているかを判定する

*6:Erlangが変数に再束縛できないのに対して、Elixirは再束縛ができることをネタにしてみました。

*7:もっと良い言い方があれば教えてください。

*8:今回のネタは「いざない」か? という懸念はありマス。