Уточнить синтаксис Elixir, используемый в файле миграции Phoenix (в частности, функцию «создать») - PullRequest
0 голосов
/ 16 сентября 2018

Меня очень смущает этот синтаксис:

create table(:topics) do
  add :title, :string
end

create - это функция, которая принимает аргумент table(), это еще одна функция, поправьте меня, если я не прав?Но затем следует тело функции?

Может кто-нибудь объяснить, как это работает?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

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 - это просто макрос, который принимает два аргумента: первый - таблица, а второй - блок do ... end.Макрос затем преобразует блок и выполняет его.Вы можете увидеть исходный код функции для более подробной информации.

0 голосов
/ 16 сентября 2018

create/2 - это макрос, который принимает два значения.Просто потому, что вы называете это как

create table(...) do 
  ...
end

Не обязательно.table/2 - это просто функция.Вы можете написать приведенное выше утверждение как

table = table(:my_table)
create my_table do
  ...
end

Вы не передаете функцию в макрос создания, вы передаете значение, которое, как правило, приходит из функции в макрос создания.

...