ElixirのおかげでErlangに注目が集まっています。今までErlangを使ってみたくても、特殊に見える文法に戸惑っていたプログラマに、Ruby風なシンタックスのおかげで敷居が低くなったと思います。一方のLisp Flavored Erlang (LFE)は名前の通りLisp風に書けるErlangです。誰がうれしいのか一瞬よくわかりませんが、Lispには何か避けられない魅力があります。かつてもっと文明的だった時代のエレガントな武器です。
ScalaやClojureとったJVM上で動作する新しい言語も関数型言語の特徴を持つことが多く、不変性や並行性、分散処理を重要視しています。時代とともに純粋なプログラミング言語としてJavaやErlangの魅力は薄れつつありますが、クリティカルなエンタープライズの分野で長年の信頼と実績を持つJVMやErlang VMの性能を享受できるのは魅力的です。
インストール
GitHubのリポジトリにあるUbutntu版のDockerfileを見てもソースからErlangをインストールするのはとても面倒です。セットアップが面倒な環境ではDockerが便利です。
Debian版
Dockerイメージのlfex/lfeはDebianがベースになっています。lfe
コマンドを実行するとREPLが起動します。Erlang/OTP 17、LFE V6.2とちょっとバージョンが古いようです。
$ docker pull lfex/ubuntu |
Ubuntu版
DockerイメージはDebianの他にもリポジトリにはいろいろなOSで作成されたものがあります。Raspbianのあります。UbuntuはErlang/OTP 18、LFE v0.9.1と新しいバージョンなのでこちらで開発環境を作ろうと思います。
$ docker pull lfex/ubuntu |
開発環境
適当なディレクトリを作成します。リポジトリはこちらです。
$ cd ~/lfe_apps |
Dockerfileはlfex/ubuntuをベースイメージにします。WORKDIRを作成するだけです。
FROM lfex/ubuntu |
docker-compose.ymlではローカルにビルドしたイメージを使い、lfe
とlfescript
コマンドを使うサービスを定義します。
lfe: |
ローカルにDockerイメージをビルドしておきます。
$ docker build -t masato/lfe . |
簡単な使い方
REPL
さきほど実行したようにlfe
コマンドを実行するとREPLが起動します。2 The LFE REPLからいくつか写経してみます。
$ docker-compose run --rm lfes |
Hello Worldと簡単なかけ算です。
> (io:format "Hello, World!~n") |
my-list変数に連番をバインドします。listsはErlangの組み込み関数のモジュールです。seq関数で連番を作成します。
> (set my-list (lists:seq 1 6)) |
同じくlistsモジュールのsum関数で変数にバインドした連番の合計した結果の21に、2を乗算します。
> (* 2 (lists:sum my-list)) |
もっと関数型言語っぽくlists:foldl
関数を使い、my-list変数に累計する無名関数を適用して畳み込み(reduce)した結果の21に、2を乗算します。
> (* 2 (lists:foldl (lambda (n acc) (+ n acc)) 0 my-list)) |
Ctrl-Cを2回押すとREPLが終了します。
lfescript
lfescriptはスクリプトとして書いてコンパイルせずに実行することができます。リポジトリにあるsample-lfescriptのサンプルを実行してみます。関数型言語のサンプルによくあるfactorial(階乗)の計算です。スクリプトの実行にはスクリプトの先頭にshebangでlfescriptが必要です。
#! /usr/bin/env lfescript |
6の階乗を計算してみます。lfescript
に続いて実行するスクリプトファイル、引数を入力します。
$ docker-compose run --rm lfescript sample-module.lfe 6 |