このページは筆者がLisp Flavoured Erlangを試した手順、注意点、感想などを記述する。
このページは、lfe_v0.5.1に対する記述である。
前準備
- Erlang一式を導入しておく事。
- 標準でないpathにインストールした場合は、PATH及びMANPATHを通しておく事。
- 基本的なErlangの知識。
導入&シェル実行
- このページの一番上のリンクから、「lfe_vX.Y.Z.tgz」(の一番新しいもの)をダウンロードする
- tarで伸張する
- cdする
- Makefileはあるが、既にebinにはコンパイル済のバイナリが入っているのでmakeする必要は無し
- 以下のコマンドを実行し、シェルを起動する
erl -pz ebin -noshell -noinput -s lfe_boot start
- doc/lfe_shell.txt を見ながら、S式を入力したりする
(c '"examples/ping_pong.lfe") ; サンプルをコンパイル(「'」に注意!)
(: ping_pong start_link) ; =Erlangでの「ping_pong:start_link().」
(: ping_pong ping) ; ちゃんと動く
- 飽きたら「^G」後、「q」で終了
- 本気で使う気になったら、以下を行う
- emacsディレクトリにlfe-mode.el等が入っているので、emacsを使う人は、これらを適切な場所にコピーする
- ebin内のファイルをそれらしい場所に手でコピーする
- LFEシェルを起動するshスクリプトを書き、pathの通ってる場所に設置
実際にコードを書いてみる
あとで書かなかった
注意点
- 同値比較は「=:=」
- 残念ながら、文字列リテラル("...")は直前にquoteが必要(つまり、ほとんどの状況で「'"..."」と書く事になる)。quoteを忘れると、文字列(=リスト)ではなく、式だと判定されてエラーになる
- Lisp(ここではErlang同様に文字列が文字のリストになっているようなLisp亜種)では、readは「文字列からS式内部形式への変換」であり、一回readした後に内部形式になってしまえば、元の書式がどうであれ、そのオブジェクトは確定する。この確定はreadした際の一回限り発生するので、「"abc"」は一回だけ内部形式に変換されるので、LFEのような問題が置こる事はない。
- しかし、LFEでは「"abc"」を直接S式内部形式のリストに変換しておらず、(厳密にはちょっと違うが、概念的には)一旦「(#\a #\b #\c)」のような扱いにしてから読み込むという、2-pass変換を行っている(具体的には、 src/lfe_scan.xrl の「%% String」のところを参照)。この変換を他のLisp同様、1-passで行うようにすれば、文字列リテラルにquoteはいらなくなる。
- 内部はErlangなので、「(+ 1 2 3)」のような可変長引数は使えない
- Lisp-2なので、CLerではないSchemerはちょっと注意する事
- レコードを定義するのはdefrecord
(defrecord recordname field1 field2 field3 ...)
;; ↑を実行する事によって、以下の名前の手続きが生成される
(make-recordname field1-val field2-val ...) ; つまり、「make-*」
(is-recordname hoge) ; つまり、「is-*」
(match-recordname field1 field2 ...) ; つまり、「match-*」
(recordname-field1 hoge) ; つまり、「*-*」
(set-recordname-field1 hoge val) ; つまり、「set-*-*」
- シェルで「^G」を押した後、「s」「c 2」で、通常のerlのシェルを起動できる。
- 元のLFEシェルに戻る時は「^G」「c 1」。
- これの詳細については「^G」「?」で簡単なヘルプが見れる
TODO
- シェルが履歴を憶えてくれないので、rlwrapをかぶせられないかどうか試す
- マクロをどう実装してるのか調べる
- pptを読むと「Really only compile time at the moment」と書いてあるが……
使ってみた感想
- 同じようなコンセプトのLiskellを試した時は「$等、Haskellの良い部分が結構犠牲になっている」と感じられたが、LFEはなかなか相性が良いようだ(しかし元のErlangの方が使い勝手が良い部分もそこそこある)。
- バイナリデータの書式は元のErlangの方がシンプルで良いと思う。いちいち「(binary ...)」と書くのは冗長。
- 直に「#B(1 2 3)」と書く事は可能。しかしどうも、Erlangの「<<"abc">>」相当は無いっぽい。毎回「(list_to_binary '"abc")」と書くしかない?
- リーダーマクロが使えれば改善できそうだが、どうも今のところリーダーマクロは無いっぽい
- 実は「(binary "abc")」と書けるらしい(それでも元のErlangの書き方の方がよいが)
- 上でも書いたが、文字列をいちいちquoteしないといけないのは微妙に面倒&忘れやすい。
- 構文こそLispになったものの内部はやっぱりErlangなので、「文字列とかへのアクセス添字が1オリジン」「エラーメッセージがわかりにくい」といった、Erlang内部由来の問題の解決にはならない
- これも元々のErlangからの問題だが、オプショナル引数は使えず、キーワード引数も使いづらい(一旦list化もしくはtuple化しないといけない)。
- 「別にCommonLispでいいじゃん」と思ってしまったら負け
- 「仕事でどうしてもErlangを使わざるをえないが、Erlangの構文はプログラマが多少のコスト(注意力)を支払う必要があるので避けたい」という人向け。
- 誰得?Robert Virding得!そして俺得(であってほしい(しかしそうはならないであろう))。
- 最後に、前述の*.pptより引用。
The question
Will LFE end the complaints and moaning about Erlang syntax?
(適当訳: LFEは、Erlangの構文に対する苦情および愚痴を終わらせてくれますか?)
The answer
NO!
外部リンク
最終更新 : 2010/07/06 07:59:42 JST