Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[0]

Введение в Стандартный ML

• ML является функциональным языком программирования. Функции являются полноправными объектами: они могут передаваться в качестве аргументов, вырабатываться в качестве результата и храниться в переменных. Основной способ организации управления в программах на ML - рекурсивное применение функций.

жение анализируется, компилируется и исполняется, и значение, полученное в результате исполнения предложения, вместе с его типом выдается пользователю.

мое выражение имеет тип, который автоматически определяется компилятором. Строгая типизация гарантирует, что в период исполнения не может возникнуть ошибок в согласовании типов.1

ложение языка обладает однозначно определяемой наиболее общей типизацией, которая определяет контексты, в которых предложение может быть использовано.

пы - весьма полезный механизм в модульном программировании. Новые типы данных могут быть определены вместе с набором операций над значениями этих типов. Детали внутренней структуры

1 Заметим, что ошибки такого рода - весьма распространенная вещь, и диагностика их на этапе компиляции заметно облегчает отладку программы. (Прим. перев.)


ГЛАВА 1. ВВЕДЕНИЕ

значений и реализации операций скрыты от программиста, использующего данные абстрактного типа; высокая степень изоляции дает существенные преимущества при разработке и сопровождении больших программ.

• В ML области действия идентификаторов определяются статически. Смысл всех идентификаторов в программе определяется статически, что позволяет создавать более модульные и более эффективные программы.

ключителъных событий. Механизм обработки исключительных событий является удобным средством описания действий в ненормальных ситуациях, возникающих в период исполнения программы.

вающие возможность разработки больших программ по частям. Программа на ML строится как набор взаимозависимых структур, связываемых друг с другом с помощью функторов. Раздельная компиляция осуществляется посредством экспорта и импорта функторов.

Стандартный ML является новейшим из семейства языков, берущих свое начало от языка ML, разработанного в Эдинбурге Майком Гордоном, Робином Милнером и Крисом Уодсвортом в середине 70-х годов [4]. С тех пор возникло много диалектов и реализаций, как в самом Эдинбурге, так и в других местах. Стандартный ML основывается на синтезе многих идей, воплощенных в различных вариантах языка (из которых в первую очередь следует отметить диалект, разработанный Лукой Кар-делли [3]), и на идеях функционального языка НОРЕ, разработанного Родом Берстелом, Дэйвом Мак-Квином и Доном Санёлла [2]. Последнее добавление в язык - модульная структура, предложенная Дэйвом Мак-Квином в [6].

Эти лекции являются неформальным введением в язык, описывающим его возможности и способы использования, и не должны рассматриваться как формальное описание Стандартного ML. Они писалась и переписывалась в течение нескольких лет, и сейчас нуждаются в некоторой переработке с целью отразить изменения, произошедшие в языке, и опыт его использования. Поэтому автор будет рад любым предложениям от читателей по этому вопросу.

Формальное определение Стандартного ML имеется в [7]. Несколько менее формальное (и несколько устаревшее) описание имеется в Отчете Эдинбургского университета [5]. Для детального знакомства с языком читателю следует обратиться к его формальному определению.


Глава 2

Ядро языка

2.1 Работа с ML в режиме диалога

Практически все реализации ML являются интерактивными; они основываются на диалоге типа "прочесть-вычислить-напечатать" (хорошо знакомому пользователям LISP). В процессе такого диалога пользователь вводит выражение, ML-система его анализирует, компилирует, выполняет и выдает результат на терминал1.

Вот образец диалога:

> 5 : int

ML запрашивает ввод с помощью "- "и предваряет вывод "> ". Пользователь вводит фразу "3+2". ML вычисляет выражение и печатает его значение, "5", вместе с типом значения, "int".

В процессе диалога могут возникать различные виды ошибок. В основном они распадаются на три категории: синтаксические ошибки, ошибки в согласовании типов и ошибки времени исполнения. Вероятно, вы знакомы с синтаксическими ошибками и ошибками времени исполнения по вашему опыту работы с другими языками программирования. Приведем пример того, что происходит, когда введена синтаксически неправильная фраза:

-let х=3 in х end;

Parse error: Was expecting "in" in ... let <?> x ...

Ошибки времени исполнения (как, например, деление на 0) являются одним из видов исключительных событий (подробно они будут рассмот-

1 Детали интерактивной работы с ML-системой меняются от одной реализации к другой, но "дух" общения одинаков во всех известных автору системах. Примеры в настоящей книге подготовлены с использованием Эдинбургского компилятора 1988 года.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32]