Исходный код Таблица необязательного синтаксиса
В предыдущих главах мы узнали, что синтаксис Elixir позволяет разработчикам опускать разделители в некоторых случаях, чтобы код был более читаемым. Например, мы узнали, что скобки необязательны:
iex> length([1, 2, 3]) == length [1, 2, 3] true
и что блоки do-end эквивалентны спискам ключевых слов:
# do-end blocks iex> if true do ...> :this ...> else ...> :that ...> end :this # keyword lists iex> if true, do: :this, else: :that :this
Списки ключевых слов используют обычную нотацию Elixir для разделения аргументов, где мы разделяем каждую пару ключ-значение запятыми, а каждый ключ следует за :. В блоках do мы избавляемся от двоеточий, запятых и разделяем каждое ключевое слово новой строкой. Они полезны именно потому, что устраняют избыточность при написании блоков кода. Большую часть времени мы используем синтаксис блоков, но полезно знать, что они эквивалентны.
Эти удобства, которые мы здесь называем «необязательным синтаксисом», позволяют ядру синтаксиса языка быть компактным, не жертвуя удобочитаемостью и выразительностью вашего кода. В этой краткой главе мы рассмотрим четыре правила, заданные языком, используя короткий фрагмент кода как площадку для экспериментов.
Проход по коду
Рассмотрим следующий код:
if variable? do Call.this() else Call.that() end
Теперь давайте уберем удобства по одному:
-
Блоки
do-endэквивалентны ключевым словам:if variable?, do: Call.this(), else: Call.that()
-
Списки ключевых слов в качестве последнего аргумента не требуют квадратных скобок, но давайте добавим их:
if variable?, [do: Call.this(), else: Call.that()]
-
Списки ключевых слов аналогичны спискам кортежей из двух элементов:
if variable?, [{:do, Call.this()}, {:else, Call.that()}] -
И наконец, скобки необязательны для вызовов функций, но давайте добавим их:
if(variable?, [{:do, Call.this()}, {:else, Call.that()}])
Вот и всё! Эти четыре правила описывают необязательный синтаксис, доступный в Elixir.
Чтобы понять, почему эти правила важны, мы можем кратко сравнить Elixir со многими другими языками программирования. Большинство языков программирования имеют несколько ключевых слов для определения методов, функций, условных операторов, циклов и т. д. Каждое из этих ключевых слов имеет свои собственные синтаксические правила.
Однако в Elixir ни одна из этих языковых функций не требует специальных «ключевых слов», вместо этого все они строятся на основе этого небольшого набора правил. Другой плюс заключается в том, что разработчики также могут расширять язык согласованным с ним способом, так как конструкции для проектирования и расширения языка одинаковы. Мы подробнее рассмотрим эту тему в руководстве по «Метапрограммированию».
В конечном итоге, эти правила позволяют нам писать:
defmodule Math do
def add(a, b) do
a + b
end
end
вместо:
defmodule(Math, [
{:do, def(add(a, b), [{:do, a + b}])}
])
Если у вас есть какие-либо вопросы, этот быстрый обзор вам поможет.
Наконец, если вы беспокоитесь о том, когда применять эти правила, стоит отметить, что форматировщик Elixir решает эти проблемы за вас. Большинство разработчиков Elixir используют задачу mix format для форматирования своих кодовых баз в соответствии с хорошо определённым набором правил, установленных командой Elixir и сообществом. Например, mix format всегда будет добавлять скобки к вызовам функций, если явно не указано обратное. Это помогает поддерживать согласованность во всех кодовых базах как внутри организаций, так и в более широком сообществе.
© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.17.2/optional-syntax.html