LoginSignup
14
0

More than 1 year has passed since last update.

簡単Elixirシリーズ ~ unquoteを理解しよう ~

Posted at

簡単Elixirシリーズ

~ unquoteを理解しよう ~

この記事は「Elixir Advent Calendar 2022」5日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

今回は、unquoteって何? を理解する。という小ネタ(そう、この記事はサクッとがコンセプトW)

以前、quoteについて書いたのですが、

quoteを理解したなら、unquoteも!って事で公式見たら終わりですが、僕なりの表現で書いておこうと思います。

unquoteとは、

  • quoteで評価した値を修正することができる
  • quoteで評価された内部表現のASTに後付けでコードを注入することができる。

unquoteとは、上記2つの特徴を持つマクロです。

サンプルコードで実際の動作も見てみましょう。

例えば、次のような場合、結果の合計 24 ではなく、 11 + 13 を文字列にしたいとします。

num = 13
13
iex()> Macro.to_string(11 + num)                   
"24"

そこで、quoteを使って、評価した値を文字列にしようと試みます。

iex()> Macro.to_string(quote do: 11 + num)
"11 + num"

しかし、numに束縛した変数の値13ではなく、numがそのまま文字列に表現されています。

そこで、unquoteを使って、quoteの中を修正します。

Macro.to_string(quote do: 11 + unquote(num))
"11 + 13"

すると、意図した結果が表示されるようになりました。

もう1つ例を見てみたいと思います。
numに13を束縛して、quoteで評価してみます。すると以下のようになります。

iex()> num = 13
13
iex()> quote do: num              
{:num, [if_undefined: :apply], Elixir}

今度は、unquoteを利用して再実行してみます。

iex()> quote do: unquote(num)     
13

すると、num ではなく、numの束縛された値が評価されて、そのまま自身の値が返ってきました。

14
0
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
14
0