- •Какие из перечисленных функций языка Лисп являются функциями с побочными эффектами: print, list, car, setq, do?
- •Где целесообразно использовать рекурсивные функции?
- •Достоинства :
- •Чем отличаются атомы и символы?
- •Что такое чистый функциональный язык? Пример чистого и «нечистого» языка.
- •Как отразился на функциональных языках тот факт, что лямбда-исчисление было придумано математиком?
- •Бесконечные структуры данных: где возможно использовать.
- •Что такое предикат? Какие из перечисленных функций являются предикатами: atom, listp, list, car, append?
- •Что такое взаимная рекурсия?
- •Что называют функциями с побочными эффектами?
- •Чем отличаются s-выражения и списки?
- •Основные особенности лямбда-исчисления.
- •Смысл использования функций высшего порядка.
- •Где используются продолжения? Что делать с продолжением, если функция не возвращает значения (например, вывод данных)?
- •В каком случае используется несколько рекурсивных ветвей?
- •Что такое параллельная рекурсия?
- •Что такое функционал?
- •Что в Лиспе понимается под формой?
- •Где чисто функциональные программы хранят свое текущее состояние?
- •Недостатки рекурсии.
- •Почему функциональное программирование называется функциональным?
- •Что такое оптимизация хвостовой рекурсии?
- •Где оправдан карринг?
- •Что общего между функциональным и объектно-ориентированным программированием?
- •Что такое родительская область видимости?
- •Что называют псевдофункциями?
Какие из перечисленных функций языка Лисп являются функциями с побочными эффектами: print, list, car, setq, do?
Функции set и setq обладают и побочным эффектом. Эффект функции состоит в образовании связи между символом и его значением, а значением функции является связываемое значение. Символ остаётся связанным с определённым значением до тех пор, пока это значение не изменят. В Лиспе все действия возвращают некоторое значение. Значение имеется даже у таких действий, основное предназначение которых заключается в осуществлении побочного эффекта, таких, например, как связывание символа или вывод результатов на печать. Функции, обладающие побочным эффектом, в Лиспе называют псевдофункциями.
Функции с побочным эффектом это те, у которых кроме значения функции есть побочный эффект. Например, print - печать значения аргумента(значение функции - значение ее аргумента), setq - образовании связи между атомом и его значением. (такие функции называются еще псевдофункциями)
Где целесообразно использовать рекурсивные функции?
Функция является рекурсивной, если в ее определении содержится вызов самой этой функции. Рекурсия основной и самый эффективный способ организации повторяющихся вычислений в функциональном программировании и в лиспе.
Предположим, что необходимо написать функцию sumall, которая имеет один аргумент, целое положительное число и возвращает сумму всех целых чисел между нулем и этим числом.
Например (sumall 9) должно вернуть 45
Это можно решить циклически; мы решим рекурсивно.
Отметим два факта: 1. Если n=0, сумма чисел между 0 и n равна 0. 2. Если n>0, сумма чисел между 0 и n равна n плюс сумма чисел между 0 и n-1.
Эти два факта переводятся непосредственно в определение функции:
(defun sumall (n) (cond ((zerop n) 0) (t (+ n (sumall (- n 1)))))) |
Производится проверка n : равно нулю или нет. Если значение n=0, то функция возвращает 0 . В противном случае , функция вызывает сама себя для вычисления суммы чисел между 0 и n-1 и и добавляет n к этой сумме.
Что такое префиксная и инфиксная форма записи, какая форма записи выражений используется в Лиспе?
Существуют три вида записи выражений. Инфиксная форма, в которой оператор расположен между операндами ("а + b");
Постфиксная форма, в которой оператор расположен после операндов ("а b + "); Данный тип записи называется обратной польской натацией.
Префиксная форма, в которой оператор расположен перед операндами ("+ а b"). Данный тип записи называется польской натацией.
В Лиспе для записи арифметических выражений и функций используется единая префиксная форма записи, в которой имя функции или действия стоит перед аргументами и записывается внутри скобок.
( + x y ) ( - x y ) ( * x ( + x z ) )
Достоинства :
упрощается синтаксческий анализ выражений, так как по первому символу текущего выражения система уже знает, с какой структурой имеет дело.
появляется возможность записывать функции в виде списков, т.е. данные (списки) и программа (списки) представляются единым образом.
Чем отличаются атомы и символы?