當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir Macro用法及代碼示例


Elixir語言中 Macro 相關用法介紹如下。

宏是編譯時構造,以 Elixir 的 AST 作為輸入並以 Elixir 的 AST 的超集作為輸出來調用。

讓我們看一個顯示函數和宏之間區別的簡單示例:

defmodule Example do
  defmacro macro_inspect(value) do
    IO.inspect(value)
    value
  end

  def fun_inspect(value) do
    IO.inspect(value)
    value
  end
end

現在讓我們試一試:

import Example

macro_inspect(1)
#=> 1
#=> 1

fun_inspect(1)
#=> 1
#=> 1

到目前為止,它們的行為相同,因為我們將整數作為參數傳遞。但是當我們傳遞一個表達式時會發生什麽:

macro_inspect(1 + 2)
#=> {:+, [line: 3], [1, 2]}
#=> 3

fun_inspect(1 + 2)
#=> 3
#=> 3

宏接收作為參數給出的代碼的表示,而函數接收作為參數給出的代碼的結果。宏必須返回代碼表示的超集。有關詳細信息,請參閱 input/0 output/0

要了解有關 Elixir 的 AST 以及如何以編程方式構建它們的更多信息,請參閱 quote/2

自定義印記

宏也常用於實現自定義印記。要創建自定義印記,請定義一個名稱為 sigil_{identifier} 的宏,該宏帶有兩個參數。第一個參數是字符串,第二個參數是包含任何修飾符的字符列表。如果印記是小寫的(例如 sigil_x ),則字符串參數將允許插值。如果印記是大寫的(例如 sigil_X ),則不會對字符串進行插值。

有效修飾符僅包括小寫和大寫字母。其他字符會導致語法錯誤。

必須先導入包含自定義 sigil 的模塊,然後才能使用 sigil 語法。

例子

defmodule MySigils do
  defmacro sigil_x(term, [?r]) do
    quote do
      unquote(term) |> String.reverse()
    end
  end
  defmacro sigil_x(term, _modifiers) do
    term
  end
  defmacro sigil_X(term, [?r]) do
    quote do
      unquote(term) |> String.reverse()
    end
  end
  defmacro sigil_X(term, _modifiers) do
    term
  end
end

import MySigils

~x(with #{"inter" <> "polation"})
#=>"with interpolation"

~x(with #{"inter" <> "polation"})r
#=>"noitalopretni htiw"

~X(without #{"interpolation"})
#=>"without \#{"interpolation"}"

~X(without #{"interpolation"})r
#=>"}\"noitalopretni\"{# tuohtiw"

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Macro。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。