์๋ก
Elixir, Erlang VM ์์์ ์ด์๋๋ ๊ฐ๋ ฅํ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด,๋ ๋ฉํ ํ๋ก๊ทธ๋๋ฐ์ ์์ด ์ค์ํ ์ญํ ์ ํ๋ quote์ unquote๋ผ๋ ๋ ๊ฐ๋ ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ฒ์๋ฌผ์์๋ ์ด ๋ ๊ฐ๋ ์ ํ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Quote์ ํ์์ฑ๊ณผ ์๋ ์๋ฆฌ
1. ํ์์ฑ:
์ฝ๋ ์กฐ์: Elixir์์ ์ฝ๋๋ฅผ ๋ฐ์ดํฐ๋ก ๋ณํํ๊ณ ์ด๋ฅผ ์กฐ์ํ ํ์๊ฐ ์์ ๋ quote๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด๊ฒ์ ๋งคํฌ๋ก, ์ฝ๋ ์์ฑ, ๊ทธ๋ฆฌ๊ณ ๋์ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ํ์์ ์
๋๋ค.
์ถ์ํ ์ธต ์์ฑ: quote๋ ์ฝ๋์ ์๋ฏธ๋ฅผ ๋ณด์กดํ๋ฉด์ ๊ทธ๊ฒ์ ์ถ์ํ ์ธต์ผ๋ก ๋ํํฉ๋๋ค. ์ด๊ฒ์ ๋ณต์กํ ์ฝ๋ ๋ณํ์ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋๋ค.
2. ์๋ ์๋ฆฌ:
quote๋ฅผ ์ฌ์ฉํ๋ฉด, ์ฃผ์ด์ง ์ฝ๋ ๋ธ๋ก์ด Elixir์ ๋ด๋ถ ๋ฐ์ดํฐ ๊ตฌ์กฐ, ์ฆ AST๋ก ๋ณํ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, quote do: 1 + 2
๋
์ค์ ๋ก {:+, \[context: Elixir, import: Kernel\], \[1, 2\]}
๋ผ๋ ํํ๋ก ๋ณํ๋ฉ๋๋ค.
Unquote์ ํ์์ฑ๊ณผ ์๋ ์๋ฆฌ
1. ํ์์ฑ:
๋์ ๊ฐ ์ฃผ์
: quote ๋ธ๋ก ์์์ ์ค์ ๊ฐ์ ์ฃผ์
ํ๊ณ ์ถ์ ๋ unquote๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ๋งคํฌ๋ก๊ฐ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ ์ฐํ๊ฒ ๋์ํ๋๋ก ๋ง๋ญ๋๋ค.
์กฐ๊ฑด๋ถ ์ฝ๋ ์์ฑ: ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ๋ค๋ฅด๊ฒ ์์ฑํ๊ณ ์ถ์ ๋, unquote๋ฅผ ํตํด ์ด๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
2. ์๋ ์๋ฆฌ:
quote ๋ธ๋ก ์์์ unquote๋ฅผ ์ฌ์ฉํ๋ฉด, unquote์ ์ ๋ฌ๋ ํํ์์ด ํ๊ฐ๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ AST์ ์ง์ ์ฝ์ ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, quote do: unquote(1 + 2)
๋{3, \[context: Elixir, import: Kernel\], \[\]}
์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ต๋๋ค.
์ค์ ์์: ๋งคํฌ๋ก์ ํ์ฉ
Elixir์์ ๋งคํฌ๋ก๋ ์ปดํ์ผ ์๊ฐ์ ์ฝ๋๋ฅผ ๋ณํํ๊ฑฐ๋ ์ฃผ์ ํ๋ ๋ฐ quote์ unquote๋ฅผ ํ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ ๊ฐ์ ๋ํ๋ ๊ฐ๋จํ ๋งคํฌ๋ก๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค:
defmodule MathMacro do
defmacro add(a, b) do
quote do
unquote(a) + unquote(b)
end
end
end
import MathMacro
IO.puts add(5, 3)
์ด ๋งคํฌ๋ก๋ ์คํ ์ 5 + 3์ ๊ณ์ฐํ๊ณ , ๊ฒฐ๊ณผ์ธ 8์ ์ถ๋ ฅํฉ๋๋ค.
์ฌ๊ธฐ์ quote๋ + ์ฐ์ฐ์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ณ , unquote๋ ์ค์ ๊ฐ 5์ 3์ ์ด ๊ตฌ์กฐ์ ์ฃผ์ ํฉ๋๋ค.
๊ฒฐ๋ก
Quote์ Unquote์ ์ค์์ฑ
quote์ unquote๋ Elixir ํ๋ก๊ทธ๋๋ฐ์์ ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๊ณ ๋ณํํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์
๋๋ค. ์ด๋ค์ ํตํด ๊ฐ๋ฐ์๋ ๊ฐ๋ ฅํ ์ถ์ํ์ ์ฝ๋ ์กฐ์ ๊ธฐ๋ฅ์ ์ป์ ์ ์์ผ๋ฉฐ, ์ด๋ ๋งคํฌ๋ก์ ๊ฐ์ ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ ํจํด์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ Elixir๋ฅผ ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ์ธ์ด๋ก ๋ง๋ค์ด์ฃผ๋ฉฐ, ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค.
์ฐธ๊ณ ๋ฌธ์ : https://hexdocs.pm/elixir/1.16/quote-and-unquote.html
'๐ป ๊ฐ๋ฐ๊ณต๋ถ > Elixir' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Eric's Elixir] ์ํฐ(Atom), ํํ(tuple) ์ ๋ํด ์์๋ณด๊ธฐ ๐งช (0) | 2023.11.04 |
---|---|
[Eric's Elixir] ํ ์ฐ์ฐ์๋? ๐ (0) | 2023.09.24 |