LoginSignup
2
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-07

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

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

実施環境:

OS: Windows8.1
Elixir: v1.0.4
Erlang: Eshell v6.4

目次:

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

1. 概要

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

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

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

2. Erlangのソースコード

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

test.erl
-module(test).
-export([add/2]).

add(X,Y) -> X + Y.

3. 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のソースコードと内容は同じです。

test.ex
defmodule Test do
  def add(x, y) do
    x + y
  end
end

これをerlから呼んでみます。
まずは、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
Eshell V6.4  (abort with ^G)
1> l('Elixir.Test').
{module,'Elixir.Test'}
2> 'Elixir.Test':add(1, 2).
3
3>

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

まとめ

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

それにしても・・・こんな簡単にできるんですね!

次は、ソースコード上から呼び出してみたいですね。
Elixir+Cowboyあたりで検証してみましょうか。
(需要あるのでしょうか・・・)

追記(2015/06/07-23:48)

Elixirソースコードからの呼び出しが存外に簡単だったので書いておきます。
Erlangのソースコードに変更はありません。

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

test.ex
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

参考文献

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2