Рекомендации по использованию родовых функций

Запуск родовых функций требует от системы больших манипуляций, чем вызов системных функций или функций, определенных с помощью конст­руктора deffunction. Это происходит потому, что CLIPS должен сначала исследовать аргументы родовой функции и определить, какой из ее методов применим в данном случае. Вызов родовой функции может быть на 15—20% медленнее вызова обычной функции. Поэтому не используйте родовые функции в операциях, для которых время критично. Например, не вызы­вайте родовую функцию в цикле, если это возможно.

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

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

Создание родовой функции

Родовая функция состоит из заголовка (подобного предварительному объяв­лению функции) и нескольких методов (число которых теоретически может быть равным нулю). Заголовок родовой функции может быть либо явно оп­ределен пользователем, либо не явно объявлен определением метода. Объ­явление метода состоит из 6 элементов:

Ø имя (которое отображает, к какой основной функции относится метод);

Ø необязательный индекс;

Ø необязательные комментарии;

Ø набор ограничений для параметров;

Ø необязательный групповой параметр для обработки переменного числа аргументов;

Ø последовательность действий или выражений, которые будут выполнены в заданном порядке в момент вызова метода.

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

Определение 10.1. Синтаксис конструктора defgeneric

(defgeneric <имя-функции>

[комментарии])


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



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