Визуальные инструменты для работы с родовыми функциями
В заключение данной главы рассмотрим визуальные инструменты, которые предоставляет 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) будут рассмотрены в следующей главе.
|