Библиотека сайта rus-linux.net
Lisp: Слезы радости, часть 10
Оригинал: "Lisp: Tears of Joy, Part 10 "Автор: Vivek Shangari
Дата публикации: March 29, 2012
Перевод: Н.Ромоданов
Дата публикации перевода: 29 октября 2012 г.
Первую статью серии читайте здесь.
Предыдущую статью серии читайте здесь.
Язык Lisp был оценен, как самый мощный язык программирования в мире. Но только очень небольшой процент самых элитных программистов пользуются им из-за его загадочного синтаксиса и его академической репутации. Это весьма печально, поскольку Lisp не так уж и трудно понять. Если вы хотите быть в числе избранных, то эти статьи для вас. Это десятая и последняя статья в серии, которая началась в июне 2011 года.
Еще в 80-х годах прошлого столетия, когда программа СОИ Рейгана (Стратегическая оборонная инициатива) была в полном разгаре, был анекдот, что кто-то украл исходный код на языке Lisp программы перехвата ракет и, чтобы доказать это, показал последнюю страницу кода ...
В нашем стремлении к высшим знаниям мы, прочитав последние девять статей из серии статей о языке Lisp, продвинулись достаточно далеко с тем, чтобы LISP перестал раздражать большим количеством скобок (я знаю, странно!). В эпилоге, давайте вкратце подведем итоги, почему изучение кода на языке Lisp может оказаться важным в вашей жизни.
Преимущество функционального программирования на языке Lisp
Функциональное программирование это искусство написания программ, которые работают при помощи возврата значений, а не при помощи преобразования сущностей. Также функциональное программирование позволяет вам создавать сказочно мощные и очень эффективные абстрактные программы - это математический подход к программированию.
В математике, по крайней мере, в последние 400 лет, функции играют очень важную роль. Функции выражают связь между параметрами ("вход") и результатом ("выход") некоторых процессов. В каждом вычислений, результат, в определенной степени, зависит от параметров вычисления.
Поэтому функция является хорошим способом задания вычислений. Это является базисом функционального стиля программирования. "Программа" состоит из определения одной или нескольких функций. Когда программа "выполняется", в функцию передаются параметры и она должна вычислять результат.
Написание кода в функциональном стиле гарантирует, что функция делает только одну вещь (возвращает значение), и зависит от одной сущности (параметры, передаваемые ей). Это позволяет вам контролировать побочные эффекты. Тем не менее, для того, чтобы программа могла на самом деле что-то делать, почти всегда необходимы некоторые побочные эффекты. Это означает, что вы не сможете написать полезную программу, код которой был бы полностью написан в функциональном стиле.
В статье 8, где мы говорили о CLOS, я привел оценку Джеймса Гааге (James Hague), функционального программирования, где тот утверждает, что "на 100 процентов чистое функциональное программирование не работает. Даже на 98 процентов чистое функциональное программирование не работает. Но если сдвинуть ползунок, находящийся между функциональной чистотой и императивным беспорядочным программированием в стиле BASIC времен 1980-х годов, еще вниз на несколько позиций, скажем, до 85 процентов, то это действительно работает. Вы получаете все преимущества функционального программирования, но без крайних умственных усилий и невозможности осуществлять поддержку, которая возникает в случаях, когда вы ближе и ближе приближаетесь к совершенно чистому подходу".
Макросы
Макросы, возможно, являются самой важной причиной, почему пользователи языка Lisp мирятся со всеми этими раздражающими скобками в своем коде. Именно эти скобки позволяют иметь в Lisp-е такую мощную систему макросов. Пол Грэм (Paul Graham), который почти является "миссионером языка Lisp", указывает, что код на Lisp-е состоит из объектов данных Lisp-а. И совсем не банален тот факт, что исходные файлы содержат символы и строки, которые являются одним из типов данных, поддерживаемых языком. Код на языке Lisp, после того, как его прочитает анализатор, состоит из структур данных, с которыми вы можете дальше работать.
Если вы понимаете, как работают компиляторы, вам ясно, что благодаря тому, что Lisp имеет такой странный синтаксис (везде круглые скобки!), на самом деле требуется сделать не так много в сравнении с тем, если бы в Lisp-е использовался другой синтаксис. Вы пишете программы в деревьях разбора, которые генерируются компилятором когда происходит синтаксический разбор других языков, - но эти деревья разбора полностью доступны для ваших программ; вы можете писать программы, которые управляют ими. В Lisp-е эти программы называются макросами. Это программы, которые пишут программы.
Лучшее средство для выражения рекурсии
Рекурсия является актом определения объекта или решения задачи в их собственных терминах. При правильном использовании рекурсия является мощным методом решения проблем как в искусственных областях, например, в математике и программировании, так и в реальной жизни.
"Сила рекурсии, несомненно, заключается в возможности определения бесконечного множества объектов при помощи конечного выражения. Таким же самым образом, бесконечное количество вычислений можно описать конечной рекурсивной программой, даже если в этой программе нет явных повторений", - пишет Никлаус Вирт (Niklaus Wirth) в своей книге «Алгоритмы + Структуры данных = Программы» (1976 год).
Lisp является лучшим языком программирования для решения проблем, связанных с рекурсией. Даниэль Фридман (Daniel P. Friedman ) и Маттиас Фелейсен (Matthias Felleisen) показали это на примере языка Lisp в своей книге The Little Lisper. Lisp является по сути символьным языком – программистам не требуется выполнять отображение с их собственного родного языка в представления, воспринимаемые компьютером. Рекурсия является естественным вычислительным механизмом языка Lisp; основной деятельностью при программировании является создание (потенциально) рекурсивных определений.
Что дальше?
Есть еще много причин, почему следует попробовать язык Lisp. Кроме упомянутых выше, я в моих предыдущих статьях рассмотрел еще несколько причин. Эта серия статей была моей маленькой попыткой проповедовать язык Lisp и посеять семена любопытства у тех, кто ищет лучшей жизни в мире умственного программирования. Если семена попали на благодатную почву и вы хотели бы дополнительно что-нибудь узнать, не стесняйтесь обращаться ко мне, оставив комментарий, задав возникший у вас вопрос, или если вам нужны ссылки на ресурсы, которые помогут вашему исследованию самого мощного в мире языка программирования.
Удачи в использовании языка Lisp!
Ссылка
Wirth, Niklaus (1976), Algorithms + Data Structures = Programs, Prentice-Hall
Перевод на русский язык: Никлаус Вирт, "Алгоритмы + структуры данных = программы", Пер. с англ., 406 с., М.Мир, 1985