我需要像这样使用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
我想对传递给宏生成的函数的参数使用模式匹配。我已经看到了如何在宏中定义自定义函数,但我不确定如何在宏生成的函数中实现模式匹配和保护。
提前致谢!
答案 0 :(得分:8)
以下是您如何实现类似目标的示例:
https://gist.github.com/josevalim/7432084
我打算添加更多信息,但我决定提供一个简单的示例,然后回答您可能遇到的任何进一步问题。但是请注意,尽量使这条规则DSL尽可能简单,如果你看到宏代码开始变得越来越复杂,只需使用cond
(明确地)就会更好。