CSGAdventCalendarの21日目です.今回はElixirという言語について書いてみようと思います.
Elixir(エリクサー)とは?
最近,自分のTwitterのTLにElixirという言語の情報がよく流れるようになりまして,曰くwhile文がないとか使いやすいだとか流れてくるので,まあ興味を惹かれましてやってみようかなあと思ってやって見ました.
そんで,ElixirというのはWiki曰く,
Elixir (エリクサー) は並行処理の機能や関数型といった特徴を持つ、Erlangの仮想マシン (BEAM) 上で動作するコンピュータプログラミング言語である。
とのことである.
ほう…Erlangですか…聞いたことないですねえ()
ということでまたまたWikiから引用しますと
Erlang(アーラン)は、コンピュータにおいて汎用的な用途に使うことができる並行処理指向のプログラミング言語および実行環境。
並行処理指向プログラミングですか…Pythonでいうasyncioみたいなもんなのかな? (詳しくはわからないけど)
まあ並行処理が必要なものには重宝されるんだろうなあとは思います.WhatsAppっていうのに使われてるってのが有名らしいです.
Elixir入門やってみた
さて,じゃあ早速Elixirやろっかーと思ってElixir Schoolってところで勉強し始めたんですけど…
難 し く な い … ?
一つ一つの文法はさして難しいわけではないと思うんですが,それらを組み合わせて何かするっていうビジョンがあまり思いつかないんですよね.PythonとかJavaやり始めたときはわりかしパット思い付きでも動くものは書けたんですが,Elixirに関してはあまりかける気がしないんですよね…
まあそんな事はさておき,本当に最初らへんの導入になりますが入門をやっていきましょう.
基本的に先ほど紹介したElixir Schoolに沿ってやって行きます.
では早速導入の仕方からですが,筆者の環境はMacなので,Macの導入の仕方で行きます.
巷ではDockerなどを使ってインストールするらしいですが,自分はDockerが良くわからず結局,Homebrewの方でインストールしました.
$ berw update
$ brew install elixir
これでErlang環境と一緒にElixirがインストールされます.
では早速Elixirには対話型シェルが存在するのでそれを呼び出しましょう.
$ iex
これだけで,対話型シェルが起動します.
Erlang/OTP 21 [erts-10.0.5] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]
Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
こんな感じで起動するかと思います.
起動したらElixir Schoolに書いてあることを実際に入力して行って動くかどうか確認しましょう.
iex自体を終了したい場合は,Ctrl+cを二回実行しましょう.そうすればiexは終了します.
また,何かの入力ミスをしてしまった場合は#iex:break
と入力すれば,入力内容がキャンセルされます.
では,簡単にですが基本的に使うことになるだろうものを紹介していきます.
表示系
まずは,Hello World実行したいですよね,新しい言語やり始めるときには.
で,ElixirでのHello Worldするためにはiexでは
IO.puts "Hello World"
と実行してやればHello Worldが出力されると思います.
もう一つはファイルを作ってやってみましょう.
まず,注意があってElixrはPythonのようにコンパイルしなくても実行できるんですが,コンパイルをして実行することもできるんです.その際にはそれぞれのファイルの拡張子が若干異なっており、コンパイルをせずに実行する場合の拡張子は
hoge.exs
コンパイルをする場合の拡張子は
hoge.ex
となるようです.
今回は.exs
のファイルを作ろうと思います.
では早速ファイルはこんな感じです.
defmodule HelloWorld do
def hello do
IO.puts "Hello World"
end
end
HelloWorld.hello
実行するときは$ elixir Test.exs
で実行します.
ちょっとした解説を入れると
defmodule Hoge do
# javaでいうpublic class Hogeみたいなもの.
# Hogeの部分の最初の頭文字は大文字でないとErrorでます.
def foo do #ここは頭文字が小文字でもいい.
#何らかの処理.
end
end
Hoge.foo #クラス名.関数名で関数を実行させる.
という感じです.
また省略法もあり,関数に関して内部処理が1行ですむ場合などでは
defmodule Fuga do
def hoge, do: IO.puts "Hi"
end
Fuga.hoge
とこのような感じで,1行で示すことも可能です.
制御系
とりあえずif文と,ループについて.
ifはどの言語でも同じような感じで,Elixirもほぼ変わらないです.
# (省略)
if a == 1 do
#何かしらの処理
else
#...
end
という感じです.
さて問題はループでループに関してElixirにはwhile文が用意されてないので,再帰的に呼び出すこととなります.
defmodule Loop do
def loop(0), do: IO.puts "終わり"
def loop(times) do
IO.puts "残り#{times}回"
loop(times - 1)
end
end
Loop.loop(3)
# 出力結果
# 残り3回
# 残り2回
# 残り1回
# 終わり
このような感じですね.なんでwhile文ないのかは分かんないです()
最後に
というわけで,入門のさらっとした部分に触れましたがいかがだったでしょうか?
自分もよくわかっていない部分もあるので,正確に伝えれているかわかりませんが参考になったらありがたいです.
この後自分は,Elixir使ってWebスクレイピングやってみようと思います.それではまたバイバイ