Seize your moment! ๐Ÿ‘พ

์•ˆ๋…•ํ•˜์„ธ์š”. Eric์ž…๋‹ˆ๋‹ค. ์ œ ๋ธ”๋กœ๊ทธ์— ๋ฐฉ๋ฌธํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ๊ฐœ๋ฐœ๊ณต๋ถ€/Elixir

[Eric's Elixir] Elixir์—์„œ์˜ Quote์™€ Unquote ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!

Eric_ko 2023. 12. 16. 13:56

์„œ๋ก 

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