Segreti

Segreti

Esercizio di apprendimento

Introduzione

Funzioni anonime

In Elixir le funzioni sono trattate come cittadini di prima classe. Questo significa che:

  • Le funzioni con nome e quelle anonime possono essere assegnate a variabili.
  • Le funzioni con nome e quelle anonime possono essere passate in giro come dati, come argomenti e valori restituiti.
  • Le funzioni anonime possono essere create dinamicamente.

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:

  • Nascondere i dati usando lo scope lessicale (noto anche come closure).
  • Creare dinamicamente funzioni a runtime.

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

Manipolazione dei bit

Elixir supporta molte funzioni per lavorare con i bit, che si trovano nel modulo Bitwise.

  • band/2: AND bit a bit
  • bsl/2: scorrimento a sinistra bit a bit
  • bsr/2: scorrimento a destra bit a bit
  • bxor/2: XOR bit a bit
  • bor/2: OR bit a bit
  • bnot/1: NOT bit a bit

Ecco 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.

Istruzioni

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.

1. Crea un addizionatore

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

2. Crea un sottrattore

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

3. Crea un moltiplicatore

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

4. Crea un divisore

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.

5. Crea una funzione «and»

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

6. Crea una funzione «xor»

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

7. Crea un combinatore di funzioni

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
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elixir Exercism

Vuoi iniziare Segreti?

Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.