macros - 如何命名一个宏,使其在 Elixir 中看起来像一个常量?

标签 macros naming-conventions constants elixir

在 Erlang 中,我们可以定义一个像 -define(TIME, 60 * 60) 这样的宏。 而从像 ?TIME 这样的宏的调用中我们可以准确地知道它们是宏。

然而,在 Elixir 中,宏的调用看起来像函数调用。我们无法轻易区分宏调用和函数调用。

那么,有没有一种方法可以给一些像常量一样的宏命名?

最佳答案

在 Erlang 中,宏用作模板。所以 -define(TIME, 60 * 60) 会有效地将 60 * 60 引入到您的源代码中(在这种特定情况下可能由编译器预先计算)。

Elixir 中的等价物是:

defmacro time do
 quote do
   60 * 60
 end
end

但这与 Erlang 有完全相同的问题。如果你真的想计算一些昂贵的东西,它仍然会在你使用宏 time 的所有地方在运行时计算。

也就是说,Elixir 有另一种构造,允许您在编译时预先计算一个值,并通过属性简单地在您的函数中重复使用:

defmodule MyModule do
  @time 60 * 60

  def using_time do
    @time
  end
end

关于macros - 如何命名一个宏,使其在 Elixir 中看起来像一个常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21076416/

相关文章:

macros - 语法规则中如何使用矢量模式?

c++ - 取消定义和重新定义 __cplusplus 宏

C++ 错误 : assignment of read-only variable

php - 在不同的命名空间 php 中定义常量

c++ - const_iterator 到迭代器 C++ 错误

c - 在 c 中使用带有变量的宏

c - 在 C 中使用宏生成函数

java - 可以修改(写回)参数的函数和方法的良好命名约定

swift - Controller 纳米格。 TagSelectController 或 TagSelectionController

Java命名约定和serialVersionUID(常量小写)