Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 155
Текст из файла (страница 155)
Метки и две функции, 60 и КЕТОк)(, были включены в язык лля управления циклами. Функция 60 используется для передачи управления на метку внутри области видимости функции РКОС. Функция КЕТОКИ осуществляет выхол из функции РКОС. Функция РКОС имеет следующий общий вид: (РКОС (локальные переменные) выражение 1 выражение п Локальные переменные инициализируются нулевым указателем н1ь, принадлежат области видимости функции РКОС и существуют только во время ее выполнения. Если в функции РКОС есть глобальные имена, совпадающие с локальными, то глобальные имена маскируются (и становятся скрытыми).
Функция 60 передает управление своему параметру, являющемуся меткой внутри списка выражений функции РКОС. Функция КЕТСК)( имеет параметр, который становится значением, возвращаемым функцией РКОС. Заметим, что функция РК06 включена в современные версии языка Ь)ЯР только для обратной совместимости со старыми диалектами. Язык СОММОЗЧ ЫЯР имеет более удачные конструкции лля обеспечения возможностей функции РКОС. Например, в языке СОММОЯ Ь)ЯР есть конструкции 0011)(ЕЯ и 00ЬТЯТ для выполнения циклов, а также РК061, РК062 и РКОСЗ для создания последовательностей операторов.
Функция яетО в языке СОММОМ Ь!ЯР соответствует функции яет. языка Яспегпе, а функция 0еГС)ч является версией функции ОеГ1ие. Рассмотрим следующую итеративную версию функции лля определения приналлежности атома заданному списку. После итеративной версии приводится рекурсивная версия, аналогичная описанной в разделе 14.5.5, (0ЕГОХ Ьгегастче жеглЬег (асж 1яс) (РРОС () 1оор 1 (СОХО ((ИОЬЬ 1яс) (КЕТУК(Ч (Ч1Ь)) ((ЕООАЬ асж (САК 1яс)) (КЕТСК(Ч Т)) ) (ЯетО 1яг (с0к 1яг)) (СОТО 1оор 1) )) 6ОЗ 14.6. Язык СОММОг( ПЗР (0ЕГОИ гесигя1те телег (аст 1яс) (СОН0 (( НОЬ) 1яс) Х10) ((ЕОУА0 асв (САК 1яг)) Т) (Т (гесигязте метЬег аси(СОВ 1яс))) )) Заметим, что Т является в языке СОММОХ (.)БР версией булевского значения "истина", г)10 — это булевское значение 'ложь", АТОМ вЂ” предикат, определяющий, является лн параметр атомом, а нулевой список рассматривается н как список, и как атом. Рассмотрим итеративную н рекурсивную функции, вычисляющие длину списка: (0ЕГОИ Тсегасзте 1епдсЬ (1яс) (ГАРО (яилз) (ЕЕТО яив О) адайп ( СО'г) 0 ((АТОМ 1яс (КЕТОАИ яим))) ) (ЕЕТО яиш (ч 1 яиц) ) (ВЕТО 1яг (СРП 1яг)) (60 адаап) )) (0ЕГОИ гесигя1ие 1епдсп (1яс) (СОЛО ((И001 1яс) О) (Т (+ 1 (гесигяате 1епдгп (СОК 1яс)))) ) ) В некотором смысле языки Ызете и СОММОХ 1ЛЕР противоположны друг другу.
Язык Бсйеюе намного меньше по размерам и немного яснее, частично благодаря тому, что он использует исключительно статические области видимости. Язык СОММОХ (.(БР предназначался для коммерческого использования н впоследствии получил широкое распространение в приложениях, связанных с созданием искусственного интеллекта. Язык Бенете чаще используется в университетских курсах по функциональному програмлшрованию. Он также подходит лля изучения функционального программирования нз-за своих относительно малых размеров. Важным критерием при разработке языка СОММОМ (.)БР, сделавшим его очень большим по размеру, было желание совместить его с более ранними диалектами языка (.)ЕР.
14.7. Язык МЕ Язык М1. (Мйпег е( а)., 1990) — это функциональный язык программирования, использующий статический обзор данных, подобно языку Бс)зеше. Он значительно отличается от языка (.)БР и его диалектов, включая Бспеве. М). использует синтаксис, который более похож на синтаксис языка Разов!, чем на Е!БР. Язык МЬ содержнт объявления типов, использующие вывод типов. Это означает, что переменные не обязательно объявлять, и прн этом онн будут иметь строго определенный тип.
Тнп каждой переменной н выражения можно определить во время компиляции. Это совершенно отличается от язы- Глава 14. Функциональные языки программирования ка Бенеше, по сушеству. не имеюшего типов. Язык МЕ позволяет обрабатывать исключительные ситуации и объединять абстрактные типы данных в молули. Краткая история развития и основные свойства языка МЕ описаны в главе 2. В главе 4 рассмотрена идея вывода типов на примере языка МЕ. В языке МЕ имена могут связываться со значениями операторов объявления следующим образом: ча1 новое имя = выражение; Например: ча1 бфвгапое = г1ие * вреес(г Не подумайте.
что этот оператор в точности совпадает с оператором присваивания в императивных языках. Оператор ча1 связывает имя со значением, но в дальнейшем зто имя не может быть связано с новым значением. (Хотя в некотором смысле все-таки может.) Если мы свяжем имя с помошью второго оператора ча1, это создаст новый элемент в программной среде, который никак не связан с предыдущей версией этого имени. В действительности, его тип не обязан быть прежним. Операторы ча1 не имеют побочных эффектов. Они просто добавляют имя в текущую программную среду и связывают его с неким значением так, как это делала специальная форма дат в языке ЫБР.
Обычно операторы ча1 используются в выражениях 1ек, имеюших следующий обший вид: 1ек ча1 новое имя = выражения 1 1п выражение 2 вжй Например: 1ве ча1 р1 = 3.14159 дп рф * гас)1цв * гас(фцв аг В языке М(. есть списки и операции для работы со списками, хотя они выглядят иначе, чем в языке (.!БР. Язык МЕ также содержит перечислимые типы, массивы и кортежи, являющиеся записями. Объявление функции в языке МЕ имеет следуюший вид: гип имя функции (формальные параметры) = выражение; Например: гамп вс(ваге (х: 1пс) = х * х; Заметим, что объявление Еип вяцаге (х) = х * х; является неправильным, поскольку в этом случае компилятор не может определить тип переменной х. Так что функции, использующие арифметические операции, не могут быть полиморфными.
То же относится и к функциям, использующим операции сравнения, за исключением операций - и <>, а талже булевских операций. Однако функции, использующие только операции работы со списками =, <> и операции работы с кортежами (для создания кортежей и выбора компонентов), могут быть полиморфными.
14.7. Язык Мл Конструкции ветвления потока управления в языке МЕ в действительности представляют собой условное выражение следующего вида: 1й Е сЬеп то выражение е1ве иначе выражение Выражение Е должно вычислять булевское значение. Из двух следующих за ним выражений вычисляется только одно. В языке МЕ нет приведения типов; типы операндов в операторе или присваивании просто должны совпадать для предотвращения синтаксических ошибок. 34.8. Язык Наз1сеИ Язык Найей (Тйошрзоп, 1996) похож на язык МЕ тем, что в нем используется аналогичный синтаксис, статический обзор ланных, строго определенные типы и тот же метод вывода типов. В отличие от языка М)., Найей является чисто функциональным языком; ои не имеет переменных и операторов присваивания, не допускает побочных эффектов и не имеет никаких императивных свойств.
Это отличает его от почти всех других языков программирования. Две следующие характеристики языка Найей отличают его от языка МЬ. Во-первых, он использует другой способ вычислений, называемый "ленивым" вычислением (1аху еча1цайоп), при котором подвыражения не вычисляются, пока не возникнет необходимость в их значениях. Во-вторых, язык Найей имеет метод определения списков, допускающий бесконечные списки. Такие списки называются полными списками (!В! сошргейепзюпз). Некоторые свойства язык Найей унаследовал от языка М !гапда (Тцгпег, 1986).
Код в этом разделе написан на версии 1.4 языка Найей. рассмотрим следующее определение функции, вычисляющей факториал. Заметим, что синтаксис определения функции и ее применения заключается в том, что имя функции приписывается рядом с параметрами: йасс О 1 гасе и = и * йасс (п — 1) Этот пример показывает, что определения функций могут содержать более одной строки, причем эти строки определяют версии функции для различных видов действительных параметров.
Соответствующее значение выражения, вычисляемого функцией и стоящего в правой части определения, выбирается путем сопоставления образцов фактических и формальных параметров. Формальные параметры, являющиеся константами. очевидно совпадают сами с собой в качестве фактических параметров. Имя в образце формального параметра соответствует фактическому параметру, не совпадающему с образцом константы. Соответствующее значение фактического параметра затем используется как значение имени в соответствующем выражении, стоящем в правой части определения. В приведенном выше примере функция определена частично, поскольку она не может вычисляться при отрицательных параметрах. Используя сравнение образцов, определим функцию для вычисления п-го числа Фибоначчн следующим образом: гзЬ О 1 ГЗЬ : = 1 Е1Ь (и + 2) Г1Ь (и + 1) + ГТЬ и Глава 14.