Визуальные инструменты для работы с родовыми функциями

В заключение данной главы рассмотрим визуальные инструменты, которые предоставляет CLIPS для работы с родовыми функциями (подробное описание функций и команд для работы с родовыми функциями и их методами см. в гл. /5 и 16).

Для работы с родовыми функциями Windows-версия среды CLIPS предос­тавляет инструмент — Defgeneric Manager (Менеджер родовых функций). Для его запуска выберите пункт Defgeneric Manager в меню Browse. Соот­ветствующий пункт в меню недоступен, если в данный момент в среде не определена ни одна родовая функция. Общий вид менеджера представлен на рис. 10.1.

Рис. 10.1. Окно менеджера родовых функций

Общее количество родовых функций отображается в заголовке окна менед­жера — Defgeneric Manager — 2 Items. С помощью этого инструмента вы можете удалить родовую функцию из системы (кнопка Remove), вывести на экран ее определение (кнопка Pprint), установить режим просмотра вызова отдельной функции и вызвать менеджер методов для заданной функции (кнопка Methods).

Учтите, что удаление родовой функции приводит к удалению всех ее ме­тодов.

Для тренировки использования родовых функций и менеджера родовых функций очистите CLIPS и добавьте в него методы, приведенные в приме­ре 10.11.

Пример 10.11. Перегрузка функции +

(defmethod + ((?a INTEGER (>?а 0)) (?b INTEGER (>?b 0)))

(call-next-method))

(defmethod + ((?a INTEGER) (?b FLOAT))

(call-next-method))

(defmethod + ((?a FLOAT) (?b FLOAT))

(call-next-method))

(defmethod + ((?a STRING) (?b STRING))

(str-cat?a?b))

Обратите внимание на реализацию методов для сложения чисел. После проверки своих аргументов они просто вызывают системную функцию +. Если бы мы вместо вызова (call-next-method) использовали системную функция + напрямую (+?а?b), то получили бы бесконечную рекурсию, которая привела бы к переполнению стека и аварийному завершению про­граммы.

Попробуйте несколько раз вызвать функцию + с различными аргументами:

Пример 10.12. Тестирование родовой функции +

(+ "Hello " "World")

(+ 1 3)

(+ 1 3.5)

(+ 1.5 3)

(+ 1 -3)

(+ 1.5 3.0)

(+ 1.5 3.0 5.0)

(+"Hello " "World" "!!!")

(+ 1 3.5 4)

Полученный результат должен соответствовать приведенному на рис. 10.2.

Обратите внимание, что для вызовов (+ 1.5 3), (+ 1 -3), (+ 1.5 3.0 5.0), (+ 1 3.5 4) применяется вызов системной функции +, т. к. мы не опреде­лили методов, способных принять такие аргументы, но, тем не менее, мы получили корректные ответы. Родовое связывание не смогло подобрать ме­тод, применимый к вызову (+"Hello " "World" "!!!") (наша функция для конкатенации строк принимает строго два аргумента), поэтому мы получи­ли соответствующее сообщение об ошибке.

Установите режим отображения вызова родовой функции с помощью ме­неджера и попробуйте еще раз повторить вызовы, приведенные выше. Об­ратите внимание на сообщения о вызовах родовой функции.

Рис. 10.2. Результаты тестирования родовой функции +

Рис. 10.3. Окно менеджера методов родовой функции

Defmethod-Handler Manager (Менеджер методов родовой функции) — еще один инструмент, предоставляемый CLIPS. Внешний вид этого инструмента представлен на рис. 10.3. Этот инструмент выводит на экран список мето­дов родовой функции, указанной менеджером родовых функций. Список методов сортируется по приоритету, установленному для этих методов. Общее количество методов заданной родовой функции отображается в заголовке окна менеджера — Defmethod-Handler Manager — 5 Items (in precedence order).

С помощью менеджера методов вы можете удалить некоторый метод (кнопка Remove), вывести на экран его определение (кнопка Pprint) или устано­вить режим просмотра вызовов отдельного метода. Обратите внимание, что метод, неявно определенный системой, например метод, представляющий системную функцию +, не может быть удален.

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

Пример 10.13. Тестирование родовой функции +

(+ "Hello " "World")

(+ 1 3)

(+ 1 3.5)

(+ 1 -3)

Результат этих действий представлен на рис. 10.4.

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

Рис. 10.4. Результаты тестирования родовой функции +

В случае если вы хотите установить режим просмотра вызовов всех методов или всех родовых функций, воспользуйтесь диалоговым окном Watch Options из меню Execution. Установите флажки в полях Generic Functions или/и Methods, как показано на рис. 10.5.

Рис. 10.5. Установка режима отображения вызовов родовых функций и методов

В данной главе была описана такая конструкция языка CLIPS, как родовые функции, методы их создания, приемы и способы использования, а также алгоритм родового связывания, делающий возможным функционирование родовых функций. Как вы успели заметить, в качестве ограничения типов для аргументов методов родовых функций используются классы. Внутренние классы CLIPS, а также объектно-ориентированный язык COOL (расширение CLIPS) будут рассмотрены в следующей главе.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: