globalf5-240972240972 (850810), страница 11
Текст из файла (страница 11)
ГородняяОсновы функционального программированияне требует ассоциаций или связывания. Поэтому и константытакого вида не нуждаются в префиксе в виде апострофа.Приведенное выше самоопределение Лисп-интерпретации являетсяконцептуальным минимумом,обеспечивающимпостепенностьвосприятия более сложных особенностей специфики функциональногопрограммирования, а также методов реализации языков и системпрограммирования, которые будут иллюстрироваться в дальнейшем.Они будут введены как расширения или уточнения чистого определенияуниверсальной функции.Предикаты и истинность в ЛиспеХотя формальное правило записи программ вычислений в виде Sвыражения предписывает, что константа Т — это (QUOTE T), былооговорено, что в системе всегда пишется Т.
Кроме того, NIL оказалсяудобнее, чем атом F, встречавшийся в начальных предложениях поЛиспу аналог значения FALSE. Программист может либо принять этоправило на веру, либо изучить следующие уточнения.В Лисп есть два атомных символа, которые представляют истину иложь, соответственно. Эти два атома — T и NIL. Данные символы —действительные значения всех предикатов в системе. Главная причинав удобстве кодирования. Во многих случаях достаточно отличатьпроизвольное значение от пустого списка. Если атомы T и F имеютзначение T и NIL, соответственно, то символы T и F в качествеконстантных предикатов могут работать, потому что:(eval-a T '((NIL . NIL)(T . T) (F .
NIL))) ; = T(eval-a NIL'((NIL . NIL)(T . T) (F . NIL))) ; = NIL(eval-a F '((NIL . NIL)(T . T) (F . NIL))) ; = NILФормы (QUOTE T) и (QUOTE NIL) будут также работать, потомучто:(EVAL (QUOTE T) ) ; = T(EVAL (QUOTE NIL) ) ; = NILНо64Л.В. ГородняяОсновы функционального программирования(EVAL (QUOTE F)NIL) ; = FЭто неправильно, отлично от NIL, и поэтому (QUOTE F) не будетработать как представление ложного значения в системе.Заметим, что(EVAL T ) ; = T(EVAL NIL ) ; = NIL(EVAL F) ; = NILбудет работать в силу причин, которые объясняются в лекции 6.Формального различия между функцией и предикатом в Лиспе несуществует.
Предикат может быть определен как функция со значениямилибо T либо NIL. Это верно для всех предикатов системы. Можноиспользовать форму, не являющуюся предикатом там, где требуетсяпредикат: предикатная позиция условного выражения или аргументлогической операции. Семантически любое S-выражение, отличное отNIL, будет рассматриваться в таком случае как истинное. Первоеследствие из этого — предикат NULL и логическое отрицание NOTидентичны.
Второе — то, что (QUOTE T) или (QUOTE Х)практически эквивалентны Т как константные предикаты.Предикат EQ ведет себя следующим образом:1. Если его аргументы различны, значением EQ является NIL.2. Если оба его аргументы являются одним и тем же атомом, тозначение — Т.3. Если значения одинаковы, но не атомы, то его значение T илиNIL в зависимости от того, идентично ли представлениеаргументов в памяти.4. Значение EQ всегда T или NIL. Оно никогда не бывает неопределено, даже если аргументы неправильные.Универсальная функция — это джин, выпущенный из бутылки, т.к.потенциал такой функции ограничен лишь способностями нашеговоображения. Пока рассмотрены лишь простейшие, самые очевидныеследствия из возможности явно применять и уточнять механизмы65Л.В. ГородняяОсновы функционального программированиясимвольного представления и определения функций, такие какиспользование накапливающих параметров, связывание обозначенийпо схеме знак-смысл в ассоциативном списке как имен переменных созначениями, так и названий функций с определениями, а такжеприменение вспомогательных функций для достижения прозрачностиопределений.
Эти возможности имеют место в любом языке высокогоуровня. Но попутно выполнено достаточно строгое построениесовершенно формальной математической системы, называемой"Элементарный ЛИСП". Составляющие этой формальной системыследующие:1. Множество символов, называемых S-выражениями.2. Система функциональных обозначений для основных понятий,необходимых при программировании обработки S-выражений.3. Формальное представление функциональных обозначений в видеS-выражений.4. Универсальная функция (записанная в виде S-выражения),интерпретирующаяобращениепроизвольнойфункции,записанной как S-выражение, к ее аргументам.5.
Система базовых функций, обеспечивающих техническуюподдержку обработки S-выражений, и специальных функций,обеспечивающих управление вычислениями.Более интересные и не столь очевидные следствия возникают прирасширенииэтойформальнойсистемы,чтоибудетпродемонстрировано в следующих лекциях.66Л.В. ГородняяОсновы функционального программированияОтображения и функционалыПрограммирование отображений и использование функционаловдемонстрируется как метод резкого повышения производительностипрограммирования и эффективности отладки программ.
Изучаетсямеханизм безымянных определений. Рассматриваются разные схемыотображений аргументов и формирования результатов на основеотображающих функций над компонентами структур данных иопределения различных функциональных схем переработки данных.Отображения структур данных и функционалыОтображения обычно используются при анализе и обработке данных,представляющих информацию разной природы.
Вычисление,кодирование, трансляция, распознавание - каждый из таких процессовиспользует исходное множество цифр, шаблонов, текстов,идентификаторов, по которым конкретная отображающая функциянаходит пронумерованный объект, строит закодированный текст,выделяет идентифицированный фрагмент, получает зашифрованноесообщение. Таким образом работает любое введение обозначений - отзнака происходит переход к его смыслу.Отображения - ключевой механизм информатики. Построение любойинформационнойсистемысопровождаетсяопределениемиреализацией большого числа отображений.
Сначала выбираютсяданные, с помощью которых представляется информация. В результатепо данным можно восстановить представленную ими информацию извлечь информацию из данных (по записи числа восстановить еговеличину). Потом конструируется набор структур, достаточный дляразмещения и обработки данных и программ в памяти компьютера (покоду команды можно выбрать хранимую в памяти подпрограмму,которая построит новые коды чисел или структур данных).Говорят, что отображение существует, если задана пара множеств иотображающая функция, для которой первое множество - областьопределения, а второе - область значения. При определенииотображений, прежде всего, должны быть ясны следующие вопросы:67Л.В.
ГородняяОсновы функционального программированиячто представляет собой отображающая функция ;как организовано данное, представляющее отображаемоемножество;каким способом выделяются элементы отображаемого множества,передаваемые в качестве аргументов отображающей функции.Это позволяет задать порядок перебора множества и метод передачиаргументов для вычисления отображающей функции. При обходеструктуры, представляющей множество, отображающая функция будетприменена к каждому элементу множества.Проще всего выработать структуру множества результатов, подобнуюисходной структуре.
Но возможно не все полученные результаты нужныили требуется собрать их в иную структуру, поэтому целесообразнопрояснить заранее еще ряд вопросов:где размещается множество полученных результатов;чем отличаются нужные результаты от полученных попутно;как строится итоговое данное из отобранных результатов.При функциональном стиле программирования ответ на каждый изтаких вопросов может быть дан в виде отдельной функции, причемроль каждой функции в схеме реализации отображения четкофиксирована. Схема реализации отображения может быть представленав виде определения, формальными параметрами которого являютсяобозначения функций, выполняющих эти роли. Такое определениеназывается "функционал".
Более точно, функционал может оперироватьфункциями в качестве аргументов или результатов.Функции, выполняющие конкретные роли, могут быть достаточнообщими, полезными при определении разных отображений, - ониполучают имена для многократного использования в разных системахопределений. Но могут быть и разовыми, нужными лишь в данномконкретном случае - тогда можно обойтись без их имен, использоватьопределение непосредственно в точке вызова функции.
Таким образом,определение отображения может быть разбито на части (функции ифункционалы ) разного назначения, типичного для многих схеминформационной обработки. Это позволяет упрощать отладку системопределений, повышать коэффициент повторного использования68Л.В. ГородняяОсновы функционального программированияотлаженных функций. Можно сказать, что отображения - эффективныймеханизм абстрагирования, моделирования, проектирования иформализациикрупномасштабнойобработкиинформации.Возможности отображений в информатике значительно шире, чемосвоено практическим программированием, но их применение требуетдополнительных пояснений, которые и являются предметом этойлекции.Числа и мультиоперацииЛюбую информацию можно представить в виде символьныхвыражений. В качестве основных видов символьных выраженийвыбраны списки и атомы.Атом - неделимое данное, представляющее информацию произвольнойприроды.Во многих случаях знание природы информации дает более четкоепонимание особенностей изучаемых механизмов.
Программированиеработы с числами и строками - привычная, хорошо освоенная областьинформационной обработки, удобная для оценки преимуществиспользования функционалов. Опуская технические подробности,просто отметим, что числа и строки рассматриваются каксамоопределимые атомы, смысл которых не требует никакогоассоциирования, он понятен просто по виду записи.Например, натуральные числа записываются без особенностей и могутбыть почти произвольной длины:11239876543210000000000000123456789Можно работать с дробными и вещественными числами:2/33.1415926Строки заключаются в обычные двойные кавычки: "строка любой69Л.В.














