目的: 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