У Elixir функції є обʼєктами першого класу. Це означає, що:
На відміну від іменованих функцій, анонімні функції не мають статичного посилання, за яким до них можна звернутися: вони доступні лише тоді, коли їх присвоєно змінній або викликано одразу.
Анонімні функції можуть знадобитися, щоб:
Анонімні функції починаються із зарезервованого слова fn, аргументи відокремлюються від тіла функції токеном ->, а завершуються словом end. Як і в іменованих функціях, останній вираз функції неявно повертається до функції, що її викликала.
Щоб викликати посилання на функцію, потрібно поставити . між змінною з посиланням і списком аргументів:
function_variable = fn param ->
param + 1
end
function_variable.(1)
# => 2
Можна навіть скористатися скороченим синтаксисом захоплення, щоб записати це стисліше:
variable = &(&1 + 1)
variable.(1)
# => 2
Elixir підтримує багато функцій для роботи з бітами, зібраних у модулі Bitwise.
band/2: побітове ANDbsl/2: побітовий зсув влівоbsr/2: побітовий зсув вправоbxor/2: побітове XORbor/2: побітове ORbnot/1: побітове NOTОсь приклад використання побітової функції:
Bitwise.bsl(1, 3)
# => 8
Усі побітові функції працюють лише з цілими числами.
Якщо використовується Elixir версії 1.9 або старішої, потрібно викликати require Bitwise на початку визначення модуля, щоб мати змогу користуватися модулем Bitwise.
У цій вправі нам доручено написати програмне забезпечення для пристрою шифрування, який виконує перетворення над даними. Нам потрібен спосіб гнучко створювати складні функції, поєднуючи простіші функції.
Для кожного завдання поверніть анонімну функцію, яку можна викликати з області видимості виклику.
Усі функції мають приймати цілі числа як аргументи. Цілі числа також підходять для виконання побітових операцій в Elixir.
Реалізуйте Secrets.secret_add/1. Вона має повернути функцію, яка приймає один аргумент і додає до нього аргумент, переданий у secret_add.
adder = Secrets.secret_add(3)
adder.(2)
# => 5
Реалізуйте Secrets.secret_subtract/1. Вона має повернути функцію, яка приймає один аргумент і віднімає від цього аргументу секрет, переданий у secret_subtract.
subtractor = Secrets.secret_subtract(2)
subtractor.(3)
# => 1
Реалізуйте Secrets.secret_multiply/1. Вона має повернути функцію, яка приймає один аргумент і множить його на секрет, переданий у secret_multiply.
multiplier = Secrets.secret_multiply(7)
multiplier.(3)
# => 21
Реалізуйте Secrets.secret_divide/1. Вона має повернути функцію, яка приймає один аргумент і ділить його на секрет, переданий у secret_divide.
divider = Secrets.secret_divide(3)
divider.(32)
# => 10
Використайте цілочисельне ділення, щоб результат був сумісний із вхідними даними, які приймають інші функції.
Реалізуйте Secrets.secret_and/1. Вона має повернути функцію, яка приймає один аргумент і виконує побітову операцію and над ним і секретом, переданим у secret_and.
ander = Secrets.secret_and(1)
ander.(2)
# => 0
Реалізуйте Secrets.secret_xor/1. Вона має повернути функцію, яка приймає один аргумент і виконує побітову операцію xor над ним і секретом, переданим у secret_xor.
xorer = Secrets.secret_xor(1)
xorer.(3)
# => 2
Реалізуйте 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
Зареєструйтеся на Exercism, щоб вивчати й опановувати Elixir, а також 58 концепцій168 вправ та справжнє наставництво від людей, і все це безкоштовно.