コミケ告知

サークル networkmaniacs.net(旧:浜風もっこす) 2017.02.17 デブサミ内 DevBooksに出展します。
詳細は circle タグの記事へ。
2014年3月25日火曜日

Elixir - Hello worldを求めて右往左往

先日の歌舞伎座.tech #3で存在を思い出したElixir。早速というほど早速でもないのですが、ちょっと使ってみるかーという気になりました。情報量が少ないのは覚悟していたものの、困ったことにちゃんとしたHello worldが見つからず、それなりに苦労することに。


Hello worldにおいて、「コンソールに文字を表示する文法を覚えましょう」というのは目的の一部でしかありません。元々のC言語で言えば、ソースコードを作成する→コンパイルする→実行する この一連の流れを体験するためのものです。
公式にはGetting Startedがありますが、インストールの次はいきなりインタラクティブシェル(iex)を使った文法説明。いやそうじゃない、まず最終的な出力ファイルの作り方を教えてくれよと。プロダクトでもiexから走らせます、という事であればそれで良いんですが。

試行錯誤したりTwitterで教わったりしつつ、最低限のところまでは進めたので、書き残しておきます。

ソースコード作成

% cat hoge.ex
defmodule Hoge do
  def hello do
    IO.puts "hoge world"
  end
end

Hogeモジュールを定義し、その中にhello関数を作成。中はコンソールへの出力のみ。

コンパイル

% elixirc hoge.ex

ここまでは何の問題も無し。ただし、2回目以降のコンパイルではwarningが出ます。
% elixirc hoge.ex
hoge.ex:1: warning: redefining module Hoge

びっくりするけども、実際のところ問題はない模様。
参考:Warning “Redefining module” when file is containing 2 Modules

実害のないwarningなんて、warningをスルーする習慣がつくだけだから良くないのでは…

実行

% elixir -e Hoge.hello
hoge world

-eで ModuleName.function_name を指定。

コンパイルで出来あがるのはErlang VMのbeamファイルなので、Erlang VMで実行できるはずだ!と試したところ、Elixirのbeamファイル群がある場所を検索パスに含めてあげれば、実行できる模様。

% erl -pa "D:\bin\elixir\lib\elixir\ebin" -noshell -s Elixir.Hoge hello -s init stop
hoge world
 

mixを使う

mix.は、Scalaならsbt、元のErlangならrebar相当となる、依存するライブラリ管理・テスト・実行あたりまでをカバーする、Elixir付属のビルドツールです。前述のようにいちいちelixircを叩いてコンパイルすることはあまりなくて、基本的にこれを使うっぽい。
参考:Introduction to Mix

まずは雛形を作成。

% mix new hoge --bare
* creating README.md
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/hoge.ex
* creating test
* creating test/test_helper.exs
* creating test/hoge_test.exs

Your mix project was created successfully.
You can use mix to compile it, test it, and more:

    cd hoge
    mix compile
    mix test

Run `mix help` for more information.


ソースコードはlib以下に出来ます。今回はhello worldなので、lib/hoge.exにIO.putsを置くだけ。(要は前述のソースコードと同じようにhello関数を作るだけ。ソースコード略)
あとは、mixにコンパイルしてもらいます。

% mix compile
Compiled lib/hoge.ex
Generated hoge.app

そして実行。

% mix run -e Hoge.hello
hoge world

依存するライブラリやアプリケーション設定などは、mix.exsに記述すればいいようです。