Запуск родовых функций требует от системы больших манипуляций, чем вызов системных функций или функций, определенных с помощью конструктора deffunction. Это происходит потому, что CLIPS должен сначала исследовать аргументы родовой функции и определить, какой из ее методов применим в данном случае. Вызов родовой функции может быть на 15—20% медленнее вызова обычной функции. Поэтому не используйте родовые функции в операциях, для которых время критично. Например, не вызывайте родовую функцию в цикле, если это возможно.
Кроме того, родовые функции всегда должны иметь, по крайней мере, два метода. В случае если перегрузка функции не требуется, используйте обычные функции.
Если некоторый конструктор создается до определения родовой функции и использует системную или определенную пользователем функцию, которая впоследствии становится одним из методов родовой функции, родовое связывание не применяется. Например, если родовая функция, перегружающая функцию +, определена после правила с функцией +, то правило всегда станет вызывать системную функцию +. Однако если подобное правило будет определено после родовой функции, то при вызове функции + будет использоваться родовое связывание.
|
|
Создание родовой функции
Родовая функция состоит из заголовка (подобного предварительному объявлению функции) и нескольких методов (число которых теоретически может быть равным нулю). Заголовок родовой функции может быть либо явно определен пользователем, либо не явно объявлен определением метода. Объявление метода состоит из 6 элементов:
Ø имя (которое отображает, к какой основной функции относится метод);
Ø необязательный индекс;
Ø необязательные комментарии;
Ø набор ограничений для параметров;
Ø необязательный групповой параметр для обработки переменного числа аргументов;
Ø последовательность действий или выражений, которые будут выполнены в заданном порядке в момент вызова метода.
Ограничения параметров используются в процессе родового связывания для определения применимости метода к некоторому набору аргументов. Для создания заголовка родовой функции служит конструктор defgeneric, а для создания каждого нового метода родовой функции — конструктор defmethod.
Определение 10.1. Синтаксис конструктора defgeneric
(defgeneric <имя-функции>
[комментарии])