Начало работы с языком программирования Elixir

Опубликовано: 2022-03-11

Если вы читали сообщения в блогах, хакерские новости, ваши любимые твиты разработчиков или слушали подкасты, вы, вероятно, уже слышали о языке программирования Elixir. Язык был создан Хосе Валимом, известным разработчиком в мире открытого исходного кода. Вы можете знать его по фреймворку Ruby on Rails MVC или по рубиновым гемам devise и simple_form, над которыми он и его коллеги из Plataformatec работали последние несколько лет.

По словам Хосе Валима, Elixir родился в 2011 году. У него возникла идея создать новый язык из-за отсутствия хороших инструментов для решения проблем параллелизма в мире ruby. В то время, потратив время на изучение параллелизма и ориентированных на распределенные языки, он нашел два языка, которые ему понравились, Erlang и Clojure, которые работают в JVM. Ему нравилось все, что он видел в языке Erlang (Erlang VM), и он ненавидел то, чего не видел, например, полиморфизм, метапрограммирование и атрибуты расширяемости языка, в которых Clojure был хорош. Итак, Elixir родился с учетом этого, чтобы иметь альтернативу Clojure и динамический язык, который работает на виртуальной машине Erlang с хорошей поддержкой расширяемости.

Elixir описывает себя как динамический, функциональный язык с неизменяемым состоянием и основанным на акторах подходом к параллелизму, предназначенным для создания масштабируемых и удобных в сопровождении приложений с простым, современным и аккуратным синтаксисом. Язык работает в виртуальной машине Erlang, надежной, высокопроизводительной и распределенной виртуальной машине, известной своей малой задержкой и характеристиками отказоустойчивости.

Прежде чем мы увидим код, стоит сказать, что Elixir был принят растущим сообществом. Если вы хотите изучить Эликсир сегодня, вы легко найдете книги, библиотеки, конференции, встречи, подкасты, сообщения в блогах, информационные бюллетени и всевозможные источники обучения, как это было принято создателями Erlang.

Давайте посмотрим код!

Установить Эликсир:

Установка Elixir очень проста на всех основных платформах и на большинстве из них выполняется в одну строку.

Арх Линукс

Эликсир доступен для Arch Linux через официальные репозитории:

 pacman -S elixir

Убунту

Установка Elixir в Ubuntu немного утомительна. Но тем не менее это достаточно легко.

 wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb apt-get update apt-get install esl-erlang apt-get install elixir

ОС Х

Установите Elixir в OS X с помощью Homebrew.

 brew install elixir

Встречайте IEx

После завершения установки пришло время открыть вашу оболочку. Вы проведете много времени в своей оболочке, если захотите развиваться в Эликсире.

Интерактивная оболочка Elixir, или IEx, представляет собой REPL (цикл чтения, оценки и печати), в котором вы можете исследовать Elixir. Вы можете вводить туда выражения, и они будут оцениваться, давая вам немедленную обратную связь. Имейте в виду, что ваш код действительно оценивается, а не компилируется, поэтому не запускайте профилирование или тесты производительности в оболочке.

Демо IEx REPL.

Команда «Перерыв»

Прежде чем запускать IEx REPL, вам нужно знать одну важную вещь — как выйти из него.

Вы, вероятно, привыкли нажимать CTRL+C , чтобы закрывать программы, работающие в терминале. Если вы нажмете CTRL+C в IEx REPL, вы откроете меню перерыва. Оказавшись в меню перерыва, вы можете снова нажать CTRL+C , чтобы выйти из оболочки, а a нажать .

Выход из IEx REPL.

Я не буду углубляться в функции меню перерыва. Но давайте посмотрим на несколько помощников IEx!

Помощники

IEx предоставляет кучу помощников, чтобы перечислить их все, введите: h() .

И это то, что вы должны увидеть:

IEx помощники.

Это одни из моих любимых, думаю, они придутся и вам.

  • h , как мы только что видели, эта функция напечатает вспомогательное сообщение.
  • h/1 — та же самая функция, но теперь она принимает один аргумент.

Например, всякий раз, когда вы хотите увидеть документацию метода String strip/2 , вы можете легко сделать это:

IEx: Проверка документов.

Вероятно, вторым наиболее полезным помощником IEx, который вы собираетесь использовать при программировании на Эликсире, является c/2 , который компилирует заданный файл эликсира (или список) и ожидает в качестве второго параметра путь для записи скомпилированных файлов.

Допустим, вы работаете над одним из http://exercism.io/ упражнений Эликсира, упражнением Анаграммы.

Итак, вы реализовали модуль Anagram , у которого есть метод match/2 в файле anagram.exs. Как хороший разработчик, вы написали несколько спецификаций, чтобы убедиться, что все работает так, как вы ожидаете.

Вот как выглядит ваш текущий каталог:

Список каталогов для этого проекта Elixir.

Теперь, чтобы запустить ваши тесты для модуля Anagram, вам нужно запустить/скомпилировать тесты.

Запускаем тесты в Эликсире.

Как вы только что видели, чтобы скомпилировать файл, просто вызовите исполняемый файл elixir , передав в качестве аргумента путь к файлу, который вы хотите скомпилировать.

Теперь предположим, что вы хотите запустить IEx REPL с модулем Anagram, доступным в контексте сеанса. Есть два часто используемых варианта. Во-первых, вы можете запросить файл, используя параметры -r , что-то вроде iex -r anagram.exs . Второй можно скомпилировать прямо из сеанса IEx.

Компиляция прямо из сеанса IEx.

Просто, вот так!

Хорошо, а если вы хотите перекомпилировать модуль? Следует ли выйти из IEx, снова запустить его и снова скомпилировать файл? Неа! Если у вас хорошая память, вы помните, что когда мы перечисляли все помощники, доступные в IEx REPL, мы видели что-то о команде перекомпиляции. Давайте посмотрим, как это работает.

Перекомпилировать в IEx.

Обратите внимание, что на этот раз вы передали в качестве аргумента сам модуль, а не путь к файлу.

Как мы видели, в IEx есть множество других полезных помощников, которые помогут вам лучше изучить и понять, как работает программа на Эликсире.

Основы типов эликсиров

Числа

Есть два типа чисел. Целые числа произвольного размера и числа с плавающей запятой.

Целые числа

Целые числа могут быть записаны в десятичной системе счисления, шестнадцатеричной, восьмеричной и двоичной.

Как и в Ruby, вы можете использовать подчеркивание для разделения групп из трех цифр при написании больших чисел. Например, вы можете получить сто миллионов следующим образом:

 100_000_000

Восьмеричный:

 0o444

Шестнадцатеричный:

 0xabc

Бинарный:

 0b1011

Плавает

Floare имеют двойную точность IEEE 754. Они имеют 16-значную точность и максимальный показатель порядка 10308.

Поплавки записываются с использованием десятичной точки. До и после точки должна быть хотя бы одна цифра. Вы также можете добавить конечную экспоненту. Например, 1.0, 0.3141589e1 и 314159.0-e.

Атомы

Атомы — это константы, представляющие имена. Это неизменяемые ценности. Вы пишете атом с начальным двоеточием : и последовательностью букв, цифр, знаков подчеркивания и знаков @ . Вы также можете написать их с начальным двоеточием : и произвольной последовательностью символов, заключенной в кавычки.

Атомы — очень мощный инструмент, они используются для ссылки на функции erlang, а также на ключи и методы Elixir.

Вот несколько действительных атомов.

 :name, :first_name, :"last name", :===, :is_it_@_question?

Булевы значения

Конечно, логические значения — это истинные и ложные значения. Но самое приятное в них то, что в конце концов они всего лишь атомы.

Булевы значения — это просто атомы, что доказано IEx.

Струны

По умолчанию строки в Elixir совместимы с UTF-8. Чтобы использовать их, вы можете иметь произвольное количество символов, заключенных в " или ' . Вы также можете иметь интерполированные выражения внутри строки, а также экранированные символы.

Эликсирная интерполяция строк.

Имейте в виду, что строки в одинарных кавычках на самом деле представляют собой список двоичных файлов.

Поведение строки в одинарных кавычках в Elixir.

Анонимные функции

Как функциональный язык, Эликсир имеет анонимные функции в качестве базового типа. Простой способ написать функцию — fn (argument_list) -> body end . Но у функции может быть несколько тел с несколькими списками аргументов, защитными предложениями и т. д.

Дэйв Томас в книге Programming Elixir предлагает рассматривать fn…end как кавычки, окружающие строковый литерал, где вместо строкового значения мы возвращаем функцию.

Возврат функции Эликсира.

Кортежи

Tuple — это неизменяемый индексированный массив. Они быстро возвращают свой размер и медленно добавляют новые значения из-за своей неизменной природы. При обновлении кортежа вы фактически создаете совершенно новую копию самого кортежа.

Кортежи очень часто используются в качестве возвращаемого значения массива. При написании кода на Эликсире вы очень часто будете видеть это {:ok, something_else_here} .

Вот как мы пишем кортеж: {?a,?b,?c} .

Сопоставление с образцом

Я не смогу объяснить все, что вам нужно знать о сопоставлении с образцом, однако то, что вы собираетесь прочитать, охватывает многое из того, что вам нужно знать, чтобы начать.

Эликсир использует = в качестве оператора сопоставления. Чтобы понять это, нам как бы нужно разучиться тому, что мы знаем о = в других традиционных языках. В традиционных языках оператор равенства используется для присваивания. В Эликсире операторы равенства предназначены для сопоставления с образцом.

Итак, вот как это работает со значениями в левой части. Если они являются переменными, они привязаны к правой части, если они не являются переменными, elixir пытается сопоставить их с правой частью.

Демонстрация сопоставления шаблонов Elixir.

Пин-оператор

Эликсир предоставляет способ всегда принудительно сопоставлять шаблоны с переменной в левой части, оператором булавки.

Демонстрация оператора булавки Elixir.

Списки

В Эликсире списки выглядят как массивы, какими мы знаем их из других языков, но это не так. Списки — это связанные структуры, состоящие из головы и хвоста.

Поведение списка эликсиров.

Списки ключевых слов

Списки ключевых слов — это список пар кортежей.

Вы просто записываете их в виде списков. Например: [{:один, 1}, 2, {:три, 3}]. Есть ярлык для определения списков, вот как он выглядит: [один: 1, три: 3].

Чтобы получить элемент из списка ключевых слов, вы можете использовать:

 Keyword.get([{:one, 1}, 2, {:three, 3}], :one)

Или используйте ярлык:

 [{:one, 1}, 2, {:three, 3}][:one]

Поскольку списки ключевых слов медленны при извлечении значения, это дорогостоящая операция, поэтому, если вы храните данные, требующие быстрого доступа, вы должны использовать карту.

Карты

Карты — это эффективный набор пар ключ/значение. Ключ может иметь любое значение, которое вы хотите использовать в качестве ключа, но обычно он должен быть того же типа. В отличие от списков ключевых слов, Карты допускают только одну запись для данного ключа. Они эффективны по мере роста, и их можно использовать в сопоставлении шаблонов Elixir в картах общего назначения, когда вам нужен ассоциативный массив.

Вот как вы можете написать карту:

 %{ :one => 1, :two => 2, 3 => 3, "four" => 4, [] => %{}, {} => [k: :v]}

Заключение

Эликсир великолепен, прост для понимания, имеет простые, но мощные типы и очень полезные инструменты, которые помогут вам в начале обучения. В этой первой части мы рассмотрели различные типы данных, на которых построены программы Elixir, и операторы, которые их приводят в действие. В последующих частях мы углубимся в мир Эликсира — функционального и параллельного программирования.

Связанный: Раскопки ClojureScript для фронтенд-разработки