Przez ostatnie kilka tygodni mam przyjemność brać udział w darmowym kursie Functional Programming in Erlang i kilka rzeczy które pojawiły się w Erlangu spowodowały u mnie takie małe HALO?. Ucząc się Elixira kilka rzeczy było naprawdę dziwnych, ale też nie było tak, że kodu nie rozumiałem. Im łatwiej mi się czyta elixir tym szybciej załapywałem erlang. Poniżej znajdziecie te różnice które we mnie uderzyły i wymagały małego przestawienia się lub też po prostu spodobały/nie spodobały.
Zmienne
Pierwsza różnica, to zmienne. W elixir zmienną może być AlaMaKota
czy alaMaKota
czy a
czy A
. Nie ma znaczenia wielkość pierwszej litery – jedynie konwencja mówi by tego nie robić. W erlangu jest inaczej. Zmienne muszą rozpoczynać się od dużej litery – A
czy AlaMaKota
. Wszystko to co zaczyna się z małej jest atomem.
Atom
Atom w elixir jest wyraźnie określony przez :
, w erlangu, atom to wszystkie zmienne zaczynające się małej litery ale i uwaga, mały twist, wszystkie ciągi znaków zamknięte w pojedynczy ciapek '
. A więc normalnie poprawne wartości to:
> a. > ala. > 'Ala'.
Możecie to sobie sprawdzić:
> Y = 'Ala'. > is_atom(Y).
Koniec linii/wykonanie polecenia
W elixir wystarczy napisać:
iex> a = 10
I mamy wartość 10
z bindowaną do zmiennej a
. W erlangu (jak mogliście zauważyć w sekcji Atom), wszystko należy kończyć kropką. To kropka oznacza koniec linii/polecenia. Tak jak na starych maszynach do pisania by przejść do nowej linii to, przekręcało się kołowrotek i przesuwało głowicę na początek. To tak jakby tutaj też tak jest.
Deklaracja modułu
Tutaj widać, że elixir ciągnie z ruby, gdyż wystarczy, że napiszemy:
defmodule M do end
I mamy deklarację modułu :) w erlangu, moduł definiujemy następująco:
-module(name).
Funkcje publiczne i prywatne
W elixir mamy makra def
i defp
, które kolejno znaczą funkcja publiczna i funkcja prywatna. Funkcja prywatna to taka która może być wykonana jedynie z poziomu modułu. Zaś publiczna to taka, którą możemy wywołać poza modułem za pomocą Module.function_name
.
W erlangu funkcje publiczne deklarujemy prawie tak samo jak w JavaScript ES6 :) Mianowicie musimy określić export
zaraz po definicji modułu. Do tego przy exporcie musimy podać nazwę funkcji wraz z liczbą parametrów które ta funkcja przyjmuje.
-module(name). -export([test/0, test/2]).
Do tego, w erlangu, kod wywołujemy nie za pomocą Module.function_name
tylko w tym przypadku będzie to name:test
.
Komentarze
W elixir możemy dodać komentarz za pomocą #
. W erlangu wykorzystujemy %%
.
# elixir comment defmodule M do end
zaś w erlang:
-module(calc). -export([add/2]). %% adds two numbers add(A, B) -> A + B.
Funkcje wielolinijkowe
W Elixir po prostu piszemy normalnie kod
def doubleSum(a, b) do sum = a + b sum * 2 end
W erlangu wiemy, że musimy kończyć na kropce. Tylko, że kropka traktowana jest jako całe wyrażenie. Więc by rozdzielić linijki musimy dodać przecinek:
doubleSum(A,B) -> SUM = A+B, SUM * 2.
Pattern matching
W elixirze możemy mieć dwie funkcje o tej samej nazwie ale z innym wzorcem dopasowania:
def doubleSum(0, b) do b * 2 end def doubleSum(a, b) do sum = a + b sum * 2 end
W erlangu to tak nie działa, musimy wykorzystać średnik:
doubleSum(0,B) -> B * 2; doubleSum(A,B) -> SUM = A+B, SUM * 2.
Zmiana wartości z bindowej zmiennej
W elixir możemy dowolnie zmieniać bindowanie zmiennych, to znaczy, że zmienna a
może wskazywać na wartość 10
a zaraz potem na wartość 11
.
iex> a = 10 iex> a = 11 iex> a 11
W erlangu to jest niemożliwe:
> A = 10. > A. 10 > A = 11. ** exception error: no match of right hand side value 11
Ale jak widać znak =
działa tak samo prawie ;) czyli robi pattern matching.
Podsumowanie
To nie są wszystkie różnice, ale jedne z takich pierwszych na które natrafiłem i które powodują u mnie dalej małe problemy. Na przykład cały czas zapominam o kropce na końcu linijki. Albo nie robię przecinków czy średników.
Czasami mam wrażenie, że jednak erlang jest czystszym językiem, ale zaraz potem widzę, że jednak elixir jest :) więc mam mieszane uczucia do tego która składnia mi się bardziej podoba. Na pewno nie mogę się przyzwyczaić do dużych liter w zmiennych oraz komentarzy %%
:)
Postaram się post aktualizować lub pisać kolejne wersje jak znajdę kolejne różnice – ale takie które mają ręce i nogi, bo w końcu Elixir to język programowania bazujący na maszynie wirtualnej Erlanga a nie na języku programowania i semantyce języka erlang.
Typo : po prosty -> po prostu
Dzięki, poprawione
w Erlangu komentarz wchodzi po %
%, %% i %%% to już konwencje jak tego procenta się używa
Dzieki, nie wiedziałem a mogłem sprawdzić!
Comments are closed.