簡體   English   中英

Erlang vs Elixir Macros

[英]Erlang vs Elixir Macros

我遇到了一些Erlang代碼,我試圖將其轉換為Elixir,以幫助我學習這兩種語言並理解其中的差異。 宏觀和元編程一般是我仍然試圖解決的話題,所以希望你能理解我的困惑。

Erlang代碼

-define(p2(MAT, REP), 
        p2(W = MAT ++ STM) -> m_rep(0, W, STM, REP))

% where m_rep is a function already defined.

對我來說,似乎在上面的代碼中,有兩個單獨的p2宏定義映射到一個名為m_rep的私有函數。 但是在Elixir中,似乎只能有一個模式匹配定義。 Elixir也有可能有不同的嗎?

這些不是兩個定義。 第一行是宏,第二行是替換。 令人困惑的是,宏與它生成子句的函數同名。 例如,當像這樣使用宏時:

?p2("a", "b");
?p2("c", "d").

以上內容將擴展至:

p2(w = "a" ++ stm) -> m_rep(0, w, stm, "b");
p2(w = "c" ++ stm) -> m_rep(0, w, stm, "d").

您可以使用erlc -P生成.P文件,該文件將向您顯示宏擴展對代碼的影響。 看看這個稍微簡單,可編輯的例子:

-module(macro).
-export([foo/1]).

-define(foo(X),
        foo(X) -> X).

?foo("bar");
?foo("baz");
?foo("qux").

使用erlc -P macro.erl您將獲得以下輸出到macro.P

-file("macro.erl", 1).

-module(macro).

-export([foo/1]).

foo("bar") ->
    "bar";
foo("baz") ->
    "baz";
foo("qux") ->
    "qux".

在Elixir中,您也可以使用宏定義多個函數子句。 它更冗長,但我認為它也更清晰。 Elixir等價物將是:

defmodule MyMacros do
  defmacro p2(mat, rep) do
    quote do
      def p2(w = unquote(mat) ++ stm) do
        m_rep(0, w, stm, unquote(rep))
      end
    end
  end
end

您可以使用它來定義多個函數子句,就像erlang對應的一樣:

defmodule MyModule do
  require MyMacros

  MyMacros.p2('a', 'b')
  MyMacros.p2('c', 'd')
end

我在這里無法自拔。 :-)如果它是你的宏然后使用后LFE(Lisp的香料二郎),為您提供更好的宏觀操控比任何二郎或酏劑。 它也兼容兩者。

-define(p2(MAT, REP), 
        p2(w = MAT ++ stm) -> m_rep(0, w, stm, REP))

% where m_rep is a function already defined.

上面的代碼有很多問題。

在Erlang中沒有帶有多個子句的宏。 上面的代碼沒有定義映射到名為m_rep的私有函數的p2宏的兩個單獨定義 它的作用是定義一個2參數宏,它定義了一個帶有一些參數並調用m_repp2函數。 但是,內部p2函數的參數定義不正確:

  • 它嘗試使用++ ,第二個參數不是列表
  • 它試圖給一個原子賦值(你的意思是一個大寫的W ,一個變量,而不是一個小的w ,一個原子嗎?)
  • 它在一個不允許賦值的地方嘗試賦值 - 在函數頭中。

您是否嘗試測試相等性( ==而不是= ),而不是進行分配? 如果是這樣,你必須使用警衛。

而且,在我看來,你試圖使用wstm ,好像它們是變量並將它們傳遞給m_rep ,但它們不是! Erlang中的變量必須以大寫字母開頭。 另一方面,Elixir中的變量則沒有。 你可能會混淆兩種相似但仍然不同的語言的概念。

我的一般建議是選擇一種語言並對其進行良好的學習,然后才能用這種知識嘗試不同的語言。 如果您對編程完全陌生,請選擇Erlang - 它更簡單,預先學習的東西較少。 如果您已經了解Ruby,請選擇Elixir,或者更多地了解您的技能。

請詳細說明您的意圖,我也許能夠提出表達它的代碼。 上面的代碼片段太模糊了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM