Elixir使用宏构建具有模式匹配和保护的自定义功能?

时间:2013-11-11 22:46:28

标签: function macros erlang dsl elixir

我需要像这样使用DSL:

defmodule SomeModule do
  use SomeMacros

  # sample shipping DSL
  rule is_north_america do
    calculate_shipping_cost_with usps
  end

  rule is_north_america and november_or_december do
    calculate_shipping_cost_with ups
  end

  rule is_south_america do
    calculate_shipping_cost_with fedex
  end

  rule is_somewhere_else do
    calculate_shipping_cost_with dhl
  end
end

将每个调用转换为规则宏(我已经定义过)并让它在SomeModule模块中定义一个函数。像这样:

def is_north_america_rule(Address[continent: "North America"] = address) do
  # do something
end 

我想对传递给宏生成的函数的参数使用模式匹配。我已经看到了如何在宏中定义自定义函数,但我不确定如何在宏生成的函数中实现模式匹配和保护。

提前致谢!

1 个答案:

答案 0 :(得分:8)

以下是您如何实现类似目标的示例:

https://gist.github.com/josevalim/7432084

我打算添加更多信息,但我决定提供一个简单的示例,然后回答您可能遇到的任何进一步问题。但是请注意,尽量使这条规则DSL尽可能简单,如果你看到宏代码开始变得越来越复杂,只需使用cond(明确地)就会更好。