Методичні вказівки
Загальні
рекомендації
Виконання
завдання передбачає обов’язкове
застосування функціоналів.
Використання
функціоналів корисно у наступних
випадках:
коли
потрібно виконати циклічні операції
над кожним елементом списку, застосовують
функціонали, які відображають;
коли
задача передбачає попередню підготовку
даних для обчислення, застосовують
аплікативні функціонали.
Таким
чином, при виконанні завдання спочатку
необхідно визначити функцію для обробки
одного елементу списку, а потім застосувати
цю функцію відносно всього списку за
допомогою функціонала.
При
розробці «фільтрів» (видалення будь-яких
атомів зі списку тощо) необхідно розробити
спочатку відповідну предикатну функцію.
У подальшому слід використати предикатну
функцію у складі лямбда-виразу у якості
функціонального аргументу для функціоналів
MAPCAN
або MAPCON
(див. приклад в табл. 3.4).
Приклад
виконання завдання
Завдання:
полічити кількість числових атомів у
списку.
Рішення:
Полічити
кількість числових атомів можна наступним
чином:
створити
список, в якому записується одиниця,
якщо атом числовий, і нуль – якщо атом
є символьним.
обчислити
суму елементів отриманого списку
Для
визначення числового атому можна
застосувати предикатну функцію NUMBERP.
Тоді, для перетворення атому запишемо
лямбда-вираз:
(lambda
(X) (if (numberp X) 1 0))
і
застосуємо його для кожного атому списку
за допомогою функціонала MAPCAR. Для
обчислення суми використаємо аплікативний
функціонал APPLY з функціональним аргументом
“+”:
(defun
CalcSum (Lst)
(apply
‘+ (mapcar ‘(lambda (X) (if (numberp X) 1 0)) Lst))
)
Очевидно,
що виклик функції
(CalcSum
‘(a 45 7 b d 9))
повертає
результат 3
Контрольні запитання:
Визначення
функціонального аргументу
Визначення
функціонала
Аплікативні
функціонали
Функціонали,
що відображають
Визначення
лексичного замикання
34