Elm
ElmDay 10

すごいElm-0.14いまから使おう!

More than 3 years have passed since last update.

ここ数日、Elm触ってみていますが、とても楽しいですね!!

Elmの現バージョンは0.13となっておりますが、まだまだ発展途上でバグを踏むこともしばしば有ります。

私もバグを踏んだので、issue立てるために開発版を使って確認しようとしたところ、コンパイラをどうやってコンパイルするのかすらわからない……!みたいな状況になったりしたので、作業ログと(まだ殆どCHANGELOG書かれてないので)気付いた変更点などについて書かせていただきます。
どのあたりがElm-0.14での確定情報となるのかイマイチわかりませんが、現時点で使うならばこの様な感じです。

コンパイラなどのコンパイル

2014/12/11 03:20 追記
記事から6時間ほどでElm-0.14が正式にリリースされ()、公式サイトからバイナリがダウンロード出来る様になったのでそれを使いましょう!

1週間前と様変りしている感じなので、直ぐに賞味期限が切れる気もしますが、まずはコンパイラなどをコンパイルしましょう。HaskellコンパイラのghcとHaskellパッケージマネージャのcabalに依存しますので入れておきましょう。Haskell platformを用いてインストールするのが簡単です。

install.sh
#!/bin/bash

set -e

ELM=`pwd`/elm # 作業/インストールディレクトリ

mkdir $ELM
cd $ELM

# ソースを取得
git clone https://github.com/elm-lang/elm-compiler.git
git clone https://github.com/elm-lang/elm-make.git
git clone https://github.com/elm-lang/elm-package.git
git clone https://github.com/elm-lang/elm-repl.git

# sandbox作成
cabal sandbox init

# コンパイル/インストール
cabal install ./elm-compiler ./elm-make ./elm-package ./elm-repl

# $ELM/.cabal-sandbox/binにパスを通す

でインストールできます。

Hello World!

開発を始めるときは、取り敢えずelm-makeを叩いてelm-package.jsonを生成し、elm-lang/coreをインストールしましょう。./elm-stuff以下にインストールされるのでデバッグ等でガシガシ書き換えても大丈夫です。

$ elm-make
Some new packages are needed. Here is the upgrade plan.

  Install:
    elm-lang/core 1.0.0

Do you approve of this plan? (y/n) y
Downloading elm-lang/core
Packages configured successfully!
Compiled 32 files

で、適当なファイルにコードを書いて、

hello.elm
import Text(asText)

main = asText "Hello, world!"

コンパイルします。

# デフォルトではjsを吐くようになった
$ elm-make hello.elm
Compiled 1 file
Successfully generated elm.js

# ので、明示的にhtmlを吐かせる
$ elm-make hello.elm --output hello.html
Successfully generated hello.html

$ open hello.html

ソース/出力ファイル(表示)

パッケージを追加する時はelm-packageを使用してあげればelm-package.jsonへの追記もしてくれます。

$ elm-package install evancz/elm-html
To install evancz/elm-html I would like to add the following
dependency to elm-package.json:

    "evancz/elm-html": "1.0.0 <= v < 2.0.0"

May I add that to elm-package.json for you? (y/n) y

Some new packages are needed. Here is the upgrade plan.

  Install:
    evancz/elm-html 1.0.0
    evancz/virtual-dom 1.0.0

Do you approve of this plan? (y/n) y
Downloading evancz/elm-html
Downloading evancz/virtual-dom
Packages configured successfully!

変更点

2014/12/12追記: 正式にリリースされたので、詳しくはElm 0.14をご覧ください。

コマンドの変更

前述のとおり、

  • elmコマンドがelm-makeコマンドにパッケージマネージャの機能を組込む形で変更されます。
  • elm-getコマンドはelm-packageコマンドに変更されます。

キーワードの変更

言語として、一番大きい変更点(もうCHANGELOGにも書いてる)はキーワードの変更でしょう(!!)

keyword-0.13.elm
data A = A1 | A2
type B =
    { b1 :: Int
    , b2 :: String
    }
keyword-0.14.elm
type A = A1 | A2
type alias B =
    { b1 :: Int
    , b2 :: String
    }

ご覧の通り、datatypeに、typetype aliasに変更されます。さらに、型においてのリストリテラルが使えなくなった様です。

list-0.13.elm
data A = A [Int]
list-0.14.elm
data A = A (List Int)

標準ライブラリの独立

コンパイラには標準ライブラリが含まれなくなり、elm-lang/coreが使用されます。

必要なモジュールのみを使用する様になり若干、生成されるjsの容量が削減され、外部のruntimeが不要になりました。

また、プロジェクト毎にインストールされる為、適当に書きかえてデバッグを行なって、デバッグが終わればデフォルトに戻すなどが容易に出来るようになりました。まだまだ不可解な挙動する時もあるのでとても重宝します。

標準ライブラリの変更

標準ライブラリが激しく変更されています。

気付いた所は、

  • Graphics.Input.Inputに相当するものがSignal.Channelに変更
  • Json.Decodeが強化(つかいやすい!
  • Text.toTextText.fromString

くらいです。クソだった部分が改善されているのでとても良いと思います。

さいごに

既に目欲しいパッケージはElm-0.14に対応しておりますし、Elm-0.13が特に安定している訳でもなく、コマンド体系も使いやすくなって、死ぬほどAPI変わるとなると今から始めるのにElm-0.14を使わない手は無いでしょう!!

私が触りはじめた時点では公式ページのAPIドキュメントがElm-0.13のもののみでしたが、いまや0.14のみになっている(!!!)ので、その点でも0.14を使った方が幸せでしょう。

それでは、簡単ではありますが、すごい(API変わるので)Elm-0.14いまから使おう!でした。