Ostatni tydzień był łaskawy i na Elixir udało mi się poświęcić więcej niż 2h – głównie czytania, ale zawsze coś. Dzięki temu kilka spraw mi się rozjaśniło :) co jest to dość dobre szczere mówiąc :) Więc tym razem zamiast kodu – choć trochę go będzie – więcej raczej informacji typu FAQ ;)

Zwracanie wartośći

Dziwiło mnie to, że wystarczy iż w metodzie napiszę:

def sum(a, b) do
	a + b
end

I już wiadomo, że chcę zwrócić wartość. W Elixir, każde wyrażenie! Powtórzę KAŻDE zwraca wartość, nawet if. Ciekwe, ale też ma to ręce i nogi. Takie podejście sprawuje się idelnie przy łączeniu wyrażeń za pomocą operatora pipeline |> ale o nim jeszcze będzie osobny post.

Pliki i moduły

To mnie ciekawiło. Ostatnio stworzyłem osobny plik dla Euclid.Contract. Bo sądziłem, że tak trzeba. Okazuje się, że nie. Po pierwsze, może być wiele modułów w pliku – super. Po drugie, można zagnieżdżać modułu. Po trzecie przez przypadek zastosowałem domyślny sposób “namespacingu” w Elixir.

Opcja pierwsza:

defmodule Euclid.Contract
end

defmodule Euclid
	@behaviour Euclid.Contract
end

Opcja druga:

defmodule Euclid

	defmodule Impl
		@behaviour Contract
	end
	
	defmodule Contract
	end

end

Opcja trzecia, tak zwany namespace. Nie ma w Elixir czegoś takiego jak hierarchia. Wszystko jest uzależnione od tego jak nazwiesz moduł lub czy jest on zagnieżdżony. Więc dzięki kropce możesz stworzyć sobie pseudo namespace – dla Twojego oka to tak może wyglądać, dla elixr nie ma znaczenia, każdy moduł jest “odgórny” ;)

Lokalizacja funkcji

Funkcje mogą być tylko i wyłącznie w modułach. To się potwierdza z tym co czytałem wcześniej, z komentarzami i moimi eksperymentami.

Elixirowe nazewnictwo funkcji

Czasami możecie zobaczyć na przykład taki string:

COŚ/2
INNE_COS/1
JESZCZE_INNE_COS/0

Czy też bardziej realne:

List.insert_at/3

Co to oznacza? Co znaczy /LICZBA ? A mianowicie, liczbę parametrów ;) to jest tak banalne, że aż mi się smutno zrobiło, że się nie domyśliłem :)

Przeciążanie funkcji

Ok, .NETowcy, ile razy pisaliście kod typu:

public smth Do(string a) 
{
	return Do(a, null, null, 10);
}

// [...]

public smth Do(string a, string b, string c, int priority) 
{
}

Każdy z was? Haha :) no i dobrze! Bo się nie dało lepiej przez wiele lat ;) a tutaj się da (domyślnie):

def do (a, b \\ nil, c \\ nil, priority \\ 10) do
end

Dla prostego przykładu zróbcie sobie dodawanie ;) będzie łatwiej:

defmodule Test_sum do
	def add(a \\ 1, b \\ 1, c \\ 1, d \\ 1) do
		a+b+c+d
	end
end

Wyrażenie \\ umożliwia ustawienie domyślnej wartości dla argumentu. By to przetestować kod powyżej wklejcie do iex lub za pomocą mix stwórzcie nowy projekt i odpalcie iex -S mix:

Test_sum.add
Test_sum.add (2)
Test_sum.add (2, 2)
Test_sum.add (2, 2, 2)
Test_sum.add (2, 2, 2, 2)
Test_sum.add (2, "aa")

A co z nawiasami?

No zostawiłem to prawie na koniec pisząc wszędzie te nawiasy jak bozia przykazała. A no właśnie nie w elixirze. Jest to kompletnie opcjonalne. Czyli powyższy przypadek wywołania można zapisać:

Test_sum.add 2, 2, 2

A definicję:

def add a \\ 1, b \\ 1, c \\ 1, d \\ 1 do

Dla przejrzystości jednak warto dodawać chyba te nawiasy. Zobaczę, już się dziś łapałem pisząc posta, i je pomijałem ;) więc zobaczymy.

Konwencja nazywania funkcji

A to było dość ciekawe, po pierwsze, że w ogóle to robią i w jakim celu. Mianowicie programiści Elixir dodają do metod znak zapytania ? lub wykrzyknik !. Wszystko po to by rozróżnić metodę zwracającą true/false i metodę wywołującą wyjątek.

Czyli z poprzedniego tygodnia add i divide powinny się nazywać add! i divide!. Zobaczę jak mi pójdzie dostosowanie się do tego :)

Do tego dochodzi jeszcze zastada raczej używania podkreślenia do rozdzielenia słów: validate_input_against_params zamist validateInputAgainstParams, przy czym ValidateInputAgainsParams jest nie dozwolone gdyż nazwa musi zaczynać się od małej literki lub podkreślenia.

W czym jest napisany Elixir?

I to mnie chyba najbardziej zadziwiło. Do tej pory myślałem, że Elixir to język w oparciu o wirtualną maszynę Erlanga – czyli jest napisany w Erlangu. Jak się okazuje, myliłem się – no prawie. Bardzo mała część jest napisana w Erlangu, prawie, że nic. Reszta jest napisana w Elixir :) większość Elixir jest napisana w Elixir co jest dość takie ŁOŁ. Jak to było możliwe? To będę chciał poruszyć w kolejnym poscie. Ale aż mnie rączki świerzbią by nie czekać tygodnia i zacząć eksperymentować TERAZ :)

Podsumowanie

Trochę mi te podstawy rozjaśniły w głowie. Zaczynam mieć bazę na której będę wstanie budować dalszą wiedzę. Wciąż mam kilka dziur i będę się je starał uzupełniać w miarę upływu czasu. Pewnie także dużo więcej teorii i praktyki związanej z Actor modelem by się tutaj przydało. Co zamierzam nadrobić. To może też pomoże w pełni zrozumieć dlaczego moduł istnieje i na jakiej zasadzie istnieje – choć mam wrażenie, że odp jest po stronie Erlanga a nie Elixira :) więc może uda się w kolejny poscie wkraść tą informację ;)

1 KOMENTARZ

Comments are closed.