簡単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の束縛された値が評価されて、そのまま自身の値が返ってきました。