すごい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) - ヽ(´・肉・`)ノログ
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章と比べて疲れが出てしまった感がありますね。(笑)