2

我需要这样的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 

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

提前致谢!

4

1 回答 1

8

这是一个如何实现类似目标的示例:

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

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

于 2013-11-12T14:53:12.757 回答