10.05.2013

Getting Started with Elixir - New Functional Programming Language

関数型言語 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

2 コメント:

  1. Enum.map(&1 <> "\n") を Enum.map(&(&1 <> "\n")) にしたら警告は消えますよ。
    前者は今後使えなくなる書き方です。
    http://elixir-lang.org/getting_started/6.html の "6.5 Function capture" を見るといいかもしれません。

    返信削除
  2. コメントありがとうございます!

    返信削除