Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 154
Текст из файла (страница 154)
Результатом функции ОЕт является значение последнего выражения, принадлежащего телу функции. Следующий пример иллюстрирует использование функции ЕЕТ: (ОЕГ1(4Е (с(оаогасз гостя а Ь с) (1.ЕТ ( (гоос рагс очег 2а (/ (ЯОВТ (- (* Ь Ь (* 4 а с))) (* 2 а))) (ж1пця Ь очег 2а (/ (- О Ь) (* 2 а))) ) (О1ЯРЕАт' (+ ж1пця Ь очег 2а гооС рагС очег 2а) ) ~ ТНЕ) (О1ЯР' АУ (-ж1пця Ь очег 2а гооС раг. очег 2а)) ) Функция О1яРОАТ вполне подходит для использования в функции суэас(гасас гоося, поскольку мы хотим, чтобы эта функция выводила свои два результата. Функция ОЕТ создает новую локатьную статическую область видимости почти тем же способом, что и оператор с(ес1аге в языке Ада. Именованные компоненты функции ОЕТ аналогичны операторам присваивания.
но их можно использовать только в новой области видимости функции ЕЕТ. Более того, их нельзя связать с новыми значениями в функции 1,ЕТ. Слово ОЕТ в действительности является простым сокращением ОА(ЧВОА-выражения. Следующие два выражения эквивалентны: (ЕЕТ (а1рЬа 7) (* 5 а1рЬа)) ((1ЛМВОА (а1рЬа) (' 5 а1рЬа)) 7) В первом выражении число 7 связывается с переменной а1рца: во втором — число 7 связывается с переменной а1рпа через параметр ЫИВОА-выражения.
599 ) 4.5. Введение в язык Бс)зеве 14.$.6. Функциональные формы В этом разделе описываются две распространенные математические функциональные формы, предусмотренные в языке Яспегле, а именно: композиция и применить-ко-всем. 14.5.6. 1. Комлозиция функций Композиция функций — единственная функциональная форма, предусмотренная в исходном варианте языка Е!ЯР, Все последующие диалекты языка (.15Р, включая язык Ясйеше. также содержат ее. К композиции функций, по существу, сводится работа функции ЕЧАР. Все списки, не заключенные в кавычки.
интерпретируются как вызовы функций, требующие, чтобы их параметры вычислялись первыми. Это правило рекурсивно применяется к наименьшему списку в любом выражении и представляет собой именно то, что означает композиция функций. Композиция функций иллюстрируется следующим примером; САК (СРК ' (А В С) ) ) возвращает ( С ) (САК (САК '((А В) В С))) возвращает А (СРК (САК '((А В С) Р))) возвращает (В С) ()4РРЬ? (САК '(() В С))) возвращает ()Т (СО(ЧЯ (САК ' (А В) ) (СРК ' (А В) ) ) возвращает (А В) Заметим. что имена функций во внутренних вызовах не заключены в кавычки, поскольку они должны вычисляться, а не обрабатываться как литеральные данные.
14.5.6.2. Функциональная форма лримвните-ко-ясвм Наиболее распространенными функциональными формами, предусмотренными в популярных функциональных языках. являются вариации математических функциональных форм применить-ко-всем. Простейшей из них является форма варсаг, которая имеет два параметра — функцию и список. Форма варсаг применяет заданную функцию к каждому элементу заданного списка н возвращает список результатов этих применений. Определение функции варсаг на языке Яспеше приведено ниже: (РЕЕ1НЕ (варсаг бцп 11я) (СОБР (()401.1? 1зя) '()) (ЕРЯЕ (СОВЯ (1цп (САК 1гя)) (варсаг бцп [СРК 11я)))) )) Отметим простую форму функции варсаг, выражающей сложную функциональную форму.
Это является следствием большой выразительной силы языка Ясеневе. В качестве примера использования функции варсаг предположим, что мы хотим возвести в куб все элементы некоторого списка. Мы можем сделать это следующим образом: парса (МАЛЯРА (пцв) (* пав пив пцв)) '(3 4 2 6)) Эта функция вернет в качестверезультатаспнсок (27 64 8 216). Заметим, что в этом примере первый параметр функции варсаг является РАИВРА- выражением.
Когда функция ВАР вычисляет это ЬАИВРА-выражение, она создает функцию. имеющую ту же форму. что и любая встроенная функция, за исключением того, что новая функция будет безымянной. В приведенном выше выражении эта безымянная функция немедленно применяется к каждому элементу списка, являющегося параметром. а результат возвращает в виде списка. Глава 14. Функциональные языки программирования 14.5.У. Функции ддзи создании кода Тот фалт. что программы и данные имеют одинаковую структуру, используется при создании программ. Поскольку пользовательские программы вызывают функцию ЕуАЬ, они могут создавать другие программы и немедленно выполнять их. Олин из простейших примеров этого процесса касается числовых атомов.
Большинство систем языка Яслеше имеют функцию для числового атома с именем +, получаюшего любое количество числовых атомов в качестве аргументов и возврашаюшего их сумму. Например, (+ 3 7 10 2) возврашает 22. Наша задача состоит в следуюшелс предположим, что в программе есть список числовых атомов и нужно вычислить их сумму. Мы не можем применить функцию ь непосрелственно к списку, поскольку функция + может получать только атомарные параметры. а ие список числовых атомов.
Функция. которая повторно добавляет первый элемент списка к сумме элементов его остальной части с помошью функций САЕ и СРА. используя рекурсию для перемещения по списку. приведена ниже: РЕГ1)(Е (асЫег 11я) (СОБР (()ЧРЬЬ? 11я) О) (ЕЬЯЕ (+ САН 11я) (асЫег (СРА 11Я)))) )) Альтернативное решение задачи состоит в написании функции, которая строит вызов функции + с параметрами, представленными в подходящей форме. Это можно слелать, используя функцию СО))5 для вставки атома + в список чисел.
Новый список можно передать функции ЕЧАЬ для выполнения вычислений. как показано ниже: (РЕГ1ИЕ (асЫег 11я) (СО))Р ( (ХРЬЬ? 11я) О) (ЕЬЯЕ (ЕЧАЬ (СОНЯ '+11я))) )) Заметим, что перел именем функции "плюс" стоит кавычка, которая предотвращает ее вычисление функцией ЕЧАЬ при вычислении функции СО)ЧЯ. Рассмотрим вызов функции асЫе г: (асЫег '*3 4 б) ) Он заставляет зту функцию создать список (+ 3 4 б) затем этот список передается функции е((Аь, вызываюшей функцию ь и возврашаюшей результат 1 3. Во всех ранних версиях языка Ясйете функция Е~ГАЬ вычисляет выражения в самой внешней области видимости программы.
В современной версии языка Яс)зеше— Яй)зете 4 — для функции ЕУАЬ требуется второй параметр, указываюший область видимости, в которой должно быть вычислено выражение. Для простоты мы оставили параметр, указывающий область видимости, за рамками нашего примера и не рассматриваем область видимости имен. 14.5. Введение в язык бс)зеве 601 14.5.8. Императивные свойства языка Зсйепзе Язык Ясйеше, полобно другим современным диалектам языка Е15Р, обладает несколькими свойствами, взятыми от императивных языков.
Например, имена могут связываться со значениями, и эти связи в дальнейшем могут изменяться. Это делается с помощью функции БЕТ .', как показано в слелуюшем примере: (БЕ ! Р1 3. 141593 ) Функция ЯЕТ! возврашает значение, которое она связывает с именем. В функциональной версии языка ЫЯР списки не могут изменяться. Они обрабатываются по частям с помощью функций САК и СРК, но заданный список остается неизменным.
Для изменения списка может понадобиться свойство императивного языка — побочный эффект вызова функции. Язык Бсйеше имеет две функции, создающие такие побочные эффекты, а именно: ЯЕТ-САВ! и БЕТ-СРВ! . Рассмотрим следуюшие примеры: (РЕГ1(ЧЕ РБТ (11ЯТ 'А 'В) ) (ЯЕТ-САР! 1аг 'С) (ЯЕТ-СРВ! Рвс '(Р)) Функция БЕт-САВ! изменяет список, связанный с именем 1вг, с (А В) на (с Р).
Функция ЯБТ-СРВ! изменяетсписок,связанный с именем 1вг, с (С В) на (с Р). Императивные свойства языка Яспеше, описанные выше, были внесены в него для повышения эффективности, однако отклонение от функционального программирования также имеет свою цену. Программы становится труднее отлаживать и эксплуатировать из-за возможного совмешения имен и побочных эффектов, позволяюших идентичным вызовам функций давать разные результаты в разное время.
Рассмотрим следуюший фрагмент кода: (РЕГ1(ЧЕ соцпс О) (РЕГ1г)Е (1пс соцпс пцмЬег) (яЕТ! соипс (ч соипг пивЬег)) ) Хотя следующие два вызова функции дпс соцпг совершенно идентичны, они приводят к разным результатам: (Тпс соцпс 1) 0 (зпс соцпс 1) 1 1Я.б. Язык СОНМОМ $Я$Р Язык СОММОЙ Е(ЯР (5(ее!е, 1984) был призван объединить свойства нескольких диалектов языка ЫЯР, созданных в начале 1980-х годов, включая язык Бслеве, в единый язык. Будучи комбинацией этих свойств, язык СОММОН ЫЯР довольно велик и сложен. Его основа, однако, — это исходный язык ЫЯР, так что синтаксис, элементарные функции и природа унаследованы от него. Поняв, что иногда динамический обзор данных придает программе гибкость, а также оценив простоту статического обзора данных, разработчики языка СОММОЙ ЫЯР ре- Глава 14.
Функциональиыв языки программирования шили позволить применение обоих зтих способов. По умолчанию область видимости переменной является статической. но с помощью обаявления переменной в качестве "специальной" ее можно сделать динамической. Список свойств языка СОММОХ Ь)ЯР велик: большое количество типов и структур данных, включая записи. массивы, комплексные числа и символьные строки; мощные операции ввода и вывода; пакеты лля обаелинения в модули наборов функций и данных, а также управление доступом; императивные свойства языка Яспеше — особенно функции, аналогичные функциям ЯЕТ-САК! и ЯЕТ-СОК! . Язык СОММОН Ь)ЯР и большинство лиалектов языка ЫЯР, за исключением языка Ясйеше, содержат функцию РКОС, позволяющую упорядочивать последовательность выполнения операторов, как зто принято в императивных языках.