Elixir宏中的任意参数-包裹一个主体

惠特芬

我正在开发一个处理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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Sweet.js宏参数扩展为主体中的另一个宏,不需要

来自分类Dev

将一个对象包裹在另一个对象中

来自分类Dev

在jQuery中每2个元素周围包裹一个div

来自分类Dev

将前三个单词包裹在一个 span 中

来自分类Dev

将段落的每一行包裹在一个跨度中

来自分类Dev

EmberJS动作-包裹在“动作”中时,从另一个动作中调用一个动作

来自分类Dev

当Vue组件包裹到另一个组件中时,它停止工作

来自分类Dev

android-无法将Intent中的包裹传递给另一个活动

来自分类Dev

将下一个文本包裹在标签中

来自分类Dev

将小数的小数部分包裹在一个跨度中

来自分类Dev

Typo3 如何让 <li> 包裹在一个错字链接列表中

来自分类Dev

在包裹在另一个承诺中的流中等待承诺

来自分类Dev

宏中的逗号以将参数传递给另一个宏函数(#define a,b)

来自分类Dev

验证:“表主体中的第一个开始标记。”

来自分类Dev

如何在“静态主体”方法中调用另一个函数?

来自分类Dev

如何使用另一个模板上的html更改流星中的模板主体?

来自分类Dev

如何返回在Haskell中包裹的给定字母的字母表中的下一个字母

来自分类Dev

如何返回在Haskell中包裹的给定字母的字母表中的下一个字母

来自分类Dev

显示 -only 一个属性对象 - 在许多属性对象中,对象被包裹在数组中

来自分类Dev

我有一个 json 主体,它具有相似的参数,并且在 3 种不同情况下有一个不同,如何避免创建三个不同的主体

来自分类Dev

Elixir:在定义它的同一模块的主体中使用宏

来自分类Dev

想要将所有元素从下一个<h2>包裹到一个div中,直到另一个<h2>

来自分类Dev

在 C++ 中,在每个可变参数宏参数前面加上一个函数参数的名称

来自分类Dev

在python中,为什么仅在调用另一个模块的方法时才执行类主体中的代码?

来自分类Dev

C#中的继承“必须声明一个主体,因为它没有被标记为抽象,外部或部分”

来自分类Dev

如果条件变为假,java中是否有任何语句/函数可以执行前一个主体?

来自分类Dev

给RPM宏一个带空格的参数

来自分类Dev

创建一个可以根据参数省略行的宏

来自分类Dev

获取第一个以空格分隔的宏参数

Related 相关文章

  1. 1

    Sweet.js宏参数扩展为主体中的另一个宏,不需要

  2. 2

    将一个对象包裹在另一个对象中

  3. 3

    在jQuery中每2个元素周围包裹一个div

  4. 4

    将前三个单词包裹在一个 span 中

  5. 5

    将段落的每一行包裹在一个跨度中

  6. 6

    EmberJS动作-包裹在“动作”中时,从另一个动作中调用一个动作

  7. 7

    当Vue组件包裹到另一个组件中时,它停止工作

  8. 8

    android-无法将Intent中的包裹传递给另一个活动

  9. 9

    将下一个文本包裹在标签中

  10. 10

    将小数的小数部分包裹在一个跨度中

  11. 11

    Typo3 如何让 <li> 包裹在一个错字链接列表中

  12. 12

    在包裹在另一个承诺中的流中等待承诺

  13. 13

    宏中的逗号以将参数传递给另一个宏函数(#define a,b)

  14. 14

    验证:“表主体中的第一个开始标记。”

  15. 15

    如何在“静态主体”方法中调用另一个函数?

  16. 16

    如何使用另一个模板上的html更改流星中的模板主体?

  17. 17

    如何返回在Haskell中包裹的给定字母的字母表中的下一个字母

  18. 18

    如何返回在Haskell中包裹的给定字母的字母表中的下一个字母

  19. 19

    显示 -only 一个属性对象 - 在许多属性对象中,对象被包裹在数组中

  20. 20

    我有一个 json 主体,它具有相似的参数,并且在 3 种不同情况下有一个不同,如何避免创建三个不同的主体

  21. 21

    Elixir:在定义它的同一模块的主体中使用宏

  22. 22

    想要将所有元素从下一个<h2>包裹到一个div中,直到另一个<h2>

  23. 23

    在 C++ 中,在每个可变参数宏参数前面加上一个函数参数的名称

  24. 24

    在python中,为什么仅在调用另一个模块的方法时才执行类主体中的代码?

  25. 25

    C#中的继承“必须声明一个主体,因为它没有被标记为抽象,外部或部分”

  26. 26

    如果条件变为假,java中是否有任何语句/函数可以执行前一个主体?

  27. 27

    给RPM宏一个带空格的参数

  28. 28

    创建一个可以根据参数省略行的宏

  29. 29

    获取第一个以空格分隔的宏参数

热门标签

归档