関数型言語 Elixir (エリクサー) を触ってみた
Erlang VM 上で動作する新しい関数型言語 Elixir (エリクサー) 。
FFファンならずともテンションの上がるネーミングだが
Ruby ライクなシンタックスで、動的型付けのカジュアルFPを目指しているようだ。
とりあえず環境を整えて、Hello world するまでの記録。
インストール
1 Introduction - Elixir に従って作業すればOK。
-
Erlang (R16B 以上) のインストール
パッケージをここからダウンロードして実行
Download Erlang OTP | Erlang Solutions - Elixir のインストール
とりあえず、Mac にインストール。
手っ取り早くインストールするなら HomeBrew で。$ brew install elixir
最新版を入れるなら、以下の手順。
$ cd <インストール先>
$ git clone https://github.com/elixir-lang/elixir.git
$ cd elixir
$ make test
$ bin/elixir -v # Elixir のバージョンが表示されればOK
$ sudo make install
/usr/local/bin 配下にコマンドへのリンクが作成された。
iex - インタラクティブ シェル
モダンな言語なので当然(?)、REPL が標準で付いている。
- 起動
$ iex
Erlang R16B02 (erts-5.10.3) [source-b44b726] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (0.10.4-dev) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
- Hello world
iex(1)> "Hello Elixir!"
"Hello Elixir!"
iex(2)> "こんにちは エリクサー"
"こんにちは エリクサー"
iex(3)> 'こんにちは エリクサー'
[12371, 12435, 12395, 12385, 12399, 12288, 12456, 12522, 12463, 12469, 12540]
ダブルクオートで囲むと UTF-8 でエンコードされたバイナリとして、
シングルクオートだと 1文字ずつの数値のリストとして認識される。 - FizzBuzz
手探り状態で書いてみた。もっと改善できるはず。
f = fn
x when rem(x, 15) == 0 -> "FizzBuzz"
x when rem(x, 3) == 0 -> "Fizz"
x when rem(x, 5) == 0 -> "Buzz"
x -> to_string(x)
end
1..20 |> Enum.map(f) |> Enum.map(&1 <> "\n") |> IO.write
文字列の連結(<>)が分からずに小一時間悩んだ。
output
iex:58: partial application without capture is deprecated
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
警告が出たけど、解決策がすぐには分からない。
まとめ
Erlang も Ruby も慣れていない私にはかなり異次元の文法に見える。
とはいえ、Erlang の強力な機能を利用したプログラムを手軽に実装できるなら魅力的だ。
日本人は最後までエリクサーを使わないという定説もあるけど、やっぱりそれはもったいない。
References
- Elixir
公式サイト - Shinjuku.ex
日本最大? の Elixir 勉強会コミュニティ - Try Elixir
対話式のチュートリアル。すぐ終わるけど雰囲気は掴める。 - elixir cheat sheet
ポイントが 2ページほどにまとまったチートシート - Introducing Elixir - O'Reilly Media
Early Release ながらオライリー本もある。
今ならセール中 Save 50% on Functional Programming Ebooks & Videos - Deals - O'Reilly Media - The Pragmatic Bookshelf | Programming Elixir
こちらは完成された教科書。
Enum.map(&1 <> "\n") を Enum.map(&(&1 <> "\n")) にしたら警告は消えますよ。
返信削除前者は今後使えなくなる書き方です。
http://elixir-lang.org/getting_started/6.html の "6.5 Function capture" を見るといいかもしれません。
コメントありがとうございます!
返信削除