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


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




Дата добавления: 2021-12-14; просмотров: 344;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.