HUGS 98/Основы работы с HUGS 98

После запуска ИС HUGS 98 на экране появляется диалоговое ок¬но среды разработчика, автоматически загружается спе¬ци¬аль¬ный файл предопределений типов и определений стандартных функ¬ций на языке Haskell (Prelude.hs) и выводится стандартное при¬глашение к работе. Диалоговое окно среды разработчика состоит из главного ме¬ню, набора кнопок для быстрого доступа к наиболее часто ис¬поль¬зуемым командам и консоли, где происходит работа с ин¬тер¬претатором. Необходимо особо отметить, что ИС не поз¬во¬ля¬ет создавать и редактировать файлы с кодами программ, для это¬го требуется использование любого текстового редактора, под¬дер¬живающего обычный стандарт TXT (этим редактором, нап¬ри¬мер, может быть стандартный блокнот Windows).

Рис. 1. Главное окно ИС HUGS 98 Главное окно HUGS 98 (рис. 1) обеспечивает доступ ко всем ко¬мандам ИС, используемым для интерпретации и отладки про-г¬рамм. Кроме того, ИС позволяет вызвать на редактирование от¬крытые модули в стандартном окне Notepad, встроенном в опе¬рационную систему Windows любой версии. 2.1. Панель инструментов HUGS 98 На панели инструментов, находящейся слева на главном ди¬а¬ло¬говом окне, предоставлены кнопки, при помощи которых мож¬но вызвать наиболее часто используемые в процессе раз¬ра¬бот¬ки команды (конечно, с точки зрения разработчиков ИС HUGS 98, а не с точки зрения конечного пользователя). Ниже пред¬ставлены краткие описания всех четырнадцати кнопок, ко¬то¬рые можно найти на панели инструментов.

Загрузка модулей из внешних файлов. Позволяет выб¬рать и открыть файл, из которого загружаются все мо¬ду¬ли, обнаруживаемые интерпретатором в этом файле.

Вызов менеджера модулей. Менеджер модулей поз¬во¬ля¬ет добавлять, удалять и редактировать загруженные в па¬мять ИС программные модули.

Вырезать выделенный текст. Стандартная функция ре¬дак¬тирования текстов. Удаляет из редактора выделенный текст и помещает его в буфер обмена операционной сис¬те¬мы.

Скопировать выделенный текст в буфер обмена. Стан¬дартная функция редактирования текстов. Копирует вы¬деленный текст в буфер обмена операционной сис¬те¬мы.

Вставить текст из буфера обмена. Стандартная функ¬ция редактирования текстов. Вставляет в редактируемый тест содержимое буфера обмена операционной системы.

Очистить выбранный текст. Стандартная функция ре¬дак¬тирования текстов. Удаляет из редактора выделенный текст, не помещая его в буфер обмена операционной сис¬темы.

Запустить внешний редактор текста. Запускает внеш¬ний тектовый редактор, зарегистрированный в опе¬ра¬ци¬он¬ной системе. Для семейства Windows при нажатии на эту кнопку запускается стандартная программа Notepad.

Запуск на выполнение выражения «main». Исполняет функ¬цию main в загруженных модулях (конечно, если та¬кая функция обнаружена в модулях). Если функция main не обнаружена ни в одном из загруженных мдулей, то выдаётся ошибка: ERROR — Undefined variable "main".

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

Перезагрузка всех файлов текущего проекта. Осу¬щес¬т¬вляет перезагрузку всех файлов с целью загрузить в па¬мять интерпретатора все сделанные изменения в коде про¬екта.

Установка параметров интерпретатора. Вывод на эк¬ран диалогового окна установки набора параметров ин¬тер¬претатора языка Haskell. О параметрах ин¬тер¬пре¬та¬то¬ра подробно описано в приложении В.

Вывод на экран иерархии классов. На экране по¬яв¬ля¬ет¬ся иерархия классов текущего проекта, показанная в ви¬де множества прямоугольников с названиями (классы) и связей между ними (отношения наследования).

Вызов справки. Вызывает на экран стандартное ди¬а¬ло¬го¬вое окно справочной информации. Предполагается, что все справочные файлы присутствуют в каталоге, где ус¬тановлено ИС (эти файлы не входят в стандартную по-с¬тавку HUGS 98).

Выход из программы. Осуществляет выход из ИС HUGS 98 в операционную систему. 2.2. Команды консоли HUGS 98 Консоль ИС HUGS 98 предоставляет небольшой набор слу¬жеб¬ных конструкций, позволяющих управлять работой ИС. Мно¬гие из этих команд дублируют действия кнопок на панели ин¬струментов и некоторые пункты главного меню приложения. Од¬нако в любом случае эти команды могут позволить про¬фес¬си¬о¬нальным пользователям значительно ускорить процесс раз¬ра¬бот¬ки. Каждая команда начинается с символа «двоеточие» — «:». Это сделано для того, чтобы отличить встроенные команды от на¬писанных разработчиками функций. Кроме того, ИС поз¬во¬ля¬ет сокращать каждую команду вплоть до одной буквы, набрав толь¬ко символ «двоеточие» и собственно первую букву ко¬ман¬ды. Всего существует девятнадцать команд, ниже представлено подробное описание каждой из них.

load [<filenames>]

Загружает программные модули из заданных файлов (имена фай¬лов можно разделить пробелом). Дублирует кнопку загрузки мо¬дулей на панели инструментов. Если имена файлов от¬сут¬с¬т¬ву¬ют, то происходит выгрузка всех модулей, кроме стандартного (Prelude.hs). При повторном использовании команды все ранее заг¬руженные модули выгружаются из памяти интерпретатора.

also <filenames>

Подгружает дополнительные модули в текущий проект. Име¬на файлов должны быть разделены пробелами (если указывается бо¬лее чем один файл).

reload

Повторяет последнюю выполненную команду загрузки (:load). Позволяет быстро выполнить перезагрузку модуля в слу¬чае, если он редактируется во внешнем текстовом редакторе.

project <filename>

Загружает и использует файл проекта. Загрузить можно толь¬ко один файл. Файлы проекта используются для объединения раз¬розненных файлов с кодом. При повторном использовании ко¬манды происходит выгрузка всех файлов (как проектных, так и обычных) из памяти интерпретатора.

edit [<filename>]

Вызывает внешний текстовый редактор для исправления ука¬зан¬ного файла. Если имя файла не указано, то на ре¬дак¬ти¬ро¬ва¬ние вызывается последний файл (загруженный или ре¬дак¬ти¬ро¬ван¬ный). Данная команда дублирует кнопку вызова внешнего тек¬стового редактора на панели инструментов.

module <module>

Устанавливает заданный модуль в качестве текущего для вы¬пол¬нения функций. Эта команда предназначена, в первую, оче¬редь для разрешения коллизий имён. <expr> Запуск заданного выражения на выполнение. Например, ко¬ман¬да main запустит на выполнение соответствующую функцию — main, что произведёт дублирование кнопки с панели ин¬с¬т¬ру¬мен¬тов.

type <expr>

Выводит на экран тип заданного выражения. Эта команда ис¬поль¬зуется главным образов в отладочных целях для быстрого по¬лучения типа создаваемого выражения (переменной, функции, слож¬ного объекта).

?

Выводит на экран список команд с кратким описанием.

set [<options>]

Позволяет задать параметры ИС с командной строки. Дуб¬ли¬ру¬ет действие диалогового окна настройки HUGS 98 (описание ко¬торого приведено в приложении В). Все возможные па¬ра¬мет¬ры этой команды (<options>) выводятся на экран при вы¬пол¬не¬нии этой команды без каких-либо параметров.

names [pat]

Выводит на экран список всех имён объектов, которые на¬хо¬дят¬ся в текущем (если не задано иное) пространстве имён.

info <names>

Выводит на экран описание заданных имён объектов. На¬при¬мер, для функций выводит их тип вместе с именем заданной фун¬кции.

browse <modules>

Выводит на экран список всех объектов (функций, пе¬ре¬мен¬ных, типов), определённых в заданных модулях. Имена модулей дол¬жны быть разделены пробелом (в случае, если указано более од¬ного имени модуля).

find <name>

Вызывает на редактирование модуль, содержащий заданное имя. Если заданного имени нет ни в одном из текущих модулей, то выдаётся собщение об ошибке: ERROR — No current de¬fi¬ni¬ti¬on for name "<name>".

!<command>

Выходит в операционную систему и выполняет заданную ко¬ман¬ду. Необходимо особо отметить, что между символом «вос¬кли¬цательный знак» и именем команды операционной системы дол¬жен отсутствовать пробел.

cd <directory>

Изменяет текущий каталог, с которым работает HUGS 98.

gc

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

version

Выводит на экран информацию о версии установленного ин¬тер¬претатора языка Haskell и ИС HUGS 98.

quit

Осуществляет выход в операционную систему. Дублирует кноп¬ку на панели инструментов. 2.3. Дополнительные возможности для отладки ИС HUGS 98 предоставляет разработчику несколько до¬пол¬ни¬тельных возможностей для отладки программ, которые во мно¬гих случаях облегчают разработку и позволяют более об¬шир¬но «оглядеть» созданное приложение. К таким до¬пол¬ни¬тель¬ным возможностям относятся просмотр классов, просмотр за¬ре¬гис¬трированных имён объектов, просмотр конструкторов типов и просмотр иерархии классов. Далее подробно рассматривается каждая из этих дополни-тельных возможностей, однако перед этим необходимо разъяс-нить значения обозначений, применяемых во всех инструментах по просмотру. Итак, к таким обозначениям относятся разно-цветные пиктограммы прямоугольного формата с определённой буквой внутри. Всего таких пиктограмм девять: • Синий прямоугольник с буквой C — обозначение класса (от английского class). • Красный прямоугольник с буквой I — обозначение эк¬зем¬пля¬ра класса (от английского instance). • Розовый прямоугольник с буквой M — обозначение функ¬ции-члена класса (от английского member). • Синий прямоугольник с буквой N — обозначение имени функ¬ции (от английского name). • Красный прямоугольник с буквой P — обозначение при¬ми¬тива (от английского primitive). Примитив отличается от обыч¬ной функции тем, что его определения нет в файле, а встро¬ено в интерпретатор. Примитивы присутствуют только в файле Prelude.hs. • Зелёный прямоугольник с буквой C — обозначение кон¬с¬т¬рук¬тора типа (от английского constructor). • Синий прямоугольник с буквой D — обозначение типа дан¬ных (от английского data). • Красный прямоугольник с буквой S — обозначение встро¬ен¬ного типа. • Розовый прямоугольник с буквой N — обозначение опи¬са¬ния нового типа (от английского new type). 2.3.1. Просмотр классов При помощи инструмента для просмотра классов разработчик мо¬жет изучить список созданных классов, список функций-чле¬нов каждого класса (если они есть) и список экземпляров каж¬до¬го класса (также, если они есть). Внешний вид этого ин¬с¬т¬ру¬мен¬та можно видеть на следующем рисунке:

Рис. 2. Диалоговое окно просмотра классов В левом столбце представлен список созданных классов. При вы¬делении какого-то определённого класса в правом поле по¬яв¬ля¬ется список функций-членов класса, а в нижнем поле — спи¬сок экземпляров класса. В поле «Superclasses» появляются ба¬зо¬вые классы для выделенного класса (если они есть). Это диалоговое окна предоставляет возможность ав¬то¬ма¬ти¬чес¬кого перехода на описание выделенного класса или вы¬де¬лен¬но¬го экземпляра класса для их редактирования (при ис¬поль¬зо¬ва¬нии кнопок «Edit class» и «Edit instance» соответственно). Кроме то¬го, можно перейти к просмотру иерархии классов (при по¬мо¬щи нажатия на кнопку «Hierarchy»). 2.3.2. Просмотр зарегистрированных имён объектов При помощи инструмента для просмотра зарегистрированных имён объектов программист может изучить список всех имён, встре¬чающихся во всех загруженных модулях. К именам от¬но¬сят¬ся имена функций, имена примитивов (тех функций, ре¬а¬ли¬за¬ция которых зашита внутри интерпретатора), имена кон¬с¬т¬рук¬то¬ров данных и имена функций-членов классов. Внешний вид это¬го инструмента представлен на рис. 3.

Рис. 3. Диалоговое окно просмотра имён В верхнем поле представлен список всех имён с со¬от¬вет¬с¬т¬ву¬ю¬щей пиктограммой, обозначающей природу имени. При по¬мо¬щи строки поиска можно осуществить инкрементный поиск по все¬му списку — при вводе очередной буквы курсор в списке пе¬ре¬мещается на первое имя, которое начинается на введённую пос¬ледовательность символов. В двух нижних полях пре¬дос¬тав¬ля¬ется дополнительная информация о выделенном имени — его тип и комментарии (если они присутствуют в описании). Это диалоговое окно предоставляет разработчику воз¬мож¬ность быстро перейти к редактированию выделенного имени при помощи нажатия на кнопку «Edit name». 2.3.3. Просмотр конструкторов типов При помощи инструмента для просмотра конструкторов ти¬пов разработчик может изучить список всех конструкторов, ко¬то¬рые встречаются во всех загруженных модулях. К кон¬с¬т¬рук¬то¬рам относятся конструкторы данных (служебное слово data), опи¬сания встроенных типов (служебное слово type) и кон¬с¬т¬рук¬то¬ры новых типов (служебное слово newtype). Внешний вид это¬го инструмента представлен на рис. 4.

Рис. 4. Диалоговое окно просмотра конструкторов типов В верхнем поле представлен список всех имён конструкторов ти¬пов с соответствующей пиктограммой, обозначающей при¬ро¬ду конструктора. При помощи строки поиска можно осу¬щес¬т¬вить инкрементный поиск по всему списку — при вводе оче¬ред¬ной буквы курсор в списке перемещается на первое имя, которое на¬чинается на введённую последовательность символов. В поле «Type» приводится определение соответствующего типа. В двух ниж¬них полях предоставляется информация о конструкторах и се¬лекторах выделенного типа, а также об экземплярах типа (ес¬ли они есть). При помощи этого диалогового окна разработчик может быс¬т¬ро перейти к редактированию выделенного конструктора (при на¬жатии на кнопку «Edit type») или к редактированию вы¬де¬лен¬но¬го экземпляра типа (при помощи нажатия на кнопку «Edit in-stance»). 2.3.4. Просмотр иерархии классов Просматривая иерархию классов, программист может уви¬деть отношения наследования между созданными классами. Не¬об¬ходимо отметить, что алгоритм прорисовки классов и от¬но¬ше¬ний в HUGS 98 несколько неадекватен, поэтому для более пол¬но¬го понимания от программиста требуется либо чутьё, либо спо¬собность быстро разбросать все классы по диалоговому ок¬ну, создав планарный граф. Это диалоговое окно можно вызвать не только из главного ме¬ню приложения, но и из диалогового окна для просмотра спи-с¬ка классов. На рис. 5 показана иерархия классов из файла Prelude.hs. Как вид¬но из рисунка в этом файле определены классы эк¬ви¬ва¬лен¬т¬нос¬ти (все, которые наследуют свойства класса Eq) и классы-мо¬на¬ды (Monad, Functor, Read и Bounded).

Рис. 5. Иерархия классов из файла Prelude.hs