Scala のインストール(Windows)と Emacs モードの設定

Scala はオブジェクト指向と関数型プログラミングのマルチパラダイムの言語であり、 JVM(Java 仮想マシン)上で動作する JVM 言語です。
今回はこの Scala の Windows へのインストールと簡単な使用法、および Emacs の scala 用モードの設定についての記事です。

Scala
最近、 Scala を始め、 Haskell, F#, Erlang, Clojure といった関数型プログラミング言語が注目を集めています。 Java は古いはいいとしても、 関数型でオブジェクト指向が古くなるということないでしょう。 しかし、適材適所で使えばかなり有用そうですし、 新しいパラダイムを覚えることはプログラミング力の向上にもなります。
何か 1 つちゃんと身につけたいなと思うのですが、どれがいいかは悩みます。 そこで、主要なものは試してみようということで、第一弾を Scala にしました。
『7つの言語 7つの世界』 に出ていたという理由もあります。
7つの言語 7つの世界7つの言語 7つの世界
(2011/07/23)
Bruce A. Tate

商品詳細を見る

その試した際のインストール方法などをまとめて記事にしてみました。

Scala とは

関数プログラミング言語の中でも Scala の特徴はマルチパラダイムJVM 言語です。

マルチパラダイム :
C++ はオブジェクト指向言語ですが、 C と同じ手続き型で記述することができます。 このパラダイムのつなぎとなれるというのは大きなメリットでしょう。
Scala は大枠はオブジェクト指向の言語ですが、関数型プログラミングが可能な能力を持っています。

JVM 言語:
Java はソースコード(*.java)をコンパイルして、 バイトコードと呼ばれる中間言語のファイル(*.class)を作成します。それを JVM(java.exe) が実行します。
Scala も同様にコンパイルで、バイトコードを作成し、 JVM 上で動作します。(スクリプトとして動作させることもできます)
JVM 上で動作するので、 Java の豊富なライブラリーを使うことができます。 また、 逆に Scala で作成したクラスを Java から利用することもできます。
lang_scala_descipt.png
Scala の名前の由来は "SCAlable LAnguage" (移植性、拡張性のある言語) であり、 オブジェクト指向、 Java と関数型の連結の高さからきています。
また、 イタリア語で "階段、はしご" を意味しています。 Scala のマークは開発者であるマーティン・オーダスキー教授の職場にある螺旋階段が素になっているらしいです。

インストール

JDK のインストール

バイトコードを生成するのに Java 開発キット(JDK) を利用します。 このため、まず JDK をインストールする必要があります。

簡単にいうと、以下の手順になります。
  1. インストーラーをダウンロード
  2. インストーラーを実行
  3. 環境変数を設定
    環境変数
    JAVA_HOME インストール先のフォルダー(C:\Program Files\Java\jdk1.7.0_21 など)
    PATH (追加) %JAVA_HOME%\bin
JDK のインストール方法についての詳しい説明は以前の記事をご覧下さい。 なお、 JDK のインストール記事では環境変数の設定はオプション的な位置づけで説明しましたが、 scala を使用する場合には、 JAVA_HOME の設定は必須です。
(JAVACMD で java.exe のフルパスを設定でも可)

Scala のインストール

ダウンロードページからインストーラー(scala-X.X.X.msi) または圧縮ファイル(scala-X.X.X.zip) をダウンロードします。 lang_scala_dl.png

ちなみに、 [Scala tool support] の中身は gEdit と Emacs 用のモードです。 Emacs に関しては後述しますが、使用する場合でもここでダウンロードする必要はありません。


以降はインストーラーをダウンロードしたとして説明していきます。
圧縮ファイルの場合はインストール項目を選択できないのと、 手動で bin フォルダーを PATH に追加する必要がある点を除けば、中身は同じです。

まず、ダウンロードしたインストーラーを実行します。

実行し、進めていくと [Custom Setup] の画面になります。
ここで、必要であれば、 [Browse] でインストール先を変更します。
lang_scala_inst_loc.png

また、 インストール項目も選択出来ます。 といっても、 サンプルコードや Scala のソースを選択するぐらいですが。
lang_scala_inst.png

後は、そのまま進めていけば、インストールは完了します。

ただし、 PATH に設定された値は "C:\Program Files\Java\scala\\bin" のように \ 記号が余分に追加されています。(Ver. 2.10.1)
大抵はこのままで問題無いのですが、 eshell のように対応していないものもあるので、修正しておいた方がいいでしょう。

IDE のプラグイン

Java の主要な IDE 用のプラグインが用意されていて、 IDE での開発もできるようになっています。
Emacs 派の私としては IDE は使いませんが、リンクだけ紹介しておきます。
IDE リンク
Eclipse Scala IDE for Eclipse
IntelliJ IDEA JetBrains Plugin Repository :: Scala
NetBeans Scala - NetBeans Wiki

なお、 IDE の中では、今のところ IntelliJ のプラグインが評判がいいみたいです。
また、 scala サイトのダウンロードページにあるのは、 gEdit と Emacs だけですが、 Vim 、 TextMate など様々なエディターのプラグインが作成されています。

使用方法

scala は 3 つの方法で使用することができます。
  1. 対話モード (REPL)
  2. スクリプト
  3. コンパイル
それぞれの使用方法について説明していきます。
なお、詳細は scala -help, scalac -help で確認してください。 (scalac のオプションはすべて scala で使用できます)

対話モード (REPL)

REPL と呼ばれるもので、 1 行づつ結果を確認することができるモードです。 動作確認などで使用します。

scala(.bat)引数なしで実行すると対話モードとなります。
終了する場合は :quit と入力します。
lang_scala_internal.png

Perl や Ruby のように -e オプションで式の文字列を渡して、 実行することも可能です。

スクリプト

scala(.bat)ソース(*.scala) を直接渡すとスクリプトとして動作します。
次節のコンパイルではエントリーポイントを定義する必要がありますが、 スクリプトの場合はファイルを上から順に実行します。

hello.scala :
println("Hello, World!")
println("Hello, Japan!")
println("Hello, Tokyo!")
実行結果 :
~/seven/scala $ scala hello.scala
Hello, World!
Hello, Japan!
Hello, Tokyo!
ただし、 Perl や Ruby の -c のような文法チェックだけのオプションは無いみたいです。 また、文法エラーのファイルを実行するとエラーが出ずに固まることも多いです。
私としてはコンパイルの方がお勧めです。

コンパイル

コンパイルの場合は次の手順になります。
  1. scalac(.bat) でコンパイルして、 class ファイルを作成
  2. scala(.bat)class ファイル(拡張子は除く) を渡す
スクリプトでも触れましたが、 コンパイルの場合はエントリーポイントの関数を作成しておく必要があります。
Java の場合は main という名前のクラスメソッド(static)がエントリーポイントとなります。 Scala も同じですが、 クラスメソッドはシングルトンオブジェクトで作成します。

helloWorld.scala :
object HelloWorld {

  def main(args: Array[String]) {
    println("Hello, World!")
    // コマンド引数を表示
    args.foreach(arg => println(arg))
  }

}
コメントを含め、日本語を使用したい場合は BOM(シグネチャー)なしの UTF-8 で保存する必要があります。

実行結果 :
~/seven/scala/sample $ scalac helloWorld.scala
~/seven/scala/sample $ ls
HelloWorld$$anonfun$main$1.class  HelloWorld$.class  HelloWorld.class  helloWorld.scala
~/seven/scala/sample $ scala HelloWorld foo bar
Hello, World!
foo
bar

実際のアプリでは、ソースファイルがひとつということはなく、 複数ファイルからなるプロジェクトということが多いでしょう。 このプロジェクトのビルドは sbt を使うのが、 Scala では一般的のようです。
ただ、こちらは本格的に使うようになってからということにしたいと思います。

Emacs モードの設定

scala-mode の選択とインストール

[Options] -> [Manage Emacs Packages] メニュー等でパッケージのリストを開きます。 ここで、 scala 用のモードは 2 つ見つかります。
  • scala-mode
  • scala-mode2
最初の scala-mode は scala のサイトにある [Scala tool support] と中身は同じです。
scala-mode2 は作者によると scala-mode に比べて、インデントやハイライトが賢くなっているらしいです。 インデントやハイライトを重視して、 scala-mode2 を使うことにします。
scala-mode の方も括弧の electric モードやスニペットの使用など魅力的な機能はあります。 ただ、部分的な機能であれば、本格的に使うようになった時、後から自分で移植するということもできるかもしれないので、 とりあえず気にしないことにします。

どれを使うか決めたら、後はパッケージを選択して、 install を実行すればいいだけなので、簡単です。

ENSIME のインストール

編集用のメジャーモードとは別に ENSIME(the ENhanced Scala Interaction Mode for Emacs) という拡張用の Lisp もあります。 こちらのインストール方法も紹介します。

こちらはパッケージとして登録されていないようなので、ダウンロードページから取得します。 ダウンロードした圧縮ファイルを任意のフォルダーに展開します。 ここでは、 ~/elisp/ensime 以下に展開したとします。

(インストールフォルダー)/elisp を load-path に追加する設定と scala ファイルを開いた時に一緒に起動する設定を ~/.emacs.d/init.el に記述します。
(add-to-list 'load-path "~/elisp/ensime/elisp")
(autoload 'ensime-scala-mode-hook "ensime"
  "Conveniance hook function that just starts ensime-mode." t)
(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)
ENSIME のサイト等での説明では require で記述されていますが、 起動時に常にロードするのは嫌だったので、 autoload に変えています。
また、 hook に hook をかけているのが、おかしく感じるかもしれません。 名前が紛らわしですが ensime-scala-mode-hook は実際にはホックではなく、 モード呼び出し用の関数です。


ENSIME は主な機能はプロジェクト開発用みたいなので、まだちゃんと使っていません。 使用方法などは他のサイトなどを参考にしてください。
スポンサーサイト
 

Erlang のインストール(Windows)と Emacs モードの設定

今回は関数型言語である Erlang の Windows へのインストールと簡単な使用法、および Emacs の erlang 用モードの設定についての記事です。

Erlang

Erlang とは

Erlang(アーラン)は大手通信機器メーカーであるエリクソン(Ericsson)が開発した関数型プログラミング言語です。 名前は数学者のアグナー・アーランからとられていますが、 ERicsson LANGuage の意味も兼ねているそうです。

Java アプリが JVM の仮想マシン上で動作するように Erlang のプログラムは BEAM といわれる仮想マシン上で動作します。 電話会社の言語だけあって、速度よりも並列性や耐障害性を重視したものになっています。 開発のとっかかりは Prolog を改造して作ったということで、かなり Prolog 風の構文です。
7つの言語 7つの世界7つの言語 7つの世界
(2011/07/23)
Bruce A. Tate

商品詳細を見る

インストール

Erlang のサイトのダウンロードページからインストーラーをダウンロードします。 lang_erlang_dl.png

日本語のミラーサイトもあります。こちらからもダウンロード可能です。

ダウンロードしたインストーラーを起動し、ウィザードに従っていけばインストールは完了します。
インストール後、 bin フォルダー( C:\Program Files\erl5.10.1\bin など) を環境変数 Path に追加してください。

使い方

Erlang は 3 つの方法で使用することができます。
  1. 対話モード(Eshell)
  2. コンパイル
  3. スクリプト

ソースファイル

使用法の前にサンプル用のソースファイルを挙げておきます。

hello.erl :
-module(hello).
-export([start/0]).

start() -> 
        io:format("Hello world!~n").
test.erl :
%% 階乗の計算

-module(test).
-export([fac/1]).
-export([print_fac/1]).
-export([print_fac_from_str/1]).

fac(0) -> 1;
fac(N) -> N * fac(N-1).

print_fac(N) ->
    io:format("~p factorial : ~p~n", [N, fac(N)]).

%% リストの先頭を取り出して、文字列を整数に変換してから計算
print_fac_from_str(Str) ->
    print_fac(list_to_integer(hd(Str))).        
拡張子は erl または hrl を使用します。
hrl はヘッダーファイルにあたるもので、 include するファイルに使われます。 コメントには日本語が使えます。 UTF-8 でも Shift-JIS でも問題ありません。
文字列としては Shift-JIS で保存してあれば、一応使えます。 ただし、次の werl.exe では文字化けします。

対話モード (Eshell)

[スタート] メニューから Erlang(werl.exe) を起動するか、 コマンドライン上で erl コマンドを実行すると Erlang の対話モードである Eshell (Erlang shell) が起動します。
lang_erlang_werl.png

Emacs を使う人間にとっては eshell (Emacs shell) と名前がかぶって、ちょっとわかりづらいです。
ただ、対話モードは eshell 上では動かない言語が多い中、 Erlang の erl は eshell 上でもちゃんと動作します。


この対話シェルは 1 行ずつ実行することもできますし、 Prolog のようにソースファイルを読み込む(コンパイルする)こともできます。
シェル内でのコンパイルには次のコマンドを実行します。この際、パス区切りは / で、 拡張子は取り除いて指定します。
  c("ファイルパス").
終了する場合にはメニューや [X] ボタンで終了するか、 q(). または halt(). と入力します。
そのほかのコマンドは help(). で確認してください。

コンパイル

Java の class ファイルのように、コンパイルして中間ファイルを作成し、実行することができます。 中間ファイルの拡張子は beam です。
手順は次のようになります。
  1. erlc でコンパイルして、 beam ファイルを作成
  2. erl にモジュール名、開始関数名等を渡して起動する。
サンプルの実行 :
~/seven/erlang/sample $ ls 
hello.erl  test.erl
~/seven/erlang/sample $ erlc hello.erl 
~/seven/erlang/sample $ ls 
hello.beam  hello.erl  test.erl
~/seven/erlang/sample $ erl -noshell -run hello -run init stop
Hello world!
~/seven/erlang/sample $ erlc test.erl 
~/seven/erlang/sample $ erl -noshell -run test print_fac_from_str 5 -run init stop
5 factorial : 120
コンパイルした beam ファイルを使用する場合には -run のオプションを使用します。
-run モジュール名 [関数名 [引数 ...] ]
関数名を省略した場合は start がデフォルトで使用されます。

init は Erlang の標準モジュールです。 そのままだとプロセスが終了しないので、 stop 関数を呼び出しています。
また、 -noshell はシェルモードにしないためのオプションです。

erl のその他のオプションについては、ヘルプのオプションが無いので、以下のページを見て下さい。
(man 表示のオプションはありますが、 Windows では使えません) erlc は -help でヘルプを表示することができます。

スクリプト

escript を使うと、コンパイルなしでソースファイルを実行させることができます。
ただし、 スクリプトとして実行するためのファイルは今までのものと少し違いがあります。
  • 先頭行は シェバン行 もしくは 空行
  • エントリーポイントとなる main の関数が必要
    • コマンド引数が main の引数
  • モジュール定義(-module)が不要
シェバン行というのは、 スクリプトを渡すコマンドのパスを書く行です。 Unix では、これでスクリプトファイルを直接実行できるようになります。
Windows では意味がありませんが、詰めて書くとエラーです。 適当に書いておくか、空行にしておいて 2 行目から書き始める必要があります。

以下はスクリプト用のサンプルです。

hello_script.erl
#!/usr/bin/env escript
main(Args) ->
    io:format("Hello world!~n"),
    %% コマンド引数を表示
    lists:foreach(fun(Arg) ->
                          io:format("~p~n", [Arg])
                  end,
                  Args).
実行結果 :
~/seven/erlang $ escript.exe hello_script.erl foo bar
Hello world!
"foo"
"bar"
escript もヘルプが見れないようなので、オプションは以下のページを参考にして下さい。

Emacs モード

続いて Erlang 編集用の Emacs モードのインストールと使用方法です。

インストールと設定

Erlang 用のモード(erlang-mode) はパッケージが用意されているので、 簡単にインストールすることができます。

[Option] -> [Manage Emacs Packages] メニューでパッケージのモードを開き、 erlang のパッケージをインストールします。
これだけで、 *.erl, *.hrl のファイルを開くと、 erlang-mode となります。
Emacs から Erlang の対話シェルを呼び出す場合も、 環境変数の Path さえ設定しておけば、そのまま使えます。

ただし、追加しておいた方がいい設定が 1 つあります。
erlang-mode ではコードのハイライトにレベルがあるのですが、 モードを開いた時にはレベル 0 の OFF 状態になっています。
そこで ~/emacs.d/init.el にレベルを指定する記述を追加します。
;; Erlang
(add-hook 'erlang-mode-hook 'erlang-font-lock-level-4)
レベルは 4 で問題ないと思いますが、変えたい場合は 4 の部分を 1, 2, 3 のどれかにして下さい。

使い方

よく使用しそうなコマンドをいくつか紹介します。
erlang-mode では [Erlang] のメニューがでるので、そのほかの機能はそちらで確認して下さい。

tags 機能
etags コマンドで Erlang 用の TAGS ファイルを作成することができます。
      ~/seven/erlang $ etags *.hrl *.erl 
tags 機能の使い方に関しては前回の記事をご覧下さい。
対話シェルの呼び出しとコンパイル
C-c C-l で対話シェルを Emacs 内で起動させることができます。
C-c C-k では対話シェルを起動させ、編集中のバッファーをコンパイルします。
lang_erlang_emacs.png


 

Elixir : Erlang VM 上で動作する Ruby 風味の関数型言語

Elixir は Erlang VM (BEAM) 上で動作する Ruby 風の関数型言語です。
今回はこの Elixir の特徴を紹介した後、 Windows へのインストールと簡単な使用法、および Emacs の Elixir 用モードの設定について説明したいと思います。

elixir_logo.png

Elixir とは

Elixir の前に Erlang について触れておきます。
Erlang は Java のように仮想マシン(VM)を使った関数型言語です。 Erlang はリアルタイム並列処理などに適しており、 特に耐障害性の高いシステムを求められるときに使います。
Erlang はサーバーサイドの言語として Java とはまた違った魅力があるのですが、 一つ難点があります。
それは Erlang が Prolog 風の構文を採用しており、癖が強く、 かなり書きづらい点です。 では、逆に現時点でもっとも書きやすい言語は何でしょうか ?
そう、 Ruby ですね。

まぁ、これは私の独断と偏見ですが、他にもそう思っている人は多いでしょう。
実際に Reia という Elang VM 上で動作する Ruby 風の言語が登場しました。
しかし、 残念ながら Reia の開発は終了してしまいました。 終了のお知らせとともに、代わりとして強く勧められているのが Elixir です。 ただ、 Reia と比べると Elixir は Erlang よりです。 そこは惜しいところですが、 そのかわりに 関数型言語になっています。
Ruby っぽさのある関数型言語ってすごく魅力的ではないでしょうか。


ちなみに Elixir は "エリクサー" と発音されるようです。
エリクサーは RPG ゲームでは HP, MP をフル回復するアイテムとして出てきます。 全ての病を治す霊薬だったり、飲むと不老不死になったり、 錬金術の賢者の石的な液体だったりと 伝説的な薬 を指すときに使われる言葉みたいです。
若干、大風呂敷を広げちゃった感はありますが、意気込みを買いましょう。

特徴

本家サイトのサンプルを引用しつつ、 Elixir の特徴を説明していきます。

Hello, world!

hello.exs :
defmodule Hello do

  def world do
    IO.puts "Hello World"
  end

end

Hello.world
Hello World
サンプルを見てもらうとわかりますが、 確かに Ruby っぽい構文です。 ただ、オブジェクト指向ではないので、 クラスではなくモジュールとなっています。


コメントを含めて、日本語を使用する場合には BOM なしの UTF-8 を使う必要があります。
日本語を文字列としても使えるようですが、 ターミナルも対応していないと文字化けしてしまいます。

全てが式

"全てが式(関数)" というのは、 Lisp 的な考え方です。
通常、制御文として扱われる if などもマクロを使って定義されたです。
例えば、 if の反対である unless のような制御キーワードが欲しければ、 自分でマクロを定義して増やすことができます。 (実際にはすでに unless はあります)
defmodule MyMacro do
  defmacro unless(clause, options) do
    quote do: if(!unquote(clause), unquote(options))
  end
end

var = false
MyMacro.unless var do
  IO.puts "false"
end

メタプログラミングと DSL

メタプログラミング(リフレクション)とは、プログラム内でプログラム自身を変更できる機能で Ruby などが得意としているところです。
プログラムが自分自身を見れるため、メンバーである関数や値などの取得、実行ができて、 テストやデバッグに便利です。

Elixir のメタプログラミングはさらに一段上を行っています。 制御文も式なので、構文さえいじることができます。
(Lisp はいじれすぎて、方言が大量にできる原因になったりもしてますが)

一方、ドメイン固有言語(Domain-Specific Language 、 DSL) は Makefile といったビルド定義ファイルや Config ファイルのように特定用途の定義に使われる言語です。
構文の改造を駆使して Elixir を DSL として使うことができます。

実際、 Elixir ではメタプログラミングを利用した ExUnit という単体テストのフレームワークがあります。
defmodule MathTest do
  use ExUnit.Case

  test "can add two numbers" do
    assert 1 + 1 == 2
  end
end

プロトコル(文脈, 約束)による多様性

これは Lisp の方言である Clojure に似た機能があります。

オブジェクト指向における多様性は、メソッドを呼び出した際にオブジェクトにあわせて 呼ばれるメソッドが変わることを言います。
Elixir も対象にあわせて呼ばれる関数が変わります。


例えば、 Enum モジュールに map という関数が用意されています。
これは Ruby の Enumerable#map のような機能です。 コレクションの各要素に関数を適用し、 その結果を集めた新しいコレクションを返します。
Enum.map([1,2,3], fn(x) -> x * 2 end) #=> [2,4,6]
この map はファイルのイテレーターに対しても使用することができます。
file  = File.iterator!("README.md")
lines = Enum.map(file, fn(line) -> Regex.replace(%r/"/, line, "'") end)
File.write("README.md", lines)
この辺は C++ にある STL のイテレーターにも似ています。

ドキュメントもコードの一部

コメント上に説明を書いて、 Doxygen のようなツールでドキュメントを作成することが最近では普通になってきました。
Elixir では関数説明などをコメントではなく、直接コードの一部として書けます。 これは Lisp や Python にある機能で、 特に Emacs Lisp では大活躍しています。
defmodule MyModule do
  @moduledoc """
  Documentation for my module. With **formatting**.
  """

  @doc "Hello"
  def world do
    "World"
  end
end
定義したドキュメントは対話モードでのヘルプコマンド h() などで見ることができます。
iex(1)> h MyModule
# MyModule

Documentation for my module. With **formatting**.
:ok
iex(2)> h MyModule.world
* def world()

Hello
ただ、 Elixir にも ExDoc というドキュメント生成ツールがそれはそれとして用意されています。

パターンマッチング

Elang 由来、さらに言えばその元の Prolog 由来の機能です。 Ruby ユーザーにはなじみのない機能ではないかと思います。
ただ、 関数型言語では結構使われているようです。
iex(1)> [a, b] = [1, 2]
[1,2]
iex(2)> a
1
iex(3)> b
2
iex(4)> [head | tail] = [1, 2, 3]
[1,2,3]
iex(5)> head
1
iex(6)> tail
[2,3]
[head | tail] のようなマッチと再帰を組み合わせてよく使用されます。
defmodule Printer do
  # 1 回目は head = "foo", tail = ["bar", "baz"] でマッチ
  def print([head|tail]) do
    IO.puts head
    print(tail) # 再帰呼び出し。 1 回目は print(["bar", "baz"])
  end

  # リストが空になったときにマッチ
  def print([]) do
    # 何もしない。
  end
end

Printer.print ["foo", "bar", "baz"]
foo
bar
baz

結局のところ Erlang

JRuby のような JVM 言語では Java のクラスを使えます。 同じように Elixir では Erlang の関数を自由に呼び出すことができます。
:application.start(:crypto)
:crypto.md5("Using crypto from Erlang OTP")
#=> <<192,223,75,115,...>>
Erlang には、 OTP というフレームワークがついてきます。 これにはリアルタイム並列システムを作るのに役立つライブラリーが詰まっています。
このライブラリーを Elixir からも利用できます。

インストール

ここからはインストールと使い方について説明していきたいと思います。
Elixir について興味をもった場合は、 ぜひ使って試してみて下さい。


先に Erlang をインストールする必要があります。 Erlang のインストールについては以前の記事をご覧下さい。 次にダウンロードページから最新版のパッケージ(vX.X.X.zip)をダウンロードします。 lang_elixir_dl.png

パッケージを展開して、その中の bin フォルダーを環境変数 Path に登録します。

使い方

Erlang と同様に 3 つの方法で使用することができます。
モードごとの実行ファイル(bat ファイル)とソースファイルで使用される拡張子は以下のようになっています。
モード 実行ファイル 拡張子
対話モード iex ---
コンパイル elixirc .ex
スクリプト elixir exs

インストールした中にはこの他に mix という実行ファイルが入っています。 mix は Clojure の leingen 風のビルドツールです。 こちらについては解説しないので、以下のページなどを見てください。

対話モード

コマンドライン上で iex.bat を実行すると対話モードとなります。
~/lang/elixir $ iex
Interactive Elixir (0.9.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 1 + 1
2
iex(2)> IO.puts "Hello"
Hello
:ok
ただ、文字の装飾用の制御コードが入っているので、変な字が出てきます。
eshell 上では多少は対応していますが、 ちゃんと使うには Unix 系のターミナルソフトを使う必要があるんじゃないかと思います。


終了用のコマンドは用意されていないようなので、 最初のメッセージに出ているように Ctrl+C で終了するしかありません。

対話モードでは h() でヘルプが表示されますが、 -h や --help で iex のコマンドラインのヘルプを表示することはできません。(Ver. 0.9.2)
チケットでは対応済みなので、そのうち使えるようになるとは思います。

コンパイル

Java の class ファイルのように、コンパイルして中間ファイルを作成し、使用することができます。 中間ファイルの拡張子は beam です。

次のようなサンプルを用意します。

math.ex :
defmodule Math do
  def sum(a, b) do
    a + b
  end
end
これを elixirc.bat でコンパイルすると Elixir.Math.beam ファイルが作成されます。
iex を実行すると、カレントフォルダーにある beam ファイルが自動的にロードされます。

サンプルの実行 :
~/lang/elixir/sample $ elixirc.bat math.ex
Compiled math.ex
~/lang/elixir/sample $ ls
Elixir.Math.beam  math.ex
~/lang/elixir/sample $ iex
Interactive Elixir (0.9.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Math.sum(1, 2)
3
カレントフォルダー以外の beam ファイルを使いたい場合には -pa オプションで指定します。
~/lang/elixir/sample $ iex -pa ebin
elixirc は引数なしで実行するとヘルプを表示することができます。


実際のアプリケーションでは スクリプトなどの他のファイルから呼び出して使うことになるでしょう。
その場合には require でモジュールを指定してロードします。
require Math

スクリプト

elixir(.bat) の引数にソースファイル(.exs)を渡すとスクリプトモードで実行します。
 ~/lang/elixir $ elixir.bat hello.exs
elixir も引数なしでヘルプ表示です。
perl や ruby のように -e によるワンライナーも使えるようです。

Emacs モードの設定

Elixir 用モードはパッケージが作成されています。 elixir-mode のパッケージを選択してインストールします。

インストールすると *.ex や *.exs のファイルを開いた時に elixir-mode になろうとはします。
しかし、 elixir-mode が未定義というエラーが出るので、 以下の記述を ~/.emacs.d/init.el に追加する必要があります。
;; Elixir
(autoload 'elixir-mode "elixir-mode"
  "Major mode for editing Elixir files." t)
ただ、
出るはずのメニューが出なかったり、
elixir-mode-compile-file のコマンドに失敗したり、
コメントのシンタックスが設定されていなかったり、
インデントの挙動がおかしかったり
...
とバグでボロボロです。

かろうじて M-x elixir-mode-iexで iex の呼び出しはできるようでした。


インデントの挙動がおかしいのは、もう致命的です。 しょうがないので、応急処置として以下の記述でインデントできるようにしています。
あとついでに elang-mode のように C-c C-l で対話モードを起動できるようにしています。
(add-hook 'elixir-mode-hook '(lambda ()
                               (local-set-key "\\t" 'elixir-mode-indent-line)
                               (make-local-variable 'default-tab-width)
                               (setq default-tab-width 2)
                               (local-set-key "\C-c\C-l" 'elixir-mode-iex)))
他にも直すべきところはいろいろあるのですが、 ちゃんと修正するなら ruby-mode を改造して作り直した方がおそらく早いでしょう。


また、 M-x compile でコンパイルした時、 エラー行をうまく認識してくれません。
以下の記述も追加するとエラー行を認識してジャンプ等ができるようになります。
(require 'compile)
(setq compilation-error-regexp-alist
      (append 
       '(;; ** (TokenMissingError) d:/home/lang/elixir/sample/math.ex:5: 
         ("^\\*\\* ([^)]+) \\(.*\\):\\([0-9]+\\): " 1 2)) compilation-error-regexp-alist))

感想

Elixir は "見た目は Ruby 、 中身は Lisp" といった感じの言語でした。
もともと Ruby も Lisp 感漂う言語ですが、それが顕著になっています。

Erlang に比べれば、断然書きやすくなっているうえに、関数型で並列処理の強い点などの良さも残しています。 Erlang を使うならば、 Elixir を使った方がいいと思います。


Elixir は言語仕様的には素晴らしいと感じました。ただ、実際に使うかどうかは目的によりけりです。
Erlang VM (BEAM) には高い信頼性はありますが、速度の面では JVM の方が優れています。 Erlang を開発したエリクソンのような電話会社などには信頼性の方が大事なのかもしれません。
速度は他の要素とトレードオフなのところがあります。 Ruby では"書きやすさ"を優先させて設計されている感があります。

信頼性は高いに越したことはありませんが、 個人的には速度を犠牲にしてまでシビアに要求されるものを作ることは今のところありません。 速度を重視するなら JVM 言語や Native 言語、 開発効率を求めるなら Rails と、 あまり出番がないです。

JVM や .NET 向けの Elixir 実装がでるといいんですけどね。 そしたら多分、飛びつくんじゃないかと思います。

参考

 
このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
50位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
6位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

03月 | 2017年04月 | 05月
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。