Elixir è un linguaggio a tipizzazione dinamica: il tipo di una variabile viene controllato solo a runtime. Con l'operatore di corrispondenza =, possiamo associare un valore di qualsiasi tipo a un nome di variabile:
# Bound an integer value of 1
count = 1
# You may re-bind variables
count = 2
# You may re-bind any type to a variable
count = false
# Strings can be created by enclosing characters within double quotes
message = "Success!"
Elixir è un linguaggio di programmazione funzionale e richiede che tutte le funzioni con nome siano definite all'interno di un modulo. La parola chiave defmodule serve a definire un modulo. Tutti i moduli sono disponibili per tutti gli altri moduli a runtime e non richiedono un modificatore di accesso per essere visibili alle altre parti del programma. Un modulo è analogo a una classe in altri linguaggi di programmazione.
defmodule Calculator do
# ...
end
Le funzioni con nome devono essere definite all'interno di un modulo. La parola chiave def serve a definire una funzione con nome pubblica.
Ogni funzione può avere zero o più argomenti. Il valore dell'ultima espressione di una funzione viene sempre restituito in modo implicito.
defmodule Calculator do
def add(x, y) do
x + y
end
end
Chiamare una funzione significa specificarne il modulo e il nome e passare gli argomenti corrispondenti.
sum = Calculator.add(1, 2)
# => 3
La parola chiave defp può essere usata al posto di def per definire una funzione privata. Le funzioni private possono essere usate solo all'interno dello stesso modulo che le ha definite.
Quando si chiama una funzione all'interno dello stesso modulo in cui è definita, si può omettere il nome del modulo.
Puoi anche scrivere funzioni brevi con una sintassi su una sola riga (nota la virgola , e i due punti : attorno alla parola chiave do).
defmodule Calculator do
def subtract(x, y) do
private_subtract(x, y)
end
defp private_subtract(x, y), do: x - y
end
difference = Calculator.subtract(7, 2)
# => 5
difference = Calculator.private_subtract(7, 2)
# => ** (UndefinedFunctionError) function Calculator.private_subtract/2 is undefined or private
# Calculator.private_subtract(7, 2)
È comune riferirsi alle funzioni indicandone l'arità. L'arità di una funzione è il numero di argomenti che accetta.
# add/3 because this function has three arguments, thus an arity of 3
def add(x, y, z) do
x + y + z
end
I nomi dei moduli dovrebbero usare PascalCase. Un nome di modulo deve iniziare con una lettera maiuscola A-Z e può contenere lettere a-zA-Z, numeri 0-9 e underscore _.
I nomi delle variabili e delle funzioni dovrebbero usare snake_case. Un nome di variabile o di funzione deve iniziare con una lettera minuscola a-z o un underscore _, può contenere lettere a-zA-Z, numeri 0-9 e underscore _, e può terminare con un punto interrogativo ? o un punto esclamativo !.
Elixir ha una libreria standard molto ricca e ben documentata. La documentazione è disponibile online su hexdocs.pm/elixir. Salva questo link da qualche parte: ti servirà spesso!
La maggior parte dei tipi di dati predefiniti ha un modulo corrispondente che offre funzioni per lavorare con quel tipo di dati: ad esempio, c'è il modulo Integer per gli interi, il modulo String per le stringhe, il modulo List per gli array e così via.
Un modulo degno di nota è il modulo Kernel. Fornisce le capacità di base su cui è costruito il resto della libreria standard, come gli operatori aritmetici, le macro di controllo del flusso e molto altro. Le funzioni del modulo Kernel vengono importate automaticamente, quindi puoi usarle senza il prefisso Kernel..
I commenti possono essere usati per lasciare note ad altri sviluppatori che leggono il codice sorgente. I commenti su una sola riga in Elixir sono preceduti da #.
In questo esercizio scriverai del codice per aiutarti a cucinare una lasagna eccezionale dal tuo libro di cucina preferito.
Hai cinque attività, tutte legate al tempo che serve per cucinare la lasagna.
Definisci la funzione Lasagna.expected_minutes_in_oven/0, che non accetta alcun argomento e restituisce per quanti minuti la lasagna deve stare in forno. Secondo il libro di cucina, il tempo in forno previsto è di 40 minuti:
Lasagna.expected_minutes_in_oven()
# => 40
Definisci la funzione Lasagna.remaining_minutes_in_oven/1, che accetta come argomento i minuti effettivi che la lasagna ha già passato in forno e restituisce quanti minuti deve ancora restare in forno, in base al tempo in forno previsto dell'attività precedente.
Lasagna.remaining_minutes_in_oven(30)
# => 10
Definisci la funzione Lasagna.preparation_time_in_minutes/1, che accetta come argomento il numero di strati che hai aggiunto alla lasagna e restituisce quanti minuti hai impiegato per prepararla, supponendo che ogni strato richieda 2 minuti di preparazione.
Lasagna.preparation_time_in_minutes(2)
# => 4
Definisci la funzione Lasagna.total_time_in_minutes/2, che accetta due argomenti: il primo è il numero di strati che hai aggiunto alla lasagna, il secondo è il numero di minuti che la lasagna ha passato in forno. La funzione deve restituire il numero totale di minuti che hai impiegato a cucinare la lasagna, cioè la somma del tempo di preparazione in minuti e del tempo che la lasagna ha passato in forno fino a quel momento.
Lasagna.total_time_in_minutes(3, 20)
# => 26
Definisci la funzione Lasagna.alarm/0, che non accetta alcun argomento e restituisce un messaggio che indica che la lasagna è pronta da mangiare.
Lasagna.alarm()
# => "Ding!"
Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.