週刊Elixirライブラリ2015-19

Elixirのライブラリの解説を週ごとにお届けする記事です。
解説が間違っていた場合には、コメントか@hayabusa333にご連絡くださると嬉しいです。

今回はElixirScriptについて

# ElixirScript is 何?
ElixirScriptは、記載したElixirのコードをJavaScriptのコードへと変換するために作られました。

# 実行環境
OS:OS X Yosemite
Erlang:Eshell V6.5, OTP-Version 18
Elixir:v1.0.4

# ElixirScriptの実行を行うための新規プロジェクトの作成

$ mix new my_elixir_script
$ cd my_elixir_script

# HexにてElixirScriptをインストールするために設定ファイルの記載を行う

$ vim mix.exs

mix.exsの内容は下記となります。

defmodule MyElixirScript.Mixfile do
  use Mix.Project

  def project do
    [app: :my_elixir_script,
     version: "0.0.1",
     elixir: "~> 1.0",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps]
  end

  # Configuration for the OTP application
  #
  # Type `mix help compile.app` for more information
  def application do
    [applications: [:logger]]
  end

  # Dependencies can be Hex packages:
  #
  #   {:mydep, "~> 0.3.0"}
  #
  # Or git/path repositories:
  #
  #   {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"}
  #
  # Type `mix help deps` for more examples and options
  defp deps do
    [{:elixir_script, "~> 0.12"}]
  end
end

# 依存関係の解決を行います。

$ mix deps.get

# ElixirScript を実行してみる

$ mix ex2js "lib/my_elixir_script.ex" -o "js" -r "js"

# ElixirScript にて、実行した内容を確認する

$ cat js/my_elixir_script.js 
    import { Patterns, Kernel, Atom, Enum, Integer, JS, List, Range, Tuple, Agent, Keyword, BitString } from 'js/elixir';
    const __MODULE__ = Kernel.SpecialForms.atom('MyElixirScript');
    export {};

# 実際のコードを記載し、ElixirScript にて変換する

defmodule MyElixirScript do
  def add(x, y) do
    x + y
  end

  defp sum(x, y) do
    x + y
  end

  defp map() do
    Enum.map(1..10, fn(x) -> x * x end)
  end
end

# ElixirScript を再実行してみる

$ mix ex2js "lib/my_elixir_script.ex" -o "js" -r "js"

# ElixirScript にて、再実行した内容を確認する

$ cat js/my_elixir_script.js 
    import { Patterns, Kernel, Atom, Enum, Integer, JS, List, Range, Tuple, Agent, Keyword, BitString } from 'js/elixir';
    const __MODULE__ = Kernel.SpecialForms.atom('MyElixirScript');
    let sum = Patterns.defmatch(Patterns.make_case([Patterns.variable(), Patterns.variable()],function(x,y)    {
        return     x + y;
      }));
    let map = Patterns.defmatch(Patterns.make_case([],function()    {
        return     Enum.map(Range(1,10),Patterns.defmatch(Patterns.make_case([Patterns.variable()],function(x)    {
        return     x * x;
      })));
      }));
    let add = Patterns.defmatch(Patterns.make_case([Patterns.variable(), Patterns.variable()],function(x,y)    {
        return     x + y;
      }));
    export {
        add
  };

# まとめ
今回はElixirにてJavaScriptを生成するElixirScriptを紹介いたしました。
altJSとして、今後どう成長していくのか気になるElixirScriptでした。

それでは皆さま、良いElixirライフを