In Elixir le funzioni sono trattate come cittadini di prima classe. Questo significa che:
Le funzioni anonime, a differenza delle funzioni con nome, non hanno un riferimento statico disponibile: sono disponibili solo se assegnate a una variabile o chiamate immediatamente.
Potremmo usare le funzioni anonime per:
Le funzioni anonime iniziano con la parola riservata fn, gli argomenti sono separati dal corpo della funzione con il token ->, e terminano con un end. Come per le funzioni con nome, l'ultima espressione della funzione viene restituita implicitamente alla funzione chiamante.
Per chiamare un riferimento a una funzione, devi usare un . tra la variabile di riferimento e la lista di argomenti:
function_variable = fn param ->
param + 1
end
function_variable.(1)
# => 2
Puoi anche usare la notazione di cattura abbreviata per renderlo più conciso:
variable = &(&1 + 1)
variable.(1)
# => 2
Elixir supporta molte funzioni per lavorare con i bit, che si trovano nel modulo Bitwise.
band/2: AND bit a bitbsl/2: scorrimento a sinistra bit a bitbsr/2: scorrimento a destra bit a bitbxor/2: XOR bit a bitbor/2: OR bit a bitbnot/1: NOT bit a bitEcco un esempio di come usare una funzione bit a bit:
Bitwise.bsl(1, 3)
# => 8
Tutte le funzioni bit a bit funzionano solo su numeri interi.
Se usi Elixir versione 1.9 o inferiore, dovrai chiamare require Bitwise all'inizio della definizione del modulo per poter usare il modulo Bitwise.
In questo esercizio, avrai il compito di scrivere il software per un dispositivo di cifratura che funziona eseguendo trasformazioni sui dati. Serve un modo per creare in modo flessibile funzioni complicate, combinando insieme funzioni più semplici.
Per ogni compito, restituisci una funzione anonima che può essere chiamata dallo scope chiamante.
Tutte le funzioni devono aspettarsi argomenti interi. In Elixir, i numeri interi sono adatti anche per eseguire operazioni bit a bit.
Implementa Secrets.secret_add/1. Deve restituire una funzione che accetta un argomento e gli aggiunge l'argomento passato a secret_add.
adder = Secrets.secret_add(3)
adder.(2)
# => 5
Implementa Secrets.secret_subtract/1. Deve restituire una funzione che accetta un argomento e sottrae da quell'argomento il segreto passato a secret_subtract.
subtractor = Secrets.secret_subtract(2)
subtractor.(3)
# => 1
Implementa Secrets.secret_multiply/1. Deve restituire una funzione che accetta un argomento e lo moltiplica per il segreto passato a secret_multiply.
multiplier = Secrets.secret_multiply(7)
multiplier.(3)
# => 21
Implementa Secrets.secret_divide/1. Deve restituire una funzione che accetta un argomento e lo divide per il segreto passato a secret_divide.
divider = Secrets.secret_divide(3)
divider.(32)
# => 10
Usa la divisione intera, così l'output è compatibile con l'input atteso dalle altre funzioni.
Implementa Secrets.secret_and/1. Deve restituire una funzione che accetta un argomento e su di esso e sul segreto passato a secret_and esegue un'operazione bit a bit and.
ander = Secrets.secret_and(1)
ander.(2)
# => 0
Implementa Secrets.secret_xor/1. Deve restituire una funzione che accetta un argomento e su di esso e sul segreto passato a secret_xor esegue un'operazione bit a bit xor.
xorer = Secrets.secret_xor(1)
xorer.(3)
# => 2
Implementa Secrets.secret_combine/2. Deve restituire una funzione che accetta un argomento e gli applica, nell'ordine, le due funzioni passate a secret_combine.
add_one = Secrets.secret_add(1)
multiply_by_2 = Secrets.secret_multiply(2)
combined = Secrets.secret_combine(add_one, multiply_by_2)
combined.(3)
# => 8
Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.