Wprowadzenie do Elixir Lang
Opublikowany: 2015-02-27Wprowadzenie do języka programowania Elixir (i za co go kocham)
Kilka miesięcy temu napisałem artykuł wprowadzający Cię do Golanga i dlaczego tak bardzo mi się to podobało. Chociaż nadal go kocham, ostatnio bawię się nowym językiem; Eliksir. Kupiłem książkę „Programming Elixir” i podążam za nią. Już pokochałem Elixir i mam nadzieję, że w tym artykule pokażę Ci dlaczego.
Kiedy kilka lat temu pracowałem dla Couchbase, bardzo zainteresowałem się Erlangiem i systemami rozproszonymi. Dla mnie Erlang jest zagmatwany. Kiedy zobaczyłem Elixir, od razu wiedziałem, że trafiłem na coś dobrego. Elixir jest szczegółowo opisany jako funkcjonalny i współbieżny język, który działa na wierzchu maszyny wirtualnej Erlang.
Wiele razy słyszałem, jak ludzie mówili, że Elixir to „Ruby dla Erlanga” itp. Ta teoria nie jest w pełni błędna, ale realistycznie to głównie tylko składnia Eliksiru jest pod wpływem Rubiego, ponieważ nie dzieli się wiele takich samych konstrukcji programistycznych. Jest oczywiście podobny do Erlanga, ponieważ jest zbudowany na maszynie wirtualnej Erlang i daje nam bezpośredni dostęp do prymitywów Erlang natywnie.
W każdym razie bez dalszych wahań zanurkujmy i zacznijmy od eliksiru.
Instalacja
Jeśli korzystasz z OSX, instalacja jest tak prosta, jak przy użyciu Homebrew:
~ brew update
~ brew install erlang
~ brew install elixir
Gdy to zrobisz, powinieneś być w stanie uruchomić:
~ elixir -v
> Elixir 1.0.2
Teraz Elixir jest zainstalowany poprawnie, możemy otworzyć Interactive Elixir i pobawić się kilkoma podstawowymi typami.
Rodzaje w Eliksirze
Uruchom Interactive Elixir REPL, wpisując
> iex
Zmienne:
iex(1)> name = "rbin"
#=> "rbin"
Atomy:
W Elixirze atom jest stałą, w której jego nazwa jest jego własną wartością.
iex(2)> :this_is_an_atom
#=> :this_is_an_atom
iex(3)> :my_atom == :atom
#=> false
Krotki:
Używamy notacji Curly Brace do definiowania krotek. W Elixirze krotki są przechowywane natychmiast w pamięci, co oznacza, że uzyskanie rozmiaru krotki lub uzyskanie dostępu do elementu krotki jest szybkie, ale aktualizowanie lub dodawanie elementów jest kosztowne, ponieważ wymaga skopiowania całej krotki w pamięci.
iex(4)> tuple = {:hello, "world"}
#=> {:hello, "world"}
iex(5)> elem(tuple, 1)
#=> "world"
Listy:
W Elixir listy są przechowywane w pamięci jako listy połączone. Możemy aktualizować listy w trywialny sposób, dołączając elementy, ale dołączanie elementów jest droższe, ponieważ musimy przejrzeć całą listę, aby określić jej rozmiar.
iex(8)> list = [1, 2, :atom]
#=> [1, 2, :atom]
iex(9)> ["string"] ++ list
#=> ["string", 1, 2, :atom]
iex(10)> list ++ [31]
#=> [1, 2, :atom, 31]
Istnieją bardzo przydatne wbudowane funkcje, których można używać z listami, w tym pobieranie Head & Tail listy.
iex(11)> hd(list)
#=> 1
iex(12)> tl(list)
#=> [2, :atom]
Funkcje anonimowe:
W Elixirze funkcje są obywatelami pierwszej klasy, co oznacza, że możemy przekazywać funkcje jako argumenty do innych funkcji. Poniżej zdefiniujemy zmienną o nazwie add , która zawiera funkcję, którą następnie przekażemy jako argument do funkcji is_function/1 func .
iex(14)> add = fn a, b -> a + b end
#Function<12.90072148/2 in :erl_eval.expr/5>
iex(15)> add.(13, 31)
#=> 44
iex(16)> is_function(add)
#=> true
Organizowanie naszych projektów (Mix)
Elixir jest dostarczany z bardzo przydatnym narzędziem o nazwie Mix. Mix to narzędzie do budowania, które pozwala nam bardzo łatwo generować, organizować, kompilować i testować nasze projekty. Ułatwia nam również zarządzanie zależnościami. (Zawsze drażliwy temat!) Aby stworzyć nowy projekt za pomocą Mixa, po prostu wykonujemy następujące czynności:
~ mix new myapp --module MyApp
Spowoduje to utworzenie katalogu o nazwie myapp z kilkoma plikami w środku. Zdefiniuje również moduł MyApp wewnątrz lib/myapp.ex .
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/myapp.ex
* creating test
* creating test/test_helper.exs
* creating test/myapp_test.exs
Your mix project was created successfully.
You can use mix to compile it, test it, and more:
cd myapp
mix test
Jak widać, otrzymujemy wszystkie pliki potrzebne do podstawowej struktury projektu. Myślę, że jest to jedna z ładniejszych funkcji dostępnych wraz z Elixirem. Posiadanie narzędzi do zarządzania projektami jest bardzo przydatne i pozwala zaoszczędzić dużo czasu.
Plik mix.exs jest głównym plikiem używanym do konfiguracji naszego projektu, zarządzania zależnościami itp. Otrzymujemy test/folder , w którym możemy pisać bardzo podobne do ruby testy dla naszego projektu. Otrzymujemy oczywiście lib/folder , który zawiera pliki źródłowe do naszego projektu. Jeśli uruchomimy test mix w naszej aplikacji, otrzymamy:
$ mix test
Compiled lib/myapp.ex
Generated myapp.app
.
Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures
Randomized with seed 543313
Konkurencja
Podobnie jak Erlang, Elixir używa modelu „Aktor” do współbieżności. Cały nasz kod działa wewnątrz Processes , a procesy te są od siebie odizolowane. Możemy tworzyć w pełni współbieżne programy w Elixirze poprzez spawnowanie Procesów oraz wysyłanie i odbieranie wiadomości między nimi.
W Elixirze procesy uruchamiamy za pomocą funkcji spawn , która jako argument przyjmuje inną funkcję.
iex(1)> spawn(fn -> IO.puts 1 + 1 end)
#=> 2
#PID<0.55.0>
Jak widać, stworzyliśmy proces, który wyprowadził 1 + 1, a także zwrócił swój identyfikator procesu. Zwrócenie tego identyfikatora procesu jest przydatne, ponieważ możemy przypisać go do zmiennej i użyć go do wysyłania wiadomości do procesu. Zanim to zrobimy, musimy stworzyć mechanizm odbierania , aby uzyskać wiadomości, które wysyłamy do procesu. (Możemy iść dalej i zrobić to w naszej sesji Interative Elixir , linijka po linijce.)
Kiedy już to zrobimy, możemy stworzyć proces, który ocenia obszar_pętli i przypisać go do pid .
pid = spawn(fn -> Geometry.area_loop() end)
#=> #PID<0.40.0>
Następnie możemy wysyłać do pid wiadomości, do których nasz predefiniowany kod będzie pasował, w zależności od tego, czy otrzyma atom :rectangle , czy :circle .
send pid, {:rectangle, 2, 3}
#=> Area = 6
# {:rectangle,2,3}
send pid, {:circle, 2}
#=> Area = 12.56000000000000049738
# {:circle,2}
Możemy sprawdzić, czy procesy nadal działają za pomocą Process.alive? funkcjonować.
Process.alive?(pid)
#=> false
Wniosek
Na tym blogu nawet nie zarysowaliśmy powierzchni. W Elixirze jest tak wiele niesamowitych funkcji, że mam nadzieję, że sam to sprawdzisz. Poniżej wymieniłem kilka zasobów edukacyjnych, które pomogą Ci w drodze, ale zanim wyruszysz i zanurkujesz, oto kilka moich osobistych ulubionych rzeczy dotyczących Elixir:
- Łatwo było go ogarnąć, z rubinową składnią i prymitywami podobnymi do Erlanga
- Ma za sobą fantastyczną społeczność
- Jego model współbieżności jest mi zarówno znajomy, jak i bardzo potężny
- Mix to dar niebios i oszczędza DUŻO czasu
- Elixir zachęca nas do dokumentowania wszystkiego
- Dzięki temu budowanie aplikacji rozproszonych jest znacznie mniej mylącym polem bitwy
- Widzę, że Elixir idzie DŁUGO.
Zasoby
Niektóre zasoby, które uznałem za bardzo przydatne podczas mojej krótkiej nauki Eliksiru:
- http://elixir-lang.org/getting-started/introduction.html
- https://pragprog.com/book/elixir/programming-elixir
- https://teamgaslight.com/blog/the-best-resources-for-learning-elixir
- http://ćwiczenia.io
* Idź i popijaj ten eliksir! – @rbin *