Pierwsze kroki z językiem programowania Elixir
Opublikowany: 2022-03-11Jeśli czytałeś posty na blogu, wątki hakerskie, tweety ulubionych programistów lub słuchałeś podcastów, w tym momencie prawdopodobnie słyszałeś o języku programowania Elixir. Język został stworzony przez Jose Valima, znanego programistę w świecie open-source. Może znasz go z frameworka Ruby on Rails MVC lub z devise i simple_form ruby gemów, nad którymi on i jego współpracownicy z Plataformatec pracowali w ciągu ostatnich kilku lat.
Według Jose Valima, Elixir narodził się w 2011 roku. Na pomysł zbudowania nowego języka wpadł mu brak dobrych narzędzi do rozwiązywania problemów współbieżności w świecie rubinowym. W tym czasie, po spędzeniu czasu na nauce współbieżności i rozproszonych języków skupionych, znalazł dwa języki, które mu się podobały, Erlang i Clojure, które działają w JVM. Podobało mu się wszystko, co widział w języku Erlang (Erlang VM) i nienawidził rzeczy, których nie widział, takich jak polimorfizm, metaprogramowanie i atrybuty rozszerzalności języka, w których Clojure był dobry. Elixir narodził się z myślą o tym, aby mieć alternatywę dla Clojure i dynamiczny język, który działa w wirtualnej maszynie Erlang z dobrą obsługą rozszerzalności.
Elixir opisuje siebie jako dynamiczny, funkcjonalny język z niezmiennym stanem i opartym na aktorach podejściem do współbieżności, zaprojektowanym do tworzenia skalowalnych i konserwowalnych aplikacji o prostej, nowoczesnej i uporządkowanej składni. Język działa w maszynie wirtualnej Erlang, odpornej na bitwy, wysokowydajnej i rozproszonej maszynie wirtualnej znanej z niskich opóźnień i odporności na błędy.
Zanim zobaczymy jakiś kod, warto powiedzieć, że Elixir został zaakceptowany przez rozwijającą się społeczność. Jeśli chcesz dziś nauczyć się Elixir, z łatwością znajdziesz książki, biblioteki, konferencje, spotkania, podcasty, posty na blogach, biuletyny i wszelkiego rodzaju źródła nauki, które zostały zaakceptowane przez twórców Erlanga.
Zobaczmy kod!
Zainstaluj eliksir:
Instalacja Elixir jest bardzo łatwa na wszystkich głównych platformach i jest jednolita w większości z nich.
Arch Linux
Elixir jest dostępny w Arch Linux za pośrednictwem oficjalnych repozytoriów:
pacman -S elixir
Ubuntu
Instalacja Elixir w Ubuntu jest trochę żmudna. Mimo to jest to dość łatwe.
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
OS X
Zainstaluj Elixir w OS X za pomocą Homebrew.
brew install elixir
Poznaj IEx
Po zakończeniu instalacji czas otworzyć powłokę. Spędzisz dużo czasu w swojej powłoce, jeśli chcesz rozwijać się w Eliksirze.
Interaktywna powłoka Elixir lub IEx to REPL - (Read Evaluate Print Loop), w której możesz eksplorować Elixir. Możesz tam wprowadzać wyrażenia, które zostaną ocenione, dając natychmiastową informację zwrotną. Pamiętaj, że Twój kod jest naprawdę oceniany, a nie kompilowany, więc upewnij się, że nie uruchamiasz profilowania ani testów porównawczych w powłoce.
Rozkaz łamania
Jest ważna rzecz, którą musisz wiedzieć przed rozpoczęciem IEx REPL – jak z niej wyjść.
Prawdopodobnie jesteś przyzwyczajony do naciskania CTRL+C
, aby zamknąć programy uruchomione w terminalu. Jeśli naciśniesz CTRL+C
w REPL IEx, otworzysz menu przerwy. Będąc w menu przerwy, możesz ponownie nacisnąć CTRL+C
, aby wyjść z powłoki, a a
nacisnąć .
Nie zamierzam zagłębiać się w funkcje menu przerwań. Ale zobaczmy kilku pomocników IEx!
Pomocnicy
IEx dostarcza garść pomocników, aby wyświetlić je wszystkie, wpisz: h()
.
A oto, co powinieneś zobaczyć:
To jedne z moich ulubionych, myślę, że będą również twoje.
-
h
jak właśnie widzieliśmy, ta funkcja wypisze wiadomość pomocnika. -
h/1
, która jest tą samą funkcją, ale teraz oczekuje jednego argumentu.
Na przykład, gdy chcesz zobaczyć dokumentację metody String
strip/2
, możesz łatwo zrobić:
Prawdopodobnie drugim najbardziej użytecznym pomocnikiem IEx, którego będziesz używać podczas programowania w Elixirze, jest c/2
, który kompiluje dany plik eliksiru (lub listę) i oczekuje jako drugiego parametru ścieżki do zapisania skompilowanych plików.
Załóżmy, że pracujesz w jednym z http://exercism.io/ ćwiczeń Elixir, ćwiczeniu Anagram.
Zaimplementowałeś więc moduł Anagram
, który ma metodę match/2
w pliku anagram.exs. Jako dobry programista napisałeś kilka specyfikacji, aby upewnić się, że wszystko działa zgodnie z oczekiwaniami.
Tak wygląda Twój aktualny katalog:
Teraz, aby uruchomić swoje testy z modułem Anagram, musisz uruchomić/skompilować testy.
Jak właśnie widziałeś, aby skompilować plik, po prostu wywołaj plik wykonywalny elixir
podając jako ścieżkę argumentu do pliku, który chcesz skompilować.
Załóżmy teraz, że chcesz uruchomić IEx REPL z modułem Anagram dostępnym w kontekście sesji. Istnieją dwie powszechnie używane opcje. Po pierwsze, możesz zażądać pliku za pomocą opcji -r
, coś w rodzaju iex -r anagram.exs
. Drugi możesz skompilować bezpośrednio z sesji IEx.
Proste, tak po prostu!
Ok, a co jeśli chcesz ponownie skompilować moduł? Czy należy wyjść z IEx, uruchomić go ponownie i ponownie skompilować plik? Nie! Jeśli masz dobrą pamięć, pamiętasz, że kiedy wymieniliśmy wszystkie helpery dostępne w IEx REPL, zobaczyliśmy coś o poleceniu rekompilacji. Zobaczmy, jak to działa.
Zauważ, że tym razem jako argument przekazałeś sam moduł, a nie ścieżkę do pliku.
Jak widzieliśmy, IEx ma wiele innych przydatnych pomocników, które pomogą Ci lepiej poznać i zrozumieć działanie programu Elixir.

Podstawy rodzajów eliksirów
Liczby
Istnieją dwa rodzaje liczb. Dowolne liczby całkowite i liczby zmiennoprzecinkowe.
Liczby całkowite
Liczby całkowite mogą być zapisywane w systemie dziesiętnym, szesnastkowym, ósemkowym i binarnym.
Podobnie jak w Ruby, możesz użyć podkreślenia, aby oddzielić grupy trzech cyfr podczas pisania dużych liczb. Na przykład możesz naprawić sto milionów w ten sposób:
100_000_000
ósemkowy:
0o444
Szesnastkowy:
0xabc
Dwójkowy:
0b1011
Pływa
Floare mają podwójną precyzję IEEE 754. Mają 16 cyfr dokładności i maksymalny wykładnik około 10308.
Liczby zmiennopozycyjne są zapisywane z użyciem przecinka dziesiętnego. Musi być co najmniej jedna cyfra przed i za kropką. Możesz także dołączyć końcowy wykładnik. Na przykład 1,0, 0,3141589e1 i 314159,0-e.
Atomy
Atomy to stałe reprezentujące nazwy. Są to wartości niezmienne. Piszesz atom z dwukropkiem na początku :
i ciągiem liter, cyfr, podkreśleń i znaków @
. Można je również zapisać z dwukropkiem na początku :
i dowolną sekwencją znaków ujętą w cudzysłowy.
Atomy są bardzo potężnym narzędziem, są używane do odwoływania się do funkcji erlang, a także klawiszy i metod Elixir.
Oto kilka ważnych atomów.
:name, :first_name, :"last name", :===, :is_it_@_question?
Boole'a
Oczywiście wartości logiczne to prawdziwe i fałszywe wartości. Ale fajną rzeczą w nich jest to, że pod koniec dnia są tylko atomami.
Smyczki
Domyślnie łańcuchy w Elixir są zgodne z UTF-8. Aby ich użyć, możesz mieć dowolną liczbę znaków ujętych w "
lub '
. Możesz także mieć interpolowane wyrażenia wewnątrz ciągu, a także znaki specjalne.
Należy pamiętać, że łańcuchy w pojedynczym cudzysłowie są w rzeczywistości listą plików binarnych.
Funkcje anonimowe
Jako język funkcjonalny, Elixir ma funkcje anonimowe jako podstawowy typ. Prostym sposobem na napisanie funkcji jest fn (argument_list) -> body end
. Ale funkcja może mieć wiele ciał z wieloma listami argumentów, klauzulami ochronnymi i tak dalej.
Dave Thomas w książce Programming Elixir sugeruje, że myślimy o fn…end jako o cudzysłowie otaczającym literał ciągu, gdzie zamiast zwracania wartości ciągu, zwracamy funkcję.
Krotki
Krotka to niezmienna tablica indeksowana. Szybko zwracają swój rozmiar i wolno dodają nowe wartości ze względu na ich niezmienną naturę. Aktualizując krotkę, w rzeczywistości tworzysz zupełnie nową kopię siebie krotki.
Krotki są bardzo często używane jako wartość zwracana przez tablicę. Podczas kodowania w Elixirze bardzo często zobaczysz to, {:ok, something_else_here}
.
Oto jak piszemy krotkę: {?a,?b,?c}
.
Dopasowywanie wzorów
Nie będę w stanie wyjaśnić wszystkiego, co musisz wiedzieć o dopasowaniu wzorców, jednak to, co przeczytasz, zawiera wiele informacji, które musisz wiedzieć, aby zacząć.
Elixir używa =
jako operatora dopasowania. Aby to zrozumieć, musimy oduczyć się tego, o czym wiemy =
w innych tradycyjnych językach. W tradycyjnych językach operator równości służy do przypisania. W Elixirze operatory równości służą do dopasowywania wzorców.
Tak to działa wartości po lewej stronie. Jeśli są zmiennymi, są przypisane do prawej strony, jeśli nie są zmiennymi, elixir próbuje dopasować je do prawej strony.
Operator przypinania
Elixir zapewnia sposób, aby zawsze wymuszać dopasowanie wzorca do zmiennej po lewej stronie, operatora szpilki.
Listy
W Elixirze Listy wyglądają jak tablice, jakie znamy z innych języków, ale nimi nie są. Listy to połączone struktury, które składają się z głowy i ogona.
Listy słów kluczowych
Listy słów kluczowych to lista par krotek.
Po prostu piszesz je jako listy. Na przykład: [{:jeden, 1}, 2, {:trzy, 3}]. Jest skrót do definiowania list, oto jak to wygląda: [jeden: 1, trzy: 3].
Aby pobrać element z listy słów kluczowych, możesz użyć:
Keyword.get([{:one, 1}, 2, {:three, 3}], :one)
Lub użyj skrótu:
[{:one, 1}, 2, {:three, 3}][:one]
Ponieważ listy słów kluczowych są powolne podczas pobierania wartości, jest to kosztowna operacja, więc jeśli przechowujesz dane, które wymagają szybkiego dostępu, powinieneś użyć mapy.
Mapy
Mapy to wydajna kolekcja par klucz/wartość. Klucz może mieć dowolną wartość, którą chcesz jako klucz, ale zwykle powinien być tego samego typu. W odróżnieniu od list słów kluczowych, Mapy umożliwiają tylko jeden wpis dla danego klucza. Są wydajne, gdy rosną i mogą być używane w dopasowywaniu wzorców Elixir w mapach ogólnego użytku, gdy potrzebujesz tablicy asocjacyjnej.
Oto jak możesz napisać mapę:
%{ :one => 1, :two => 2, 3 => 3, "four" => 4, [] => %{}, {} => [k: :v]}
Wniosek
Elixir jest niesamowity, łatwy do zrozumienia, ma proste, ale potężne typy i bardzo przydatne narzędzia, które pomogą Ci na początku nauki. W tej pierwszej części omówiliśmy różne typy danych, na których zbudowane są programy Elixir oraz operatory, które je zasilają. W dalszej części zagłębimy się w świat Elixir - programowanie funkcjonalne i współbieżne.