スポンサーリンク

2015年6月8日

ElixirからErlangの関数を呼び出すだけの簡単なお仕事!!

タイトル: ElixirからErlangの関数を呼び出すだけの簡単なお仕事!!

目的: Elixirのiexから自作したErlangのモジュールで定義している関数を呼び出す。

実施環境:
OS: Windows8.1
Elixir: v1.0.4
Erlang: Eshell v6.4

目次:
1. 概要
2. Erlangのソースコード
3. iexで関数を呼び出すだけの簡単なお仕事
4. おまけ
5. おまけのおまけ

1. 概要
ふと思いました。
ElixirからErlangモジュールで定義した関数を呼び出せないか・・・っと。

同じErlangVMで動いているのですから動かないということはないでしょう。
なので試してみました。

実際、記事にするほどのことではないのかもしれませんが・・・

2. Erlangのソースコード

Erlangのソースコードは以下の通り作成しました。
"test"と言うモジュールにaddと言う関数があるだけです。



3. iexで関数を呼び出すだけの簡単なお仕事

コマンドプロンプトからiexを立ち上げ、以下の通り実施しました。

```iex
>iex
Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c("test.erl")
[:test]
iex(2)> :test.add(1, 2)
3
iex(3)>
```

cのヘルパーメソッドを利用してコンパイルしています。
Erlangのファイルが置いてある場所を見れば、"test.beam"ができています。

4. おまけ

逆に、Erlangから自作したElixirモジュールの関数を呼んでみます。

Elixirのソースコードは以下の通り作成しました。
先ほどのErlangのソースコードと内容は同じです。



これをerlから呼んでみます。
まずは、iexからコンパイルします。

```iex
>iex
Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c("Test.ex")
[Test]
iex(2)> Test.add(1, 2)
3
iex(3)>
```

cヘルパーメソッドがまた出てきました。
実行すると"Elixir.Test.beam"ができています。

```erl
>erl
Eshell V6.4  (abort with ^G)
1> l('Elixir.Test').
{module,'Elixir.Test'}
2> 'Elixir.Test':add(1, 2).
3
3>
```

5. おまけのおまけ

Elixirソースコードからの呼び出しは存外に簡単でした。
Erlangソースコードの変更はありません。

以下のようにElixir側のソースコードを変更しました。
add関数の中で、Erlangで定義されているadd関数を呼んでいます。
str_size関数の中では、Erlangのsize関数を呼んでいます。



実行結果:
----
iex(1)> Test.size("aaa")
3
iex(2)> Test.size("test")
4
iex(3)> Test.add(1, 1)
2
----

修正!!(2015/06/07-16:52)
@behaviourですが、私が間違って理解している可能性があります。
記事に掲載しているソースコードですが、@behaviourがなくても動作します。(確認済み)
なので、ソースコードに関してはなしの状態で修正しました。
公式ドキュメントを確認してきました。
@behaviourは、公式ドキュメントでは以下の通り書いてあります。

引用
>@behaviour - (notice the British spelling) used for specifying an OTP or user-defined behaviour.

簡単に翻訳すると、
"(括弧内は省略)ユーザー定義の振舞いか,OTPが定義した振舞いか区別する"
っといったことが書かれています。
以下のような時に利用されると思われます。

----
@behaviour Test.Hoge
@behaviour Test.Hoge.Huge
@behaviour Test.Hoge.Foo
----

これで終わり・・・以上!!

独り言~
今回のおかげでヘルパーメソッドの存在を認識しました。
(ヘルパーメソッドを見たければ、iexでhと入力しEnterすれば出てきます)

それにしても・・・こんな簡単にできるんですね!
次は、Elixir+Cowboyあたりで検証してみましょうか。
(需要あるのでしょうか・・・)

参考文献
http://blakewilliams.me/blog/playing-with-elixir-and-erlang
Elixir - Module attributes

人気の投稿