- •Какие из перечисленных функций языка Лисп являются функциями с побочными эффектами: print, list, car, setq, do?
- •Где целесообразно использовать рекурсивные функции?
- •Достоинства :
- •Чем отличаются атомы и символы?
- •Что такое чистый функциональный язык? Пример чистого и «нечистого» языка.
- •Как отразился на функциональных языках тот факт, что лямбда-исчисление было придумано математиком?
- •Бесконечные структуры данных: где возможно использовать.
- •Что такое предикат? Какие из перечисленных функций являются предикатами: atom, listp, list, car, append?
- •Что такое взаимная рекурсия?
- •Что называют функциями с побочными эффектами?
- •Чем отличаются s-выражения и списки?
- •Основные особенности лямбда-исчисления.
- •Смысл использования функций высшего порядка.
- •Где используются продолжения? Что делать с продолжением, если функция не возвращает значения (например, вывод данных)?
- •В каком случае используется несколько рекурсивных ветвей?
- •Что такое параллельная рекурсия?
- •Что такое функционал?
- •Что в Лиспе понимается под формой?
- •Где чисто функциональные программы хранят свое текущее состояние?
- •Недостатки рекурсии.
- •Почему функциональное программирование называется функциональным?
- •Что такое оптимизация хвостовой рекурсии?
- •Где оправдан карринг?
- •Что общего между функциональным и объектно-ориентированным программированием?
- •Что такое родительская область видимости?
- •Что называют псевдофункциями?
Что называют функциями с побочными эффектами?
Функции set и setq обладают и побочным эффектом. Эффект функции состоит в образовании связи между символом и его значением, а значением функции является связываемое значение. Символ остаётся связанным с определённым значением до тех пор, пока это значение не изменят. В Лиспе все действия возвращают некоторое значение. Значение имеется даже у таких действий, основное предназначение которых заключается в осуществлении побочного эффекта, таких, например, как связывание символа или вывод результатов на печать. Функции, обладающие побочным эффектом, в Лиспе называют псевдофункциями.
Чем отличаются s-выражения и списки?
Основу ЛИСПа составляют символьные выражения, которые называются S-выражениями и образуют область определения для функциональных программ.
S-выражение (Simbolic expresion) - основная структура данных в ЛИСПе.
(ДЖОН СМИТ 33 ГОДА) \
S-ВЫРАЖЕНИЯ
((МАША 21) (ВАСЯ 24) (ПЕТЯ 1)) /
S-выражение - это либо атом, либо список.
Основные особенности лямбда-исчисления.
Ля́мбда-исчисле́ние (λ-исчисление, лямбда-исчисление) — формальная система, разработанная американским математиком Алонзо Чёрчем, для формализации и анализа понятиявычислимости.
λ-исчисление может рассматриваться как семейство прототипных языков программирования. Их основная особенность состоит в том, что они являются языками высших порядков. Тем самым обеспечивается систематический подход к исследованию операторов, аргументами которых могут быть другие операторы, а значением также может быть оператор. Языки в этом семействе являются функциональными, поскольку они основаны на представлении о функции или операторе, включая функциональную аппликацию и функциональную абстракцию. λ-исчисление реализовано Джоном Маккарти в языке Лисп. Вначале реализация идеи λ-исчисления была весьма громоздкой. Но по мере развития Лисп-технологии (прошедшей этап аппаратной реализации в виде Лисп-машины) идеи получили ясную и четкую реализацию.
Смысл использования функций высшего порядка.
Одним из главных преимуществ LISP и других функциональных языков программирования является возможность определения функций, параметрами которых являются другие функции, а также функций, возвращающих функцию в качестве результата. Такие функции называются функциями высшего порядка (higher-order functions) и составляют важное средство реализации процедурной абстракции.
В то время как основной способ использования функций – это вызов их с указанием имени, существуют ситуации, когда было бы полезно рассматривать функции как данные. Например, вы можете передать одну функцию в качестве аргумента другой функции, вы можете написать общую функцию сортировки, и предоставить пользователю возможность указания функции для сравнения двух элементов. Так что один и тот же алгоритм может использоваться с разными функциями сравнения. Аналогично, обратные вызовы (callbacks) и FIXME hooks зависят от возможности хранения ссылок на исполняемый код, который можно выполнить позже. Поскольку функции уже являются стандартным способом представления частей кода, имеет смысл разрешить рассмотрение функций как данных.9)