目的: 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と言う関数があるだけです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-module(test). | |
-export([add/2]). | |
add(X,Y) -> X + Y. |
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のソースコードと内容は同じです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule Test do | |
def add(x, y) do | |
x + y | |
end | |
end |
これを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関数を呼んでいます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule Test do | |
def add(x, y) do | |
:test.add(x, y) | |
end | |
def str_size(str) do | |
:erlang.size(str) | |
end | |
end |
実行結果:
----
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