Секрети

Секрети

Навчальна вправа

Вступ

Анонімні функції

У Elixir функції є обʼєктами першого класу. Це означає, що:

  • Іменовані та анонімні функції можна присвоювати змінним.
  • Іменовані та анонімні функції можна передавати як дані, зокрема як аргументи та як повернені значення.
  • Анонімні функції можна створювати динамічно.

На відміну від іменованих функцій, анонімні функції не мають статичного посилання, за яким до них можна звернутися: вони доступні лише тоді, коли їх присвоєно змінній або викликано одразу.

Анонімні функції можуть знадобитися, щоб:

  • Приховати дані за допомогою лексичної області видимості (її ще називають замиканням).
  • Динамічно створювати функції під час виконання.

Анонімні функції починаються із зарезервованого слова fn, аргументи відокремлюються від тіла функції токеном ->, а завершуються словом end. Як і в іменованих функціях, останній вираз функції неявно повертається до функції, що її викликала.

Щоб викликати посилання на функцію, потрібно поставити . між змінною з посиланням і списком аргументів:

function_variable = fn param ->
  param + 1
end

function_variable.(1)
# => 2

Можна навіть скористатися скороченим синтаксисом захоплення, щоб записати це стисліше:

variable = &(&1 + 1)

variable.(1)
# => 2

Побітові операції

Elixir підтримує багато функцій для роботи з бітами, зібраних у модулі Bitwise.

  • band/2: побітове AND
  • bsl/2: побітовий зсув вліво
  • bsr/2: побітовий зсув вправо
  • bxor/2: побітове XOR
  • bor/2: побітове OR
  • bnot/1: побітове NOT

Ось приклад використання побітової функції:

Bitwise.bsl(1, 3)
# => 8

Усі побітові функції працюють лише з цілими числами.

Якщо використовується Elixir версії 1.9 або старішої, потрібно викликати require Bitwise на початку визначення модуля, щоб мати змогу користуватися модулем Bitwise.

Вказівки

У цій вправі нам доручено написати програмне забезпечення для пристрою шифрування, який виконує перетворення над даними. Нам потрібен спосіб гнучко створювати складні функції, поєднуючи простіші функції.

Для кожного завдання поверніть анонімну функцію, яку можна викликати з області видимості виклику.

Усі функції мають приймати цілі числа як аргументи. Цілі числа також підходять для виконання побітових операцій в Elixir.

1. Створіть функцію додавання

Реалізуйте Secrets.secret_add/1. Вона має повернути функцію, яка приймає один аргумент і додає до нього аргумент, переданий у secret_add.

adder = Secrets.secret_add(3)
adder.(2)
# => 5

2. Створіть функцію віднімання

Реалізуйте Secrets.secret_subtract/1. Вона має повернути функцію, яка приймає один аргумент і віднімає від цього аргументу секрет, переданий у secret_subtract.

subtractor = Secrets.secret_subtract(2)
subtractor.(3)
# => 1

3. Створіть функцію множення

Реалізуйте Secrets.secret_multiply/1. Вона має повернути функцію, яка приймає один аргумент і множить його на секрет, переданий у secret_multiply.

multiplier = Secrets.secret_multiply(7)
multiplier.(3)
# => 21

4. Створіть функцію ділення

Реалізуйте Secrets.secret_divide/1. Вона має повернути функцію, яка приймає один аргумент і ділить його на секрет, переданий у secret_divide.

divider = Secrets.secret_divide(3)
divider.(32)
# => 10

Використайте цілочисельне ділення, щоб результат був сумісний із вхідними даними, які приймають інші функції.

5. Створіть функцію «and»

Реалізуйте Secrets.secret_and/1. Вона має повернути функцію, яка приймає один аргумент і виконує побітову операцію and над ним і секретом, переданим у secret_and.

ander = Secrets.secret_and(1)
ander.(2)
# => 0

6. Створіть функцію «xor»

Реалізуйте Secrets.secret_xor/1. Вона має повернути функцію, яка приймає один аргумент і виконує побітову операцію xor над ним і секретом, переданим у secret_xor.

xorer = Secrets.secret_xor(1)
xorer.(3)
# => 2

7. Створіть комбінатор функцій

Реалізуйте Secrets.secret_combine/2. Вона має повернути функцію, яка приймає один аргумент і застосовує до нього дві функції, передані в 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
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Elixir Exercism

Час розпочати Секрети?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.