|> Weeeeeeb

どんどんドーナツどーんと行こう!(10万円山さん)

すごいErlangゆかいに学ぼうをelixirで書きなおしてみた(第二章)

目次(2章)

  • モジュールとは
  • モジュールを作る
  • コードをコンパイルする
  • マクロを宣言する

モジュールとは

erlangは1章のhead/tail/length等の関数がBIFで最初からインポートされている
-> elixirでは、Kernelがインポートされている。

モジュールを作る

elixirではモジュール内に属性と関数を定義することが出来る。
まずはモジュールを作成する

$ vim useless.ex
$ elixirc useless.ex
-> Elixir.Useless.beam
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

コードをコンパイルする

iexからc関数を呼び出し、コンパイルを実行

iex(1)> pwd
/vagrant_data/elixir/proj/test
:ok
iex(2)> c("useless.ex")
useless.ex:1: warning: redefining module Useless
[Useless]
iex(3)> Useless.add(7,10)
17
iex(4)> Useless.hello
hello, world
:ok
iex(5)> Useless.greet_and_add_two(0)
hello, world
2

マクロを宣言する

Erlangで読んでいるマクロとelixirで呼ぶマクロは
実質的には異なるものであるらしい。
@を属性として、マクロ代わりとする。

下記サイトから、?MODULE、?FILE、?LINEへの参照するコードを掲載してくれている。

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

joe-noh.hatenablog.com

defmodule Foo do
  @hour 3600

 def hour_in_sec do
    @hour
  end

  # ?MODULE is access via __MODULE__
  def module, do: __MODULE__

  # ?FILE is access via __ENV__
  def file, do: __ENV__.file

  # ?LINE is access via __ENV__
  def line, do: __ENV__.line
end


Foo.hour_in_sec # -> 3600
Foo.module # -> Foo
Foo.file # -> iex
Foo.line # -> 16
Foo.module_info
Foo.module_info(:attributes)

やってみて

記事書いてて、1章と比べて疲れが出てしまった感がありますね。(笑)