Рекурсивные функции и структуры данных
Система программирования может быть задана как правило интерпретации или компиляции программ.
Определение 1.6
Система программирования – это комплекс средств и методов, используемых при подготовке и применении программ на одном или нескольких языках программирования.
Список из функции и перечня ее аргументов называется "форма" - синоним термина "выражение". Программа – это последовательность вычисляемых форм. Рекурсия – сведение к себе – позволяет такие правила записывать достаточно лаконично и ясно. Стек обеспечивает работу с рекурсивными функциями.
Определение 1.7
Стек - набор данных, в котором элементы обрабатываются согласно дисциплине "Первым пришел – последним ушел." (англ. Stack - пачка, стопка)
Повторное распределение памяти с помощью специального механизма "Сборка мусора" делает такую работу достаточно простой и надежной. Сложившийся на базе Лиспа стиль программирования называют функциональным.
Правило интерпретации использует ассоциативный список – таблицу для связывания обозначений с их определениями. При таком подходе переменные отличаются от констант лишь частотой изменения связи между именем и соответствующим ему данным.
Определение 1.8
Переменная – именованная часть памяти, предназначенная для многократного доступа к изменяющимся данным.
Определение 1.9
Константа – именованная часть памяти, предназначенная для многократного доступа к фиксированным, не изменяющимся данным.
Типы данных в Лиспе включены в представление значений. Поэтому при вычислении они всегда известны и могут быть проверены в любой момент.
Определение 1.10
Тип данных – множество данных с соответствующим ему набором допустимых операций.
В языках программирования, ориентированных на компиляцию, принято переменные классифицировать по типам данных, а значения в памяти хранить без информации о типе данных.
Функционирует Лисп-система с учетом комплекта встроенных определений атомов. Программа может влиять на этот комплект и формировать специализированные версии системы.
Термины "Ассоциативный список", "Атом", "Сборка мусора", "Свойства атома", "Список", "Символьные выражения", "S-выражения", "Форма", "Функциональное программирование" еще будут пояснены по ходу курса.
Элегантный лаконизм рекурсии может скрывать нелегкий путь. А.П.Ершов в предисловии к книге П.Хендерсона [2] привел поучительный пример задачи о рекурсивной формуле, сводящей вычитание единицы из натурального числа к прибавлению единицы:
{1 –1 = 0 ; ( n +1 ) -1 = n } ,
не поддавшейся А.Чёрчу и решенной С.Клини лишь в 1932 году:
Пример 1.11Запись с помощью алгоритмической нотации школьного курса информатики
{ F (x, y, z) = если (x = 1) то 0 иначе если ((y +1) = x) то z иначе F (x, y +1, z +1) ; n –1 = F (n, 0, 0) } алг F ( цел x, y, z) арг x, y, z нач если (x = 1) то знач := 0 инес (y +1) /= x то знач := F (x, y +1, z +1) кон алг N-1 (цел N) арг N нач знач := F (N, 0, 0) кон
Решение получилось через введение формально усложненной вспомогательной функции с накопительными аргументами, что противоречит интуитивному стремлению к монотонности движения от простого к сложному.
Техника работы с функциями получает логическое завершение на уровне определения функций высших порядков, удобных для синтаксически управляемого конструирования программ на основе спецификаций, типов данных, визуальных диаграмм, формул и т.п. Программы на Лиспе могут выполнять роль спецификации обычных итеративно-императивных программ, что сближает технику программирования на Лиспе с общепризнанным теперь объектно-ориентированным программированием.
Лисп появился как язык символьной обработки информации. К середине семидесятых годов на Лиспе решались наиболее сложные в практике программирования задачи из области дискретной и вычислительной математики, экспериментального программирования, лингвистики, химии, биологии, медицины и инженерного проектирования. На Лиспе реализована система AutoCAD - автоматизация инженерных расчетов, дизайна и комплектации изделий из доступных элементов, и Emacs – весьма популярный текстовый редактор в мире UNIX/Linux.