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

最近、 Scala を始め、 Haskell, F#, Erlang, Clojure といった関数型プログラミング言語が注目を集めています。 Java は古いはいいとしても、 関数型でオブジェクト指向が古くなるということないでしょう。 しかし、適材適所で使えばかなり有用そうですし、 新しいパラダイムを覚えることはプログラミング力の向上にもなります。
何か 1 つちゃんと身につけたいなと思うのですが、どれがいいかは悩みます。 そこで、主要なものは試してみようということで、第一弾を Scala にしました。
『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 から利用することもできます。

Scala の名前の由来は "SCAlable LAnguage" (移植性、拡張性のある言語) であり、 オブジェクト指向、 Java と関数型の連結の高さからきています。
また、 イタリア語で "階段、はしご" を意味しています。 Scala のマークは開発者であるマーティン・オーダスキー教授の職場にある螺旋階段が素になっているらしいです。
インストール
JDK のインストール
バイトコードを生成するのに Java 開発キット(JDK) を利用します。 このため、まず JDK をインストールする必要があります。簡単にいうと、以下の手順になります。
- インストーラーをダウンロード
- インストーラーを実行
- 環境変数を設定
環境変数 値 JAVA_HOME インストール先のフォルダー(C:\Program Files\Java\jdk1.7.0_21 など) PATH (追加) %JAVA_HOME%\bin
(JAVACMD で java.exe のフルパスを設定でも可)
Scala のインストール
ダウンロードページからインストーラー(scala-X.X.X.msi) または圧縮ファイル(scala-X.X.X.zip) をダウンロードします。
ちなみに、 [Scala tool support] の中身は gEdit と Emacs 用のモードです。 Emacs に関しては後述しますが、使用する場合でもここでダウンロードする必要はありません。
以降はインストーラーをダウンロードしたとして説明していきます。
圧縮ファイルの場合はインストール項目を選択できないのと、 手動で bin フォルダーを PATH に追加する必要がある点を除けば、中身は同じです。
まず、ダウンロードしたインストーラーを実行します。
実行し、進めていくと [Custom Setup] の画面になります。
ここで、必要であれば、 [Browse] でインストール先を変更します。

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

後は、そのまま進めていけば、インストールは完了します。
ただし、 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 つの方法で使用することができます。- 対話モード (REPL)
- スクリプト
- コンパイル
なお、詳細は scala -help, scalac -help で確認してください。 (scalac のオプションはすべて scala で使用できます)
対話モード (REPL)
REPL と呼ばれるもので、 1 行づつ結果を確認することができるモードです。 動作確認などで使用します。scala(.bat) を引数なしで実行すると対話モードとなります。
終了する場合は :quit と入力します。

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 のような文法チェックだけのオプションは無いみたいです。
また、文法エラーのファイルを実行するとエラーが出ずに固まることも多いです。私としてはコンパイルの方がお勧めです。
コンパイル
コンパイルの場合は次の手順になります。- scalac(.bat) でコンパイルして、 class ファイルを作成
- 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-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(アーラン)は大手通信機器メーカーであるエリクソン(Ericsson)が開発した関数型プログラミング言語です。 名前は数学者のアグナー・アーランからとられていますが、 ERicsson LANGuage の意味も兼ねているそうです。Java アプリが JVM の仮想マシン上で動作するように Erlang のプログラムは BEAM といわれる仮想マシン上で動作します。 電話会社の言語だけあって、速度よりも並列性や耐障害性を重視したものになっています。 開発のとっかかりは Prolog を改造して作ったということで、かなり Prolog 風の構文です。
![]() | 7つの言語 7つの世界 (2011/07/23) Bruce A. Tate 商品詳細を見る |
インストール
Erlang のサイトのダウンロードページからインストーラーをダウンロードします。
日本語のミラーサイトもあります。こちらからもダウンロード可能です。
ダウンロードしたインストーラーを起動し、ウィザードに従っていけばインストールは完了します。
インストール後、 bin フォルダー( C:\Program Files\erl5.10.1\bin など) を環境変数 Path に追加してください。
使い方
Erlang は 3 つの方法で使用することができます。- 対話モード(Eshell)
- コンパイル
- スクリプト
ソースファイル
使用法の前にサンプル用のソースファイルを挙げておきます。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) が起動します。
Emacs を使う人間にとっては eshell (Emacs shell) と名前がかぶって、ちょっとわかりづらいです。
ただ、対話モードは eshell 上では動かない言語が多い中、 Erlang の erl は eshell 上でもちゃんと動作します。
この対話シェルは 1 行ずつ実行することもできますし、 Prolog のようにソースファイルを読み込む(コンパイルする)こともできます。
シェル内でのコンパイルには次のコマンドを実行します。この際、パス区切りは / で、 拡張子は取り除いて指定します。
c("ファイルパス").終了する場合にはメニューや [X] ボタンで終了するか、 q(). または halt(). と入力します。
そのほかのコマンドは help(). で確認してください。
コンパイル
Java の class ファイルのように、コンパイルして中間ファイルを作成し、実行することができます。 中間ファイルの拡張子は beam です。手順は次のようになります。
- erlc でコンパイルして、 beam ファイルを作成
- 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)が不要
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 では対話シェルを起動させ、編集中のバッファーをコンパイルします。
Elixir : Erlang VM 上で動作する Ruby 風味の関数型言語
Elixir は Erlang VM (BEAM) 上で動作する Ruby 風の関数型言語です。
今回はこの Elixir の特徴を紹介した後、 Windows へのインストールと簡単な使用法、および Emacs の Elixir 用モードの設定について説明したいと思います。

Elixir とは
Elixir の前に Erlang について触れておきます。Erlang は Java のように仮想マシン(VM)を使った関数型言語です。 Erlang はリアルタイム並列処理などに適しており、 特に耐障害性の高いシステムを求められるときに使います。
- Erlang のインストール(Windows)と Emacs モードの設定 | プログラマーズ雑記帳
- 雑把の仮想マシン(JVM, .NET, BEAM, スクリプト言語, LLVM) | プログラマーズ雑記帳
それは 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)をダウンロードします。

パッケージを展開して、その中の 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 実装がでるといいんですけどね。 そしたら多分、飛びつくんじゃないかと思います。