LoginSignup
17
16

More than 5 years have passed since last update.

ElixirのMetaprogrammingに出ているquote

Last updated at Posted at 2015-06-12

ElixirのMetaprogrammingの中によく出てくるのはquoteunquoteです。最初はなんなのかさっぱり分からなかったです。

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>

つまりコードを書いて、コードを生成するという仕組みです.

17
16
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
17
16