Do you want to pick up from where you left of?
Take me there

Διαλειτουργικότητα με την Erlang

Ένα από τα βασικά πλεονεκτήματα του να χτίζεις πάνω στην εικονική μηχανή της Erlang (BEAM) είναι η πληθώρα των υπάρχουσων βιβλιοθηκών που μας είναι διαθέσιμες. Η διαλειτουργικότητα μας επιτρέπει να αξιοποιούμε αυτές τις βιβλιοθήκες και την βασική βιβλιοθήκη της Erlang από τον κώδικά μας σε Elixir. Σε αυτό το μάθημα θα δούμε πως να έχουμε πρόσβαση σε λειτουργίες της βασικής βιβλιοθήκης και σε πακέτα τρίτων της Erlang.

Βασική Βιβλιοθήκη

Η εκτενής βασική βιβλιοθήκη της Erlang μπορεί να προσεγγιστεί από οποιοδήποτε κώδικα Elixir στην εφαρμογή μας. Οι ενότητες της Erlang παρουσιάζονται σαν άτομα με μικρά γράμματα όπως η :os και :timer.

Ας χρησιμοποιήσουμε την :timer.tc για να χρονομετρήσουμε την εκτέλεση μιας δοθείσας συνάρτησης:

defmodule Example do
  def timed(fun, args) do
    {time, result} = :timer.tc(fun, args)
    IO.puts("Χρόνος: #{time} μs")
    IO.puts("Αποτέλεσμα: #{result}")
  end
end

iex> Example.timed(fn (n) -> (n * n) * n end, [100])
Χρόνος: 8 μs
Αποτέλεσμα: 1000000

Για μια πλήρη λίστα των διαθέσιμων ενοτήτων, δείτε το Εγχειρίδιο Αναφοράς της Erlang.

Πακέτα Erlang

Σε ένα προηγούμενο μάθημα καλύψαμε το Mix και τη διαχείριση των εξαρτήσεων μας. Η προσθήκη βιβλιοθηκών της Erlang δουλεύει με τον ίδιο τρόπο. Σε περίπτωση που η βιβλιοθήκη της Erlang δεν έχει ανέβει στο Hex, μπορείτε να αναφερθείτε στο αποθετήριο git:

def deps do
  [{:png, github: "yuce/png"}]
end

Τώρα μπορούμε να έχουμε πρόσβαση στην βιβλιοθήκη της Erlang:

png =
  :png.create(%{:size => {30, 30}, :mode => {:indexed, 8}, :file => file, :palette => palette})

Αξιοσημείωτες Διαφορές

Τώρα που ξέρουμε πως να χρησιμοποιήσουμε την Erlang θα πρέπει να καλύψουμε μερικά σημαντικά σημεία που προκύπτουν από την διαλειτουργικότητα με την Erlang.

Άτομα

Τα άτομα της Erlang δείχνουν σχεδόν ίδια με τα αντίστοιχα της Elixir χωρίς την άνω-κάτω τελεία (:). Παρουσιάζονται με αλφαριθμητικά μικρών γραμμάτων και κάτω παύλες:

Elixir:

:example

Erlang:

example.

Αλφαριθμητικά

Στην Elixir όταν συζητάμε για αλφαριθμητικά εννοούμε δυαδικά κωδικοποιημένα σε UTF-8. Στην Erlang, τα αλφαριθμητικά χρησιμοποιούν διπλά εισαγωγικά αλλά αναφέρονται σαν λίστες χαρακτήρων:

Elixir:

iex> is_list('Παράδειγμα')
true
iex> is_list("Παράδειγμα")
false
iex> is_binary("Παράδειγμα")
true
iex> <<"Παράδειγμα">> === "Παράδειγμα"
true

Erlang:

1> is_list('Παράδειγμα').
false
2> is_list("Παράδειγμα").
true
3> is_binary("Παράδειγμα").
false
4> is_binary(<<"Παράδειγμα">>).
true

Είναι σημαντικό να σημειώσουμε ότι πολλές παλαιότερες βιβλιοθήκες της Erlang μπορεί να μην υποστηρίζουν τα δυαδικά, έτσι πρέπει να μετατρέψουμε τα αλφαριθμητικά της Elixir σε λίστες χαρακτήρων. Ευτυχώς αυτό είναι εύκολο να γίνει με την συνάρτηση to_charlist/1:

iex> :string.words("Γειά σου Κόσμε")
** (FunctionClauseError) no function clause matching in :string.strip_left/2

    The following arguments were given to :string.strip_left/2:

        # 1
        "Hello World"

        # 2
        32

    (stdlib) string.erl:1661: :string.strip_left/2
    (stdlib) string.erl:1659: :string.strip/3
    (stdlib) string.erl:1597: :string.words/2

iex> "Γειά σου Κόσμε" |> to_charlist |> :string.words
3

Μεταβλητές

Στην Erlang, οι μεταβλητές αρχίζουν με ένα κεφαλαίο γράμμα και η επανασύνδεση δεν επιτρέπεται.

Elixir:

iex> x = 10
10

iex> x = 20
20

iex> x1 = x + 10
30

Erlang:

1> X = 10.
10

2> X = 20.
** exception error: no match of right hand side value 20

3> X1 = X + 10.
20

Αυτό ήταν! Η αξιοποίηση της Erlang μέσα από τις Elixir εφαρμογές μας είναι εύκολη και πρακτικά διπλασιάζει τις βιβλιοθήκες που μας είναι διαθέσιμες.

Έπιασες λάθος ή θέλεις να συνεισφέρεις στο μάθημα; Επεξεργαστείτε αυτό το μάθημα στο GitHub!