ElixirのMetaprogrammingの中によく出てくるのはquote
とunquote
です。最初はなんなのかさっぱり分からなかったです。
iex(1)> quote do: 1+2
{:+, [context: Elixir, import: Kernel], [1, 2]}
iex(2)> quote do: div(10, 3)
{:div, [context: Elixir, import: Kernel], [10, 3]}
iex(3)> quote do: IO.puts "hello world"
{{:., [], [{:__aliases__, [alias: false], [:IO]}, :puts]}, [], ["hello world"]}
返してきたtupleは実はAST(Abstract syntax tree)のことです。
Elixirだけではなく、大半のプログラミング言語はASTと関わりがあります。ソースコードはコンパイルされるときにまずある木構造に変更されてから、その後bytecodeなりmachine codeなりに変更されます。
一般的にプログラマはこの木構造を気にすることはまずないです.
ElixirのMetaprogramming実はこのAST木構造をいじることができる。
上の例でだと {:+, [context: Elixir, import: Kernel], [1, 2]}
は1 + 2
のElixir内部の木構造です。
このtupleは三つの部分があります。
:+
[context: Elixir, import: Kernel]
[1, 2]
ElixirではASTはこの三つの部分に構成されています。ネストされてる構造でもこんな三つの部分です。
特殊の場合もあります。
iex(3)> quote do: :atom
:atom
iex(4)> quote do: 1
1
iex(5)> quote do: "str"
"str"
(続き)
Metaprogramming Elixir本の中にMetaprogrammingを使って何かできる一つの例です。
div do
h1 class: "title" do
text "Hello"
end
p do
text "Metaprogramming Elixir"
end
end
上のコードを書いたら、下のようなコードが生成されることができる。
"<div><h1 class="title">Hello</h1>
<p>Metaprogramming Elixir</p></div>
つまりコードを書いて、コードを生成するという仕組みです.