undefined

bokuweb.me

ElixirですごいE本 2章

これまで ElixirですごいE本 1章 - bokuweb.me

すごいErlangゆかいに学ぼう!

すごいErlangゆかいに学ぼう!

2章

2.2 モジュールを作る

Elixirではdefmoduleでモジュールを定義する。 モジュール名となるailiasを第一引数として渡す、すると:moduleモジュール名モジュールのバイナリブロックコンテンツを評価した結果がタプルとして返ってくる。

Kernel – Elixir v1.1.1

iex(13)> defmodule Foo do
...(13)> def bar, do: :baz
...(13)> end
{:module, Foo,
 <<70, 79, 82, 49, 0, 0, 4, 64, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 126, 1
31, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95,
 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>,
 {:bar, 0}}
  • 関数はdefで定義する
  • 非公開のプライベートな関数はdefpで定義する

試してみる

iex(1)> defmodule Foo do
...(1)> def bar do
...(1)> sum(1,2)
...(1)> end
...(1)> defp sum(a,b), do: a+b
...(1)> end
{:module, Foo,
 <<70, 79, 82, 49, 0, 0, 4, 160, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 126,
131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95
, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>,
 {:sum, 2}}
iex(2)> Foo.bar
3
iex(3)> Foo.sum(1, 2)
** (UndefinedFunctionError) undefined function: Foo.sum/2
    Foo.sum(1, 2)
iex(3)>

uselessモジュールを作ってみる

  • useless.ex
defmodule Useless do
  def add(a, b), do: a + b

  def hello do
    IO.puts "Hello, world!"
  end

  def greet_and_add_two(x) do
    hello()
    add(x, 2)
  end
end

2.3 コードをコンパイルする

$ elixirc useless.ex

するとElixir.Useless.beamが生成される。

iex(1)> Useless.hello
Hello, world!
:ok
iex(2)> Useless.add(10,12)
22
iex(3)> Useless.greet_and_add_two(5)
Hello, world!
7

2.4 マクロを宣言する

Erlang でマクロと呼んでいるものは,Elixir のマクロとは違う

詳しくは以下。@ つきの属性(attribute)をErlangのマクロの代わりとしている。

2015/06/18/すごいE本をElixirでやる(8) - ヽ(´・肉・`)ノログ

では、Elixirにおけるマクロとは。 以下が分かりやすかった。

マクロを使うと、"コードを書くコード"が書けます。いわゆるメタプログラミングです。DSL定義などなど、用途は様々。

joe-noh.hatenablog.com

2.5 モジュールについてもっと詳しく

[module: Useless,
 exports: [__info__: 1, greet_and_add_two: 1, add: 2, hello: 0, module_info: 0,
  module_info: 1], attributes: [vsn: [242530420853490857147686343443575002184]],

 compile: [options: [:debug_info], version: '6.0.1',
  time: {2015, 10, 7, 7, 9, 55},
  source: 'path_to_module/useless.ex'],
 md5: <<182, 117, 168, 245, 104, 238, 42, 14, 98, 230, 188, 53, 82, 64, 212, 72>
>]

循環参照

対策等がないか調べたけど出てこなかった。