我对这种语法非常困惑:
create table(:topics) do
add :title, :string
end
create
是一个带有参数table()
的函数,这是另一个函数,如果我错了,可以纠正我吗?但是接着是功能主体吗?
有人可以解释一下它是如何工作的吗?
答案 0 :(得分:1)
create/2
是一个带有两个值的宏。只是因为您像
create table(...) do
...
end
不必说。 table/2
只是一个功能。您可以将上面的语句写为
table = table(:my_table)
create my_table do
...
end
您不是将函数传递给create宏,而是将恰好来自函数的值传递给create宏。
答案 1 :(得分:0)
do ... end
不一定是函数体。它是通用语法,与宏一起使用时,会将其内容的AST(抽象语法树)传递给宏。这是一个演示:
defmodule A do
defmacro a(args) do
IO.inspect args
end
def main do
a do
1 + 2
end
end
end
A.main
输出:
[do: {:+, [line: 8], [1, 2]}]
因此,它只是块主体的AST,使用关键字do
作为关键字列表传递。
create
只是一个接受两个参数的宏:第一个是table,第二个是do ... end
块。然后宏将转换该块并执行它。您可以查看该功能的the source code,以了解更多详细信息。