我正在开发一个处理ETS的小型图书馆,我希望能够在表不存在的情况下尽早退出函数。我不能将其置于警卫状态,因为Elixir禁止与警卫进行交谈:ets
,因此我基本上必须将此检查放入每个功能中,最终看起来像这样的可怕(代码是演示-我知道这很杂乱: )):
def get_and_update(cache, key, modifier) do
unless is_ets_table(cache) do
{ :error, create_error(cache) }
else
set(cache, key, modifier.(get(cache, key)))
end
end
有没有一种方法可以将其宏化为以下内容?
deftable get_and_update(cache, key, modifier) do
set(cache, key, modifier.(get(cache, key)))
end
缺少表的检查将在deftable
宏中隐含。
我已经阅读了Macros,但似乎无法弄清楚到底发生了什么,因此,如果您能解释您的答案,我将不胜感激。
除了混乱之外,我还想使开发人员更容易使用宏名称,而不必总是记住要检查表。
提前致谢。
编辑:我还应该注意,参数的数量可以轻松(并且会)更改。
我实现了以下步骤,但是如果有更好的地方,请告诉我:
defmacro deftable({ func_name, _func_ctx, [cache|_] = args }, do: body) do
quote do
def unquote(func_name)(unquote_splicing(args)) do
if not is_ets_table(unquote(cache)) do
unquote(body)
else
{ :error, no_table(unquote(cache)) }
end
end
end
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句